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