有天,有人在论坛上问了一个问题:
我想创建一个data区域来减少subroutine之间的数据传递(阅读原文查看楼主的代码),这样就不必在subroutine之间进行一次次的数据拷贝到设备再拷贝回主机再拷贝回设备计算,请问这种数据传输操作可行吗?如果可行的话,请问该如何操作呢?我只知道present导语能够告知编译器该变量已经存在于数据区域中,那么如何让GPU计算得出的变量滞留在设备内存中,直接供给下一个subroutine使用呢?直到数据区域结束再指明需要将哪些变量传输回主机内存。
代码有点长,大神终于抽开时间看了一下。
1. 首先,强烈反对使用common的形式进行数据传递。这一点跟GPU无关,只要你用fortran,就会有人这么跟你说。因此,至于openACC支不支持用common传数据、怎么传、结果不正确一概不予回答。 其次,至于你的问题,可以用module数据块的形式共享数据。我写了个简单的实例代码: 主程序如下:
数据文件如下:
子函数文件如下:
编译后用nvprof分析的结果:
nvvp分析结果:
可见,数据在data_init()的时候,由enter data导语在设备端创建并由主机端传输到设备端;在连续5次调用data_cal()时,数据一直在设备端,供函数使用,并没有额外传输;在最后data_finalize()的时候数据传回主机端。此模型应该满足你的需求,也应该满足大部分openacc fortran程序的需求。
大神总结