OpenACC 库互操作性:如何获取设备指针?

OpenACC Library Interoperability: how to get device pointer?

我们有一个用 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 没有 return 任何东西。

那么我如何在 Fortran 中复制这种情况?

您是想与 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),看起来它也不会在 6.0 的 Fortran 中得到支持。不幸的是,"host_data" 是最适合您的解决方案。

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