如何使用 OpenMP 在 GPU 上分配团队?

How to distribute teams on GPU using OpenMP?

我正在尝试利用我的 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 架构有关。所以我要添加这个:

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

是的,这里有一场比赛。不同的团队正在读取和写入数组的相同元素 '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];
  }
}