如何在Fortran 2018中访问远程团队
我已经编写了一个使用团队的简短Fortran程序,但它的功能并没有达到预期。我想知道我的编程语法是否正确,或者我的编译器中是否有错误 我一直在读一本关于Fortran 2018及其一些较新实现(包括团队)的书。很少有教科书谈到团队,我能找到的唯一一本没有提供任何程序示例。我编写、编译并运行了一个非常短的程序,该程序应该可以打印一个团队的值,同时在另一个团队中工作。语法似乎相当直截了当,但程序不起作用。我使用OpenCoarrays 2.7.1编译器以及2.8.0版编译了该程序如何在Fortran 2018中访问远程团队,fortran,fortran2018,Fortran,Fortran2018,我已经编写了一个使用团队的简短Fortran程序,但它的功能并没有达到预期。我想知道我的编程语法是否正确,或者我的编译器中是否有错误 我一直在读一本关于Fortran 2018及其一些较新实现(包括团队)的书。很少有教科书谈到团队,我能找到的唯一一本没有提供任何程序示例。我编写、编译并运行了一个非常短的程序,该程序应该可以打印一个团队的值,同时在另一个团队中工作。语法似乎相当直截了当,但程序不起作用。我使用OpenCoarrays 2.7.1编译器以及2.8.0版编译了该程序 program r
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
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
我不明白为什么它不打印对方团队编号中的图像数量,然后打印当前团队编号中的图像数量。相反,它只是将同一内容打印两次,表示方括号索引“[]”不起作用
我做错了什么?是否有任何Fortran 2018程序员能够解释这一点
谢谢你抽出时间
史蒂夫·莱昂内尔,感谢你提出的关于研究与变更团队
声明的关联选项的建议。我的书中提到了这个选项,但不幸的是,再次没有例子
根据书中描述的语法,我修改了我的程序,如下所示:
2 3 3
1 2 2
2 3 3
1 2 2
2 3 3
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)
它似乎认为我试图使用团队编号
作为一个函数,而不是像书中描述的那样作为索引选项
由于没有任何公开的工作示例,无论是在书中还是在网上,我都不知道编译器想要我做什么。本书通常显示了这些定义的“参考书”表示。所以我从来都不太确定这些陈述到底应该是什么样子。然而,在我如何编写这两个语句的情况下,它们使用了书中描述的相同选项。非常感谢您的任何建议或想法。您不是要求“对方团队编号”提供
tempnum
,而是要求您当前团队中的图1或图2。由于该团队中所有图像的图像数量相同,因此您看到的结果是正确的
当一个团队成立并且您进行了
更改团队
时,当前团队的图像索引是从1开始的有序集合。您可能想看看可选的“Association coarray”参数到CHANGE TEAM
我最近从我读过的一本书的作者那里了解到,我更新的程序的语法是正确的,甚至可以简化。他建议我的编译器还不支持在不同团队之间访问信息的功能
至少我现在知道我的语法是正确的