Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > open mp


Автор: redwhite90 10.10.2012, 23:20
подскажите пожалуйста как можно еще распараллелить?

вот код перемножения двух матриц. и вообще правильно ли я распараллелил?
Код

#include <stdio.h>
#include <omp.h>
 
#define str 100
#define stlb 50

int main(int argc, char *argv[])
{
  float a[str][stlb], b[stlb][str], c[str][str];
  int i;
  omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
  omp_set_num_threads(str); // установить число потоков в 10
 
  // инициализируем массивы
  for (i = 0; i < str; i++)
  {
     for(int j=0;j<stlb;j++)
     {
         a[i][j]=i+j;
         b[j][i]=i+j+1;
     }
     for(int j=0;j<str;j++)
         c[i][j]=0;
  } 
  for(int i =0;i<str;i++)
  {
      for(int j =0;j<str;j++)
      {
          #pragma omp parallel shared(a, b, c) private(i,k,j)
          {
            #pragma omp for
            {
              for(int k=0;k<stlb;k++)
              {
                 c[i][j]+=a[i][k] * b[k][j];
              }
        
            }
         }
      }

  }
  return 0;
}


Добавлено через 37 секунд
правильно ли указал shared и private

Добавлено через 4 минуты и 51 секунду
первое знакомство с open mp просто

Автор: Silent 11.10.2012, 08:34
Синтаксически все верно, а вот логически - никакого прироста производительности не будет. Потому как ты распараллелил внутренний цикл, и у тебя параллельно считаются c[i][j]+=a[i][k] * b[k][j] - то бишь ты str*stlb раз входишь в параллельную секцию и выходишь из нее.
Надо параллелить сверху вниз:
Код

#pragma omp parallel for
    for (int i = 0; i < str; i++)
        for (int j = 0; j < stlb; j++)    
            for (int k = 0; k < str; k++)
                c[i][j] += a[i][k] * b[k][j];


Ну а если пойти чуть подальше, то еще лучше поменять два внутренних цикла местами (по j и k), тем самым изменишь паттерн доступа к памяти (из массива b данные станут выбираться последовательно).
Код

#pragma omp parallel for
    for (int i = 0; i < str; i++)
        for (int k = 0; k < str; k++)
            for (int j = 0; j < stlb; j++)    
                c[i][j] += a[i][k] * b[k][j];

Тут для оптимизации - целое раздолье =)

Автор: redwhite90 11.10.2012, 08:46
спасибо за ответ.
Цитата(Silent @  11.10.2012,  08:34 Найти цитируемый пост)
Ну а если пойти чуть подальше, то еще лучше поменять два внутренних цикла местами (по j и k), тем самым изменишь паттерн доступа к памяти (из массива b данные станут выбираться последовательно).


но тогда ведь из массива a данные перестанут выбираться последовательно, или я что-то не так понял

Автор: Silent 11.10.2012, 09:04
Цитата(redwhite90 @  11.10.2012,  08:46 Найти цитируемый пост)
но тогда ведь из массива a данные перестанут выбираться последовательно, или я что-то не так понял 

почему? все так же последовательно, по строкам

Автор: redwhite90 12.10.2012, 21:46
понял

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)