coarray 集合演算 co_xxx
整数でしか正しい答えを与えない上に、result_image を省略すれば broadcast するはずなのに、image 0 は存在しないとかいう実行エラーを吐く。
beta だからしょうがないネ!
ソース・プログラム
co_sum のみならず co_min, co_max も同様。
♪ 大寒、小寒、山から小僧が飛んできた~
program caf2020 implicit none integer :: nm, im im = this_image() nm = num_images() block integer :: ix ix = im * 10 print *, 'number of images=', nm, 'image no.=', im, 'ix=', ix call co_sum(ix, result_image = 1) if (im == 1) print *, 'sum of ix=', ix end block sync all block real :: x x = im * 10.0 print *, 'number of images=', nm, 'image no.=', im, ' x=', x call co_sum(x, result_image = 1) if (im == 1) print *, 'sum of x=', x end block sync all stop end program caf2020
実行結果
number of images= 8 image no.= 1 ix= 10 number of images= 8 image no.= 3 ix= 30 number of images= 8 image no.= 4 ix= 40 number of images= 8 image no.= 2 ix= 20 number of images= 8 image no.= 7 ix= 70 number of images= 8 image no.= 6 ix= 60 number of images= 8 image no.= 8 ix= 80 number of images= 8 image no.= 5 ix= 50 sum of ix= 360 number of images= 8 image no.= 5 x= 50.00000 number of images= 8 image no.= 1 x= 10.00000 sum of x= 10.00000 number of images= 8 image no.= 2 x= 20.00000 number of images= 8 image no.= 3 x= 30.00000 number of images= 8 image no.= 6 x= 60.00000 number of images= 8 image no.= 4 x= 40.00000 number of images= 8 image no.= 7 x= 70.00000 number of images= 8 image no.= 8 x= 80.00000
co_bradcast は実数もおk 単倍4皆
ソース・プログラム
program Console5 implicit none integer :: im, ne real(kind(0.0d0)) :: x im = this_image() ne = num_images() if (im == 1) x = 1111.1111 call co_broadcast(x, 1) ! implicitly sync all? print *, im, x sync all stop end program Console5
実行結果
4 1111.11108398438 3 1111.11108398438 7 1111.11108398438 8 1111.11108398438 1 1111.11108398438 2 1111.11108398438 6 1111.11108398438 5 1111.11108398438
- 作者: Michael Metcalf,John Reid,Malcolm Cohen
- 出版社/メーカー: Oxford Univ Pr
- 発売日: 2018/11/06
- メディア: ハードカバー
- この商品を含むブログを見る
select rank
y =>xの associate 部分がまたもおかしい。y へのポインタ関連付けを省略できないのに、y に正しい情報が入っていない。x を生で呼べば解決するが。バグだらけ。
[1:5] の構文は非標準だけれど Thinking Machine 社の CM Fortran に淵源する由緒ある記法なので使うw
forall は、1行で書けてインデックスを一時変数としてその場で使い捨てられるので便利。
ソース・プログラム
module m_test implicit none contains subroutine sub(x) real, intent(in) :: x(..) select rank (y => x) rank (0) print *, 'scalar ', y rank (1) print *, '1D array ', size(y), y rank default print *, 'nD array of rank', rank(x), 'shape ', shape(x) print *, 'nD array of rank', rank(y), 'shape '!, shape(y) !Internal compiler error end select end subroutine sub end module m_test program Console4 use m_test implicit none real :: x, y(5), z(2, 2, 2) x = 99.0 y = real([1:5]) ! non-standard intel (CM Fortran) ! real([(i, i = 1, 5)]) forall (integer:: i = 1:2, j = 1:2, k = 1:2) z(i, j, k) = real(i + 10 * j + 100 * k) print *, z call sub(x) call sub(y) call sub(z) end program Console4
実行結果
111.0000 112.0000 121.0000 122.0000 211.0000 212.0000 221.0000 222.0000 scalar 99.00000 1D array 5 1.000000 2.000000 3.000000 4.000000 5.000000 nD array of rank 3 shape 2 2 2 nD array of rank -858993460 shape