我们有一个用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中复制该案例?

最佳答案

您是否正在寻找与cuBLAS交互的接口(interface)? cuBLAS确实提供了F77样式的界面(请参阅:http://docs.nvidia.com/cuda/cublas/#appendix-b-cublas-fortran-bindings)

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

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

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

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

关于fortran - OpenACC库互操作性:如何获取设备指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36577628/

10-13 07:45
查看更多