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

标签 nvidia openacc offloading gcc5 gcc6

最近,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/

相关文章:

OpenACC 的 C/预处理器标准宏?

grails - 强制 Grails/Weblogic 仅使用 HTTPS 协议(protocol)重定向

ssl - 带 SSL 卸载的 ARR : app needs to know it was SSL

c - OpenCL 从 GPU 读取可变大小结果缓冲区

c++ - 优化具有不规则内存访问的 CUDA 内核

tensorflow - 在 Tensorflow 中测量 GPU 内存使用情况的最佳方法是什么

mysql - 我们应该在数据库中做多少工作?

ubuntu - 如何在 ubuntu 18.1 上安装 cuda-toolkit-10-0?

c - 支持 OpenACC 的 CAPS 编译器的限制

cuda - 什么会导致 nvprof 不返回数据?