如何使用 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 上分配团队?的主要内容,如果未能解决你的问题,请参考以下文章

并行计算——OpenMP加速矩阵相乘

如何在多个 GPU 节点上获取分配给 SLURM 作业的 GPU ID?

NUMA 处理器上的 OpenMP 内存分配

使用 openMP 和 openACC 的多线程多 GPU 计算

OpenMP 运行时看不到我的 GPU 设备

我是不是必须在 Ubuntu 18.04 上从源代码构建 gcc-10 才能卸载 OpenMP GPU 目标?