【问题标题】:How to distribute teams on GPU using OpenMP?如何使用 OpenMP 在 GPU 上分配团队?
【发布时间】: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 架构有关。因此,我要添加以下内容:

我对这个话题相当陌生,所以感谢您的帮助:)

【问题讨论】:

    标签: parallel-processing openmp nvidia gpgpu 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] 它应该是无种族的。你能发布你修改过的程序吗?
    • 你是对的,存在由另一个变量引起的数据竞争。现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多