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

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

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

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

15.11.2013, 01:51. Просмотров 1082. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распараллеливание вычислений (C++):

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

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

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

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

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

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

1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 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
Привет! Вот еще темы с ответами:

Распараллеливание циклов - C++
Возникли трудности с освоением OpenMP Непонимаю, почему если закоментировать вот этот фрагмент кода, то программа работает вы разы...

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

Распараллеливание арифметических выражений - C++
Здравствуйте. Есть задача - распараллелить вычисление арифмитического выражения, подобное виду (a+b)+(c+(d+e+f))+h т.е....

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


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

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

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