coarray イメージ間の集団通信
勘違いしていたのですが、新たに導入される co_xxxx 型の集団通信の対象は、coarray のみならず、普通の変数でもいいようです。coarray-次元のリダクションの印象が強すぎて、間違ってました。
3.19 Collective subroutines
- call co broadcast( a, source image[ , stat, errmsg] )
- call co max( a[ , result image, stat, errmsg] )
- call co min( a[ , result image, stat, errmsg] )
- call co sum( a[ , result image, stat, errmsg] )
- call co reduce( a, operation[ , result image, stat, errmsg] )
a is a scalar or an array that has the same shape on all the images of the current team. It has
intent inout. It must not be coindexed. It may be a coarray but this is not required.
また、co_reduce に対応して、普通の配列に対するリダクション演算も一般の関数に対して拡張されます。
5.11 New reduction intrinsic reduce
- reduce(array,operation[,mask,identity,ordered] )
or
- reduce(array,operation,dim[,mask,identity,ordered] )
N2161 The New Features of Fortran 2018 (Reid - Replaces N2145)
Parallel Programming with Co-arrays (Chapman & Hall/CRC Computational Science)
- 作者: Robert W. Numrich
- 出版社/メーカー: Chapman and Hall/CRC
- 発売日: 2018/09/24
- メディア: ハードカバー
- この商品を含むブログを見る
Fortran2003~2008 の機能のまとめ
英スパコンセンター講義集の一つですが、CRAY の人が、95 以降 2015 以前の新規命令をまとめて解説してくれています。スライドがないのが残念です。
「Not-so-old Fortran」Harvey Richardson, Cray Inc.
ARCHER TechForum Mar 2015 Not so old Fortran
配列のベクトル添え字を利用した三次対称群 S3
standard basis による表示を用います。ベクトル添え字 (vector subscript) を何重にもネストさせて、群演算を表わします(複数回の置換)。特にベクトル添字は代入の右辺にも、左辺にも使えるので、右作用・左作用も表わせまする?
プログラム
program S3 ! symmetric group S3 (order 6=3!) implicit none integer, parameter :: i0(*) = [1, 2, 3] integer, parameter :: i1(*) = [1, 3, 2], i2(*) = [3, 2, 1], i3(*) = [2, 1, 3] integer, parameter :: i4(*) = [3, 1, 2], i5(*) = [2, 3, 1] integer :: inv(size(i0)) ! GET operation ! order 1 element print *, 'identity element: i0', i0 ! order 2 elements print *, 'i0 == i1(i1)', all( i0 == i1(i1) ) print *, 'i0 == i2(i2)', all( i0 == i2(i2) ) print *, 'i0 == i3(i3)', all( i0 == i3(i3) ) ! order 3 elements print *, 'i0 == i4(i4(i4))', all( i0 == i4(i4(i4)) ) print *, 'i0 == i5(i5(i5))', all( i0 == i5(i5(i5)) ) ! inverse print *, 'i0 == i4(i5)', all( i0 == i4(i5) ) print *, 'i0 == i5(i4)', all( i0 == i5(i4) ) print *, 'i4 == i5(i5)', all( i4 == i5(i5) ) print *, 'i5 == i4(i4)', all( i5 == i4(i4) ) ! PUT operation ! inverse inv(i5) = i0 print *, 'inv(i5) = i0; inv == i4', all( inv == i4 ) inv(i4) = i0 print *, 'inv(i4) = i0; inv == i5', all( inv == i5 ) end program S3
実行結果
identity element: i0 1 2 3 i0 == i1(i1) T i0 == i2(i2) T i0 == i3(i3) T i0 == i4(i4(i4)) T i0 == i5(i5(i5)) T i0 == i4(i5) T i0 == i5(i4) T i4 == i5(i5) T i5 == i4(i4) T inv(i5) = i0; inv == i4 T inv(i4) = i0; inv == i5 T