如何在 Fortran 2018 中访问远程团队
How to Access a Remote Team in Fortran 2018
我编写了一个使用团队的简短 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
作为一个函数,而不是像书中描述的那样作为索引选项。
没有任何已发布的工作示例可言,无论是在书中还是在网上,我都不知道编译器要我做什么。该书通常显示这些定义的 "reference book" 表示。所以我从来都不太确定这些陈述实际上应该是什么样子。但是,就我编写这两个语句的方式而言,它们使用了书中描述的相同选项。非常感谢任何建议或想法。
您不是向 "opposite team number" 请求 tempnum
,而是向您当前团队中的图像 1 或 2 请求。由于该团队中的图像数量在团队中的所有图像中都是相同的,因此您看到的结果是正确的。
当一个团队成立并且你做一个 CHANGE TEAM
时,当前团队的图像索引是一个从 1 开始的有序集。你可能需要查看 [=] 的可选 "associating coarray" 参数11=].
我最近从我一直在阅读的这本书的一位作者那里了解到,我更新后的程序的语法是正确的,甚至可以进行简化。他建议我的编译器还不支持不同团队之间访问信息的功能。
至少我现在知道我的语法是正确的。
我编写了一个使用团队的简短 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
作为一个函数,而不是像书中描述的那样作为索引选项。
没有任何已发布的工作示例可言,无论是在书中还是在网上,我都不知道编译器要我做什么。该书通常显示这些定义的 "reference book" 表示。所以我从来都不太确定这些陈述实际上应该是什么样子。但是,就我编写这两个语句的方式而言,它们使用了书中描述的相同选项。非常感谢任何建议或想法。
您不是向 "opposite team number" 请求 tempnum
,而是向您当前团队中的图像 1 或 2 请求。由于该团队中的图像数量在团队中的所有图像中都是相同的,因此您看到的结果是正确的。
当一个团队成立并且你做一个 CHANGE TEAM
时,当前团队的图像索引是一个从 1 开始的有序集。你可能需要查看 [=] 的可选 "associating coarray" 参数11=].
我最近从我一直在阅读的这本书的一位作者那里了解到,我更新后的程序的语法是正确的,甚至可以进行简化。他建议我的编译器还不支持不同团队之间访问信息的功能。
至少我现在知道我的语法是正确的。