最近,GCC 社区做出了一些努力,在其编译器中支持 OpenACC。所以我想尝试一下。
使用这个接近 GCC 网站上主要文档的分步教程 ( tutorial ),我能够在 OpenACC 支持下编译和构建 GCC 6.1。
然后,我使用以下命令编译了我的程序:
gcc pi.c -fopenacc -foffload=nvptx-none -foffload="-O3"-O3
而且,一切顺利,没有任何错误。
执行没有错误,但没有正确答案。
这是我的 C 代码和运行程序的输出:
#include <stdio.h>
#include <openacc.h>
#define N 20000
#define vl 1024
int main(void) {
double pi = 0.0f;
long long i;
int change = 0;
printf("Number of devices: %d\n", acc_get_num_devices(acc_device_nvidia));
#pragma acc parallel
{
change = 1;
#pragma acc loop reduction(+:pi) private(i)
for (i=0; i<N; i++) {
double t= (double)((i+0.5)/N);
pi +=4.0/(1.0+t*t);
}
}
printf("Change: %d\n", change);
printf("pi=%11.10f\n",pi/N);
pi = 0.0;
for (i=0; i<N; i++) {
double t= (double)((i+0.5)/N);
pi +=4.0/(1.0+t*t);
}
printf("pi=%11.10f\n",pi/N);
return 0;
}
这是运行a.out
后的输出:
Number of devices: 1
Change: 0
pi=0.0000000000
pi=3.1415926538
有什么想法吗?
最佳答案
尝试“平行”移动到循环而不是 block 。
// #pragma acc parallel
{
change = 1;
#pragma acc parallel loop reduction(+:pi)
for (i=0; i<N; i++) {
double t= (double)((i+0.5)/N);
pi +=4.0/(1.0+t*t);
}
}
我刚刚用 gcc 6.1 尝试过,它工作正常。请注意,无需将“i”私有(private)化,因为默认情况下标量是私有(private)的。
关于nvidia - gcc - openacc - 编译的程序无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38796020/