Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
ShishkOff92
0 / 0 / 0
Регистрация: 11.11.2013
Сообщений: 1
1

Распараллеливание вычислений

15.11.2013, 01:51. Просмотров 1219. Ответов 1
Метки нет (Все метки)

Здравствуйте. Может кто сможет подсказать как мне решить следующую задачу: необходимо распараллелить следующий последовательный код:
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
#include <stdio.h>
#include <stdlib.h>
 
#define ISIZE  400
#define JSIZE  400
 
 
int main(int argc, char **argv)
{
   
   double a[ISIZE][JSIZE];
   int i, j;
   FILE *ff;
 
   for (i=0; i<ISIZE; i++){
      for (j=0; j<JSIZE; j++){
           a[i][j] = 10*i +j;
      }
   }
   
   for (i=1; i<ISIZE; i++){
      for (j = 0; j < JSIZE-1; j++){
          a[i][j] = sin(0.00001*a[i-1][j+1]); 
      }
   }
   
   ff = fopen("aaas","w");   
   for(i=0; i < ISIZE; i++){
     for (j=0; j < JSIZE; j++){
         fprintf(ff,"%f ",a[i][j]);
     }
     fprintf(ff,"\n");
   }     
   fclose(ff);
}

Я попытался распаралеллить следующим образом:
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
 
#define ISIZE  400
#define JSIZE  400
 
 
int main(int argc, char **argv)
{
 
   double a[ISIZE][JSIZE];
   int i, j;
   FILE *ff;
   int thread_num = 2;
 
 
   double start = omp_get_wtime();
 
   /*for (i=0; i<ISIZE; i++){
      for (j=0; j<JSIZE; j++){
           a[i][j] = 10*i +j;
      }
   }
 
   for (i=1; i<ISIZE; i++){
      for (j = 0; j < JSIZE-1; j++){
               a[i][j] = sin(0.00001*a[i-1][j+1]);
      }
   }*/
 
 
 
   #pragma omp parallel for shared(a) private(i,j) num_threads (thread_num)
    for (i=0; i<ISIZE; i++){
      for (j=0; j<JSIZE; j++){
           a[i][j] = 10*i +j;
      }
   }
 
 
   #pragma omp parallel for shared(a) private(i,j) num_threads (thread_num)
   for (i=1; i<ISIZE; i++){
      for (j = 0; j < JSIZE-1; j++){
               //a[ISIZE][0] = 10*ISIZE;
               a[i][j] = sin(0.00001*a[i-1][j+1]);
      }
   }
 
 
 
   double finish = omp_get_wtime();
 
   printf("time =%g\n",  finish-start);
 
 
   ff = fopen("aaas22","w");
   //#pragma omp parallel for shared(a) private(i) num_threads (thread_num)
   for(i=0; i < ISIZE; i++){
         //#pragma omp barrier
     for (j=0; j < JSIZE; j++){
         fprintf(ff,"%f ",a[i][j]);
     }
     fprintf(ff,"\n");
   }
   fclose(ff);
 
   //double finish = omp_get_wtime();
 
   //printf("time =%g\n",    finish-start);
}
Но при сравнении результатов, элементы одной из строк матрицы не совпадали с элементами исходной на двух процессах. На трех процессах не совпадали две строки, на чётырёх три.... Может быть кто нибудь сможет подсказать, как лучше распаралеллить её и подсказать, как это сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 01:51
Ответы с готовыми решениями:

Распараллеливание вычислений
Вычисляю произведение матриц несколькими потоками (количество задаётся...

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

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

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

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

1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
15.11.2013, 15:30 2
Цитата Сообщение от ShishkOff92 Посмотреть сообщение
C++
1
2
#pragma omp parallel for shared(a) private(i,j) num_threads (thread_num) 
for (i=0; i<ISIZE; i++){ for (j=0; j<JSIZE; j++){ a[i][j] = 10*i +j; } }
здесь все ок - у каждого потока есть своя диагональ/несколько диагоналей, поэтому они не конфликтуют
Цитата Сообщение от ShishkOff92 Посмотреть сообщение
C++
1
2
3
4
5
6
7
   #pragma omp parallel for shared(a) private(i,j) num_threads (thread_num)
   for (i=1; i<ISIZE; i++){
      for (j = 0; j < JSIZE-1; j++){
               //a[ISIZE][0] = 10*ISIZE;
               a[i][j] = sin(0.00001*a[i-1][j+1]);
      }
   }
здесь это не так - за счет (i-1) и (j+1) есть ощущение, что разные потоки могут работать с одними и теми же данными, тоесть в ходу идут race condition'ы
надо прикидывать как правильно распараллелить второй случай
я бы для начала проверил, что в нем дело (убрав omp'ную директиву и сверив)

Добавлено через 13 часов 28 минут
для распараллеливания здесь нужно разворачивать матрицу на ленты
дело это не очень сложно, но достаточно неприятное
если это дело не простого интереса, то могу прикинуть как это сделать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 15:30

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

Распараллеливание алгоритмов
Доброго дня всем. Встал вопрос о выборе темы,связанной с распараллеливанием...

Распараллеливание программы
Помогите эту последовательную программу распараллелить на параллельных 2...


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

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

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