Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
v1tar
0 / 0 / 0
Регистрация: 10.10.2011
Сообщений: 8
#1

Распараллеливание циклов - C++

25.06.2013, 06:38. Просмотров 1011. Ответов 1
Метки нет (Все метки)

Возникли трудности с освоением OpenMP
Непонимаю, почему если закоментировать вот этот фрагмент кода, то программа работает вы разы быстрее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//from
#pragma omp parallel for schedule(dynamic, pieces)
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                temp[i][j] = matrix[i][j];
 
 
#pragma omp parallel for schedule(dynamic, pieces)
        for (int i = 1; i < size - 1; i++) {
            for (int j = 1; j < size - 1; j++) {
                temp[i][j] = Change(matrix, size, i, j);
            }
        }
 
//to

код программы целиком:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "stdafx.h"
#include <stdio.h>
#include <cstdlib>
#include <omp.h>
#include <time.h>
 
void PrintM(int **&matrix, int size, int i);
clock_t Run(int **&matrix, int size);
int Change(int **&matrix, int size, int i, int j);
 
int value = 1000;
 
bool more = true;
 
int _tmain(int argc, _TCHAR* argv[]) {
    int size;
 
 
    if (more) {
        size = 1000;
    }
    else {
        size = 5;
    }
 
    int **matrix = new int*[size];
 
    for (int i = 0; i < size; i++)
        matrix[i] = new int[size];
 
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++)
            matrix[i][j] = 0;
 
    for (int i = 0; i <size; i++)
    {
        matrix[i][0] = value;
        matrix[i][size - 1] = value;
        matrix[0][i] = value;
        matrix[size - 1][i] = value;
    }
 
    clock_t start = clock();
    clock_t end = Run(matrix, size);
 
    printf("%.4f\n", ((double) end - start) / ((double) CLOCKS_PER_SEC));
    getchar();
 
 
}
 
void PrintM(int **&matrix, int size, int i) {
    system("\f");
    printf("\n\nIteration: %d\n", i);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d\t", matrix[i][j]);
        }
        printf("\n");
    }
    
}
 
clock_t Run(int **&matrix, int size) {
    int **temp = new int*[size];
 
    for (int i = 0; i < size; i++)
        temp[i] = new int[size];
 
    double time = 0;
 
    int pieces;
 
    if (more)
        pieces = 25;
    else
        pieces = 2;
 
    int i = 0;
 
    int end = 100;
 
    if (more)
        end = 1000;
    
    while (i < end) {
//from
#pragma omp parallel for schedule(dynamic, pieces)
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                temp[i][j] = matrix[i][j];
 
 
#pragma omp parallel for schedule(dynamic, pieces)
        for (int i = 1; i < size - 1; i++) {
            for (int j = 1; j < size - 1; j++) {
                temp[i][j] = Change(matrix, size, i, j);
            }
        }
 
//to
 
#pragma omp parallel for schedule(dynamic, pieces)
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                matrix[i][j] = temp[i][j];
 
 
        if (!more)
            PrintM(matrix, size, i);
 
        i++;
    }
 
    for (int i = 0; i < size; ++i)
        delete [] temp[i];
    
    delete [] temp;
    temp = NULL;
 
    printf("end!\n");
    return clock();
}
 
int Change(int **&matrix, int size, int i, int j) {
    int neighs = 0;
 
    neighs += matrix[i - 1][j];
    neighs += matrix[i + 1][j];
    neighs += matrix[i][j - 1];
    neighs += matrix[i][j + 1];
 
    neighs /= 4;
    
    return neighs;
}


Добавлено через 6 часов 34 минуты
вверх
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 06:38     Распараллеливание циклов
Посмотрите здесь:

Распараллеливание циклов с ипользованием OpenMP - C++
Есть проблема , получился парадокс - время роботы программы с распараллеливанием дольше на 1 сек чем без распараллеливания, ожидалось...

OpenIM - не работает распараллеливание циклов - C++
void Multiplication(int a, int b) { int c; int i; int j; int count(0); omp_set_num_threads(count); #pragma omp...

Распараллеливание - C++
Всем добрый вечер. Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с...

распараллеливание - C++
Скажите, кто-нибудь занимался распараллеливанием в си++? В моих попытках что-либо распараллелить через omp все выходило только в несколько...

Распараллеливание вычислений - C++
Здравствуйте. Может кто сможет подсказать как мне решить следующую задачу: необходимо распараллелить следующий последовательный код:...

Распараллеливание программы - C++
Помогите эту последовательную программу распараллелить на параллельных 2 процесса. #include &lt;iostream&gt; #include&lt;thread&gt; using...

Распараллеливание алгоритмов - C++
Доброго дня всем. Встал вопрос о выборе темы,связанной с распараллеливанием алгоритмов. Какие задачи наиболее &quot;восприимчивы&quot; к...

Странное распараллеливание - C++
Добрый вечер, коллеги. У меня следующая проблема. Преподаватель сказал распараллелить программу, обрабатывающую изображения в папке....

Распараллеливание вычислений - C++
Вычисляю произведение матриц несколькими потоками (количество задаётся пользователем). Потоки &quot;засыпают&quot; на 1 мс. При вычислении...

Распараллеливание с помощью OpenMP - C++
Здравствуйте, уважаемые участники форума! Имеется цикл вида:for (i=1; i&lt;number; i++) { do something; }Цикл выполняется...

Распараллеливание через omp.h - C++
// labaOMP.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;omp.h&gt; ...

Распараллеливание программы с библиотекой TBB - C++
Всем Привет! Пытаюсь распараллелить программу, которая совершает сортировку, посмотрел в интернете много разных примеров, получилось...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FireProoF
17 / 17 / 1
Регистрация: 28.10.2012
Сообщений: 193
25.06.2013, 07:43     Распараллеливание циклов #2
Во-первых, я советую не использовать OpenMp, а посмотреть в сторону Win Api. Хоть намного тяжелее в реализации, зато скорость и надежность выше. Плюс все прелести управления потоками.
Во-вторых, если закоментировать весь код, то программа будет работать ещё быстрее)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru