gcc-编译的程序无法正常运行



最近,GCC社区为在编译器中支持OpenACC做出了一些努力。所以,我想尝试一下。

使用这个循序渐进的教程(教程(,它接近GCC网站上的主要文档,我能够在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: %dn", 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: %dn", change);
  printf("pi=%11.10fn",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.10fn",pi/N);
  return 0;
}

这是运行a.out:后的输出

Number of devices: 1
Change: 0
pi=0.0000000000
pi=3.1415926538

有什么想法吗?

尝试将"平行"移动到循环而不是块。

//  #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",因为标量在默认情况下是私有的。

相关内容

  • 没有找到相关文章

最新更新