我们有一个用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/