【发布时间】: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