前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对于CUDA Fortran开发者来说,函数传参真这么麻烦么?

对于CUDA Fortran开发者来说,函数传参真这么麻烦么?

作者头像
GPUS Lady
发布2018-04-02 15:36:10
8380
发布2018-04-02 15:36:10
举报
文章被收录于专栏:GPUS开发者GPUS开发者

有天,有人在论坛上问了一个问题:

我想创建一个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程序的需求。

大神总结

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档