Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

25.06.2013, 06:38. Просмотров 1077. Ответов 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 минуты
вверх
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 06:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распараллеливание циклов (C++):

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

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

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

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

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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