Parallel processing openMp中的团队分布

Parallel processing openMp中的团队分布,parallel-processing,openmp,gpu,Parallel Processing,Openmp,Gpu,我试图将这段代码与openMP(4.5)“omp团队”和GPU(Nvidia GTX 1050)以及CUDA(9.0)并行,我证明了顺序和并行实现(CPU i5-7400)都很好,但GPU版本不起作用,代码是矩阵乘法C=a*B 我认为#pragma omp目标团队并行分发的方式不正确 但我不知道错误在哪里 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <omp.h>

我试图将这段代码与openMP(4.5)“omp团队”和GPU(Nvidia GTX 1050)以及CUDA(9.0)并行,我证明了顺序和并行实现(CPU i5-7400)都很好,但GPU版本不起作用,代码是矩阵乘法C=a*B
我认为#pragma omp目标团队并行分发的方式不正确 但我不知道错误在哪里

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>

int main(int argc, char **argv)
{
   int n;//Given by the user
   int i, j, k;
    double start, end;

   for (i=0; i<n; i++) 
      for (j=0; j<n; j++) {
         a[i][j] = ((double)rand())/((double)RAND_MAX);
         b[i][j] = ((double)rand())/((double)RAND_MAX);
         c[i][j] = 0.0;
      }


   start = omp_get_wtime();
   #pragma omp target data map(to: a[0:i][0:k], b[0:k][0:j]) map(tofrom:c[0:i][0:j]) 
   #pragma omp target teams distribute parallel for
   for (i=0; i<n; i++){ 

      for (k=0; k<n; k++) { 

         for (j=0; j<n; j++) {
            c[i][j] += a[i][k]*b[k][j];
         }
     }
  }
    #pragma omp barrier
    end = omp_get_wtime();
    printf("the total time is %5.9f\n", end - start);


   //check a random element if d - c[i][j]) equals 0 the implementation is correct
   i = rand()%n;
   j = rand()%n;
   double d = 0.0;
   for (k=0; k<n; k++)
      d += a[i][k]*b[k][j];


   printf("Check on a random element: %18.9lE\n", fabs(d-c[i][j]));

   return 0;

}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int n;//由用户给定
int i,j,k;
双起点,双终点;

对于(i=0;i问题的解决方案很可能是将k和j声明为私有变量

其他一些评论:

  • 您可能需要更改循环顺序,反转k和j上的循环,这样您将能够折叠两个外部循环
  • 代码中不需要显式屏障,在omp目标区域的末尾已经有一个隐式屏障
  • 我建议您计算总残差,以检查您的实现是否正确

#pragma-omp目标数据映射(to:a[0:n][0:n],b[0:n][0:n])映射(tofrom:c[0:n][0:n])
#pragma omp目标团队为私有(i,j,k)崩溃并行分发(2)
对于(i=0;i
#pragma omp target data map(to: a[0:n][0:n], b[0:n][0:n]) map(tofrom:c[0:n][0:n]) 
#pragma omp target teams distribute parallel for private(i,j,k) collapse(2)
for (i=0; i<n; i++)
  for (j=0; j<n; j++)
    for (k=0; k<n; k++)
        c[i][j] += a[i][k]*b[k][j];