Parallel processing 如何使用OpenMP在GPU上分发团队?

Parallel processing 如何使用OpenMP在GPU上分发团队?,parallel-processing,openmp,nvidia,gpgpu,gpu,Parallel Processing,Openmp,Nvidia,Gpgpu,Gpu,我正试图利用我的Nvidia Geforce GT 740M,使用OpenMP和clang-3.8编译器进行并行编程 当在CPU上并行处理时,我设法获得所需的结果。然而,当在GPU上处理时,我的结果几乎是随机数 因此,我认为我没有正确地分配线程团队,可能存在一些数据竞争。我想我必须以不同的方式进行for循环,但我不知道错误在哪里 #include <stdio.h> #include <stdlib.h> #include <omp.h> int main

我正试图利用我的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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
常数n=100;浮点a=3.0f;浮点b=2.0f;
float*x=(float*)malloc(n*sizeof(float));
float*y=(float*)malloc(n*sizeof(float));
int i;
int j;
int k;
双启动;
双端;
start=omp_get_wtime();

对于(k=0;k是的,这里有一个竞赛。不同的团队正在读取和写入数组“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];
  }
}
(i=0;i{ #pragma omp目标团队平行分发 对于(j=0;j
是的,这里有一场竞赛。不同的团队正在对数组“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];
  }
}
(i=0;i{ #pragma omp目标团队平行分发 对于(j=0;j是的,这确实解决了我的问题,谢谢。但是如果我有一个数组
y[I][j]
而不是
y[j]
,我仍然有同样的问题。我猜我必须更改迭代器。而不是
+1
,在GPU块上迭代或类似的东西。但是我真的不知道如何做。如果你有一个数组y[I][j]它应该是无种族歧视的。你能发布你修改过的程序吗?你是对的,有一个数据竞争是由另一个变量引起的。现在一切正常。是的,这确实解决了我的问题,谢谢。但是如果我有一个数组
y[I][j]
而不是
y[j]
我仍然有同样的问题。我猜我必须更改迭代器。而不是
+1
,而是在GPU块上进行迭代或类似的操作。但我真的不知道如何进行。如果你有一个数组y[I][j]它应该是无种族歧视的。你能发布你修改过的程序吗?你是对的,有一个数据竞争是由另一个变量引起的。现在一切正常了。