3

我编写了一个使用团队的简短 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 程序员可以解释这一点?

谢谢你的时间。

史蒂夫莱昂内尔,感谢有关使用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用作函数,而不是用作索引选项,如书中所述。

没有任何已发布的工作示例可言,无论是在书中还是在网上,我都不知道编译器要我做什么。该书通常显示这些定义的“参考书”表示。所以我永远不太确定这些陈述实际上应该是什么样子。但是,就我编写这两个语句的方式而言,它们使用的选项与书中描述的相同。非常感谢任何建议或想法。

4

2 回答 2

3

您不是tempnum从“相反的团队编号”中询问,而是从当前团队中的图像 1 或 2 中询问。由于该团队中所有图像的图像数量相同,因此您看到的结果是正确的。

当团队成立并且您执行CHANGE TEAM时,当前团队的图像索引是从 1 开始的有序集。您可能需要查看可选的“关联 coarray”参数CHANGE TEAM

于 2019-11-10T20:13:48.217 回答
0

我最近从我正在阅读的这本书的一位作者那里了解到,我更新的程序的语法是正确的,甚至可以被简化。他建议我的编译器还不支持在不同团队之间访问信息的功能。

至少我现在知道我的语法是正确的。

于 2019-11-18T06:25:29.573 回答