0 / 0 / 0
Регистрация: 10.10.2011
Сообщений: 8
1

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

25.06.2013, 06:38. Показов 2237. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2013, 06:38
Ответы с готовыми решениями:

Распараллеливание циклов
Доброго времени суток. Возникла необходимость распараллелить один численный алгоритм средствами...

Распараллеливание циклов
Есть такой цикл std::list&lt;int&gt;::iterator iter; std::list&lt;int&gt;_paramsFFT; for(iter =...

Распараллеливание циклов с использованием OpenMP C++
Доброго времени суток. (Нужен совет, так как разбираюсь с omp почти 3 дня и не хватает знанний) ...

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

1
17 / 17 / 3
Регистрация: 28.10.2012
Сообщений: 201
25.06.2013, 07:43 2
Во-первых, я советую не использовать OpenMp, а посмотреть в сторону Win Api. Хоть намного тяжелее в реализации, зато скорость и надежность выше. Плюс все прелести управления потоками.
Во-вторых, если закоментировать весь код, то программа будет работать ещё быстрее)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 07:43
Помогаю со студенческими работами здесь

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

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

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

Распараллеливание программы
Пишу брутер и встал вопрос о добавление многопоточности. Вот у меня есть функция: std::string...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru