Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> open mp 
:(
    Опции темы
redwhite90
Дата 10.10.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



подскажите пожалуйста как можно еще распараллелить?

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

#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 просто
PM MAIL   Вверх
Silent
Дата 11.10.2012, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



Синтаксически все верно, а вот логически - никакого прироста производительности не будет. Потому как ты распараллелил внутренний цикл, и у тебя параллельно считаются 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];

Тут для оптимизации - целое раздолье =)
PM MAIL   Вверх
redwhite90
Дата 11.10.2012, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



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


но тогда ведь из массива a данные перестанут выбираться последовательно, или я что-то не так понял
PM MAIL   Вверх
Silent
Дата 11.10.2012, 09:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: нет
Всего: 9



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

почему? все так же последовательно, по строкам
PM MAIL   Вверх
redwhite90
Дата 12.10.2012, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



понял
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4368 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.