3

我们有一个用 Fortran 编写的项目。

现在我知道这可以使用 PGI 编译器完成,但我不想被许可证卡住。

我想看看我们是否可以在我们的项目中使用 OpenACC。我使用此处的说明安装了 gcc5.2。

https://github.com/olcf/OLCFHack15

现在我想做一些类似于这里所说的事情。

https://gcc.gnu.org/onlinedocs/libgomp/OpenACC-Library-Interoperability.html

更具体地说,第 8.3 节中所述的内容。我正在尝试使用 gfortran 精确复制它。不幸的是,我不知道如何在 fortran 中做到这一点。在示例中,

d_X = acc_copyin(&h_X[0], N * sizeof (float));

这允许 d_X 直接用于

s = cublasSaxpy(h, N, &alpha, d_X, 1, d_Y, 1);

但在 fortran 中,acc_copyin不返回任何内容。

那么我将如何在 Fortran 中复制该案例?

4

1 回答 1

1

您是想与 cuBLAS 交互还是更通用?cuBLAS 确实提供了 F77 风格的界面(参见:http ://docs.nvidia.com/cuda/cublas/#appendix-b-cublas-fortran-bindings )

OpenACC 解决方案是像通常使用“data”指令一样管理您的数据,然后从“host_data”区域内调用 CUDA C 例程。“host_data”指定设备指针应与该区域一起使用。因此,当将“d_X”传递给 cublasSaxpy 时,将传入设备指针。

对 cuBLAS 的警告是,上面提到的 F77 接口需要主机阵列,并将为您管理数据移动。因此,您需要编写 CUDA C 包装函数来调用正确的设备例程。(CUDA Fortran 确实为此提供了一个 cublas 模块,但仅限于 PGI)

虽然,GNU 5.2 不支持“host_data”,我只是查看了他们的状态页面(https://gcc.gnu.org/wiki/OpenACC),看起来它在 Fortran 6.0 中也不支持. 不幸的是,“host_data”是您的最佳解决方案。

请注意,作为 OpenACC 工具包的一部分,NVIDIA 确实向学生和学者提供了免费的 PGI 许可,用于教学目的(参见:https ://developer.nvidia.com/openacc )。

于 2016-04-13T17:10:15.177 回答