如何使用 OpenMP 在 GPU 上分配团队?
Posted
技术标签:
【中文标题】如何使用 OpenMP 在 GPU 上分配团队?【英文标题】:How to distribute teams on GPU using OpenMP? 【发布时间】:2017-10-18 22:46:47 【问题描述】:我正在尝试利用我的 Nvidia Geforce GT 740M 使用 OpenMP 和 clang-3.8 编译器进行并行编程。
当在 CPU 上并行处理时,我设法得到了想要的结果。然而,当在 GPU 上处理时,我的结果几乎是一些随机数。
因此,我认为我没有正确分配我的线程团队,并且可能存在一些数据竞争。我想我必须以不同的方式执行我的 for 循环,但我不知道错误可能出在哪里。
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc, char* argv[])
const int n =100; float a = 3.0f; float b = 2.0f;
float *x = (float *) malloc(n * sizeof(float));
float *y = (float *) malloc(n * sizeof(float));
int i;
int j;
int k;
double start;
double end;
start = omp_get_wtime();
for (k=0; k<n; k++)
x[k] = 2.0f;
y[k] = 3.0f;
#pragma omp target data map(to:x[0:n]) map(tofrom:y[0:n]) map(to:i) map(to:j)
#pragma omp target teams
#pragma omp distribute
for(i = 0; i < n; i++)
#pragma omp parallel for
for (j = 0; j < n; j++)
y[j] = a*x[j] + y[j];
end = omp_get_wtime();
printf("Work took %f seconds.\n", end - start);
free(x); free(y);
return 0;
我猜这可能与我的 GPU 架构有关。因此,我要添加以下内容:
我对这个话题相当陌生,所以感谢您的帮助:)
【问题讨论】:
【参考方案1】:是的,这里有一场比赛。不同的团队正在读取和写入数组“y”的相同元素。也许你想要这样的东西?
for(i = 0; i < n; i++)
#pragma omp target teams distribute parallel for
for (j = 0; j < n; j++)
y[j] = a*x[j] + y[j];
【讨论】:
是的,这确实解决了我的问题,谢谢。但如果我有一个数组y[i][j]
而不是 y[j]
我仍然有同样的问题。我的猜测是我必须更改迭代器。而不是+1
,迭代GPU块或类似的东西。但我真的不知道怎么做。
如果你有一个数组 y[i][j] 它应该是无种族的。你能发布你修改过的程序吗?
你是对的,存在由另一个变量引起的数据竞争。现在一切正常。以上是关于如何使用 OpenMP 在 GPU 上分配团队?的主要内容,如果未能解决你的问题,请参考以下文章
如何在多个 GPU 节点上获取分配给 SLURM 作业的 GPU ID?