fortran66のブログ

fortran について書きます。

【メモ帳】Fortran 2018 新機能に関するメモ その他

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)

Parallel Programming with Co-arrays (Chapman & Hall/CRC Computational Science)

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

f:id:fortran66:20180907032146p:plain