我编写了一个简短的使用团队的Fortran程序,但是它不能按预期运行。我想知道我的编程语法是否正确,或者我的编译器中是否有错误。
我一直在阅读有关Fortran 2018及其一些较新实现(包括团队)的书。很少有关于团队的教科书,而我唯一能找到的教科书没有提供任何程序示例。我已经编写,编译并运行了一个很短的程序,该程序应该在一个团队中工作时打印出一个团队的价值。语法看起来很简单,但是该程序无法正常工作。我已经使用OpenCoarrays 2.7.1编译器以及版本2.8.0编译了程序。
program remote_team2
use iso_fortran_enf
implicit none
type(team_type) :: new_team
integer, codimension[*] :: tempnum
form team(1+mod(this_image(),2),new_team)
change team(new_team)
tempnum = num_images()
sync team(new_team)
select case (team_number())
case(1)
print *, 1, ' ', tempnum[2], ' ', num_images()
case(2)
print *, 2, ' ', tempnum[1], ' ', num_images()
end select
end team
end program remote_team2
如果我使用5个处理器运行该程序,则cafrun -np 5 remote_team2
希望在屏幕上打印出如下所示的内容:
2 3 2
1 2 3
2 3 2
1 2 3
2 3 2
相反,我得到以下信息:
2 3 3
1 2 2
2 3 3
1 2 2
2 3 3
我不明白为什么它不打印相反团队编号的图像数量,然后再打印当前团队编号的图像数量。相反,它只打印两次相同的内容,表示方括号索引“ []”不起作用。
我究竟做错了什么?有任何Fortran 2018程序员可以解释这一点吗?
谢谢你的时间。
史蒂夫·莱昂内尔(Steve Lionel),非常感谢您提出的关于将关联选项与change team
语句一起使用的建议。我的书中提到了此选项,但是不幸的是,再次没有示例。
基于本书中描述的语法,我将程序修改为如下所示:
program remote_team2
use iso_fortran_enf
implicit none
type(team_type) :: new_team
integer, codimension[*] :: tempnum
integer, codimension[2,*] :: tn
form team(1+mod(this_image(),2),new_team)
change team(new_team, tempnum[*] => tn)
tempnum = num_images()
sync team(new_team)
select case (team_number())
case(1)
print *, 1, ' ', tempnum[1, team_number = 2], ' ', num_images()
case(2)
print *, 2, ' ', tempnum[1, team_number = 1], ' ', num_images()
end select
end team
end program remote_team2
但是,现在我的编译器为我的语句提供了语法错误change team
。该错误显示为:
change team(new_team, tempnum[*] = > tn)
1
Error: Syntax error in CHANGE TEAM statement at (1)
编译器还会给出以下错误消息:
print *, 1, ' ', tempnum[1, team_number = 2], ' ', num_images()
1
Error: Function 'team_number' requires an argument list at (1)
似乎认为我正在尝试将其team_number
用作函数,而不是如书中所述的索引选项。
没有书中或网上都没有任何公开的工作实例可以讲,我不知道编译器要我做什么。该书通常显示这些定义的“参考书”表示。因此,我永远不确定这些语句的外观。但是,就我编写这两种语句的方式而言,它们使用的是本书中所述的相同选项。任何建议或想法,将不胜感激。
最近,我从我读过的这本书的一位作者那里了解到,更新程序的语法是正确的,甚至可以简化。他建议我的编译器尚不支持在不同团队之间访问信息的功能。
至少我现在知道我的语法是正确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句