fortran - openacc,fortran中的串行构造
问题描述
我有一个 FORTRAN 代码的以下串行部分,应该按顺序执行。
c$acc serial
nppn1=0
c
do 1200 ippas=1,50
c
nppn0=nppn1+1
nppn1=lppas(ippas)
c
c -----did we complete the passes ?
c
if(nppn1.eq.0) goto 1201
c
c -----do we have any ?
c
if(nppn0.gt.nppn1) goto 1199
c
c -----loop over the receiving points
c
c$acc loop seq
do 1400 ippne=nppn0,nppn1
c
c -----points
c
ipoin=bppni(1,ippne)
jpoin=bppni(2,ippne)
c
c -----variables 1-nunkp
c
c$acc loop seq
do 1410 iva=1,nunkp
unkno(iva,ipoin)=unkno(iva,jpoin)+bppnr(iva,ippne)
1410 continue
c
c ----end of loop over the receiving points
c
1400 continue
c
c
c ----end of loop over the passes
c
1199 continue
1200 continue
1201 continue
c$acc end serial
使用 PGI 编译器并停用 OpenACC 指令获得的结果如下所示:
ipoin jpoin unkno(iva,ipoin) unkno(iva,jpoin)
before loop 160215 160165 100.3518075025082 100.3517910648527
after loop 160215 160165 100.3517910648527 100.3517910648527
before loop 160165 157415 100.3517910648527 100.3517910648527
after loop 160165 157415 100.3517910648527 100.3517910648527
这是预期的行为。但是,当 OpenAcc 指令被激活时,值不会更新。
ipoin jpoin unkno(iva,ipoin) unkno(iva,jpoin)
before loop 160215 160165 100.3518075025082 100.3517910648527
after loop 160215 160165 100.3518075025082 100.3517910648527
编译时,PGI 编译器会显示以下内容:
2552, Accelerator serial kernel generated
Generating Tesla code
2556, !$acc do seq
2588, !$acc do seq
2603, !$acc do seq
2552, Generating implicit copyin(bppnr(:nunkp,:),bppni(:2,:),lppas(:))
Generating implicit copy(unkno(:nunkp,:))
所以,我不知道这里发生了什么以及如何解决这个问题。有任何想法吗?
解决方案
推荐阅读
- angular - Angular Firebase 身份验证请求
- r - 使用 BORUTA 包进行特征选择
- c - Dcoder 挑战“热爱数学”:只有三分之一的测试用例正确
- sql-server - Docker 中的 ASP.NET Core 3.0 : Seeding DB 在舞台上间歇性挂起,但从未在 dev 中挂起
- rust - 如何在 Rust 的测试中模拟时间
- extjs - Sencha ExtReact 嵌套对话框无法访问
- javascript - MongoDB - 使用聚合管道评论赞成/反对
- android - FragmentContainerView 和 app:navGraph - 此导航图未引用任何布局文件
- reactjs - 如何在反应组件中访问商店实例
- python - 在满足条件的范围内求和