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

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

Восстановить пароль Регистрация
 
ShishkOff92
Сообщений: n/a
15.11.2013, 01:51     Распараллеливание вычислений #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);
}
Но при сравнении результатов, элементы одной из строк матрицы не совпадали с элементами исходной на двух процессах. На трех процессах не совпадали две строки, на чётырёх три.... Может быть кто нибудь сможет подсказать, как лучше распаралеллить её и подсказать, как это сделать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 01:51     Распараллеливание вычислений
Посмотрите здесь:

Распараллеливание C++
Распараллеливание с помощью OpenMP C++
Распараллеливание алгоритмов C++
распараллеливание C++
Распараллеливание арифметических выражений C++
Распараллеливание циклов C++
Распараллеливание вычислений C++
C++ Странное распараллеливание

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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 минут
для распараллеливания здесь нужно разворачивать матрицу на ленты
дело это не очень сложно, но достаточно неприятное
если это дело не простого интереса, то могу прикинуть как это сделать
Yandex
Объявления
15.11.2013, 15:30     Распараллеливание вычислений
Ответ Создать тему
Опции темы

Текущее время: 17:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru