fortran66のブログ

fortran について書きます。

【メモ帳】Intel Fortran v.19.1 beta 試し

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

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

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