Как получить доступ к удаленной команде в Fortran 2018 - PullRequest
3 голосов
/ 10 ноября 2019

Я написал короткую программу на Фортране, которая использует команды, но она не работает должным образом. Я хотел бы знать, правильный ли мой синтаксис программирования, или если в моем компиляторе есть ошибка.

Я читал книгу о 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 как функцию, скореечем в качестве варианта индексации, как описано в книге.

Без каких-либо опубликованных рабочих примеров, ни в книге, ни в Интернете, я не знаю, чего от меня хочет компилятор. Книга обычно показывает "справочник" представление этих определений. Поэтому я никогда не совсем уверен, как на самом деле должны выглядеть эти заявления. Однако в случае того, как я написал оба утверждения, они используют те же параметры, которые описаны в книге. Любые предложения или идеи, с благодарностью.

1 Ответ

2 голосов
/ 10 ноября 2019

Вы запрашиваете не tempnum с "номера противоположной команды", а с изображения 1 или 2 в вашей текущей команде. Поскольку количество изображений в этой команде одинаково для всех изображений в команде, результаты, которые вы видите, являются правильными.

Когда команда сформирована, и вы делаете CHANGE TEAM, индексы изображений текущей командыупорядоченный набор, начинающийся с 1. Возможно, вы захотите взглянуть на необязательный аргумент «coarray» на CHANGE TEAM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...