Попытка распараллелить внешнее l oop этого умножения матрицы на матрицу, используя OpenMP - PullRequest
0 голосов
/ 03 мая 2020

Я хочу добавить прагматические выражения в код.

//Calculating the product of the matrix
for(int i=0; i<n; i++)
{
   for(int j=0;j<n;j++)
   {
   mat_ans[i][j] = 0;
   for (int k = 0; k < n; k++) {
      mat_ans[i][j] += (mat_1[i][k] * mat_2[k][j]);
   }
   }
}

Я пытаюсь сделать свой код максимально эффективным, и я изучаю, как это сделать. , OpenMP кажется хорошим вариантом. Но я не могу заставить его работать. Любая помощь будет оценена. Я довольно новичок в c ++ 11 и просто пытаюсь учиться как можно быстрее!

1 Ответ

0 голосов
/ 03 мая 2020

Вы ищете что-то подобное?

//Calculating the product of the matrix
#pragma omp parallel for
for(int i=0; i<n; i++){
   for(int j=0;j<n;j++){
      mat_ans[i][j] = 0;
      #pragma omp simd
      for (int k = 0; k < n; k++) {
          mat_ans[i][j] += (mat_1[i][k] * mat_2[k][j]);
      }
   }
}

Если вы не знаете, как использовать openMP, посмотрите это Введение в плейлист openMp , хотя это плейлист 2013 года, большинство он по-прежнему актуален, он учит вас, как использовать большинство основных функций в openMP.

Для меня ваш код не выглядит эффективным. В коде, к которому вы обращаетесь и используете элементы массивов / векторов, вы должны стараться знать, сколько раз вы обращаетесь к определенным элементам и как это может повлиять на производительность, многие алгоритмы ограничены пропускной способностью памяти. Существует статья в Википедии, посвященная l oop оптимизации гнезд , в которой объясняются различные оптимизации, которые можно выполнить при умножении матриц на основе вложенных циклов.

После того, как вы начнете работать, попробуйте посмотрите на не обращающий внимания на кеш алгоритм для умножения матриц , этот алгоритм не требует подробностей о кеше без потери пропускной способности памяти.

Наконец, следите за целочисленным переполнением, если n> = 65537 код может сломаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...