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

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

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

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

15.11.2013, 01:51. Просмотров 924. Ответов 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++
Вычисляю произведение матриц несколькими потоками (количество задаётся пользователем). Потоки &quot;засыпают&quot; на 1 мс. При вычислении...

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

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

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

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

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

Распараллеливание циклов - 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; }Цикл выполняется...

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

Распараллеливание программы с библиотекой TBB - C++
Всем Привет! Пытаюсь распараллелить программу, которая совершает сортировку, посмотрел в интернете много разных примеров, получилось...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2447 / 1652 / 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 минут
для распараллеливания здесь нужно разворачивать матрицу на ленты
дело это не очень сложно, но достаточно неприятное
если это дело не простого интереса, то могу прикинуть как это сделать
Ответ Создать тему
Опции темы

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