Parallel processing openMp中的团队分布
我试图将这段代码与openMP(4.5)“omp团队”和GPU(Nvidia GTX 1050)以及CUDA(9.0)并行,我证明了顺序和并行实现(CPU i5-7400)都很好,但GPU版本不起作用,代码是矩阵乘法C=a*BParallel 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>
我认为#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];