fortran66のブログ

fortran について書きます。

【ニュース】Flang 13 など

【ララベル速報】 llvm13 出る!

www.phoronix.com

flang がようやく仲間に!

【悲報】HISA ANDO ページ消える

Ando’s Microprocessor Information

Ando's Microprocessor Information

元々 fc2 は調子悪かったのでどこかに移られるのかもしれません。

追記:その後、復旧していました。

【メモ帳】flang13 コンパイル

WSL 2.0 Ubuntu 20.04 にて。

何度指示通りにやってもうまくいかないので泣きながら試行錯誤した後 gccコンパイルできることが判明。なお openmp は個別に make & install しました。libpgmath も make& install しましたが旧 flang のみで必要で要らないかもしれないです。disk を滅茶苦茶食うので死にます。

追記:その後バイナリがアップされましたが、ネットニュースと違って flang のバイナリが同梱されておりませんでした。何故に!?

mkdir build
cd build

cmake -j 8 -DLLVM_ENABLE_PROJECTS="clang;flang" -DHAVE_CXX_ATOMICS64_WITHOUT_LIB=True   -DHAVE_CXX_ATOMICS_WITHOUT_LIB=True ../llvm

make -j 8

sudo make -j 8 install 

make -j 8 は時間差で生成がずれるので何回か繰り返したのちに、1スレッド make の必要ありかも。

実行例1 compiler_version()

program test
    use, intrinsic :: iso_fortran_env
    implicit none
    print *, compiler_version()
end
$ flang --version
flang version 13.0.0

$ cat aaaaa.f90
program test
    use, intrinsic :: iso_fortran_env
    implicit none
    print *, compiler_version()
end

$ flang aaaaa.f90

$ ./a.out
 GCC version 9.3.0

コンパイラのバージョンが GCC version 9.3.0 と出るので、ちゃんと生成されたのか不安・・・

実行例2 flang 12 では対応していなかった f2008 の pointer function

flang 13 では問題なくコンパイル&実行できました。

fortran66.hatenablog.com

fortran66.hatenablog.com

文字列を key とする連想配列を pointer function によって実現。

ソース・プログラム

    module hash_m
        implicit none
     !   private
     !   public :: ia
        
        integer, parameter :: nhash = 73
        type :: t_key
            character(len = :), allocatable :: key  
        end type t_key
        type (t_key)    :: keyc(nhash)  
        integer, target :: vals(nhash) = 0  
    contains
        pure integer function ihash(text) 
            character(len = *), intent(in) :: text
            integer :: i
            ihash = 0
            do i = 1, len_trim(text)
                ihash = mod(256 * ihash + iachar(text(i:i)), nhash)
            end do
            ihash = ihash + 1
        end function ihash  
       
        
        function ia(text) result(ires)
            character(len = *), intent(in) :: text
            integer, pointer :: ires 
            integer :: key, loc, ihop
            ihop = 1
            key = ihash(text) 
            do
                if (.not. allocated(keyc(key)%key)) then
                    keyc(key)%key = trim(text)
                    ires => vals(key)
                    exit
                else if (keyc(key)%key == trim(text)) then 
                    ires => vals(key)
                    exit
                else ! collision
                    key = mod(key + ihop, nhash) + 1   
                    ihop = ihop + 2
                    if (ihop == nhash) stop 'associative array exhausted!' 
                end if
            end do  
        end function ia      
    end module hash_m
    
    
    program Hash
        use hash_m
        implicit none
      
        ia('a') = 41
        print *, ia('a')
        ia('a') = 100
        print *, ia('a')
        ia('b') = 200
        print *, ia('a') + ia('b')
      
        ia('FORTRAN I') = 1957
        ia('FORTRAN II') = 1958
        ia('FORTRAN IV') = 1961
        ia('FORTRAN 66') = 1966
        ia('FORTRAN 77') = 1978
        ia('Fortran 90') = 1991
        ia('Fortran 95') = 1997
        ia('Fortran 2003') = 2004
        ia('Fortran 2008') = 2010
        ia('Fortran 2018') = 2018
        
        ia('Gold') = 1488
        ia('Silver') = 17
        ia('Platinum') = 946
        ia('Palladium') = 1590
        ia('Rhodium') = 4700
      
        block
          integer :: i
          do i = 1, nhash
              print '(i3,a,a20,a,i10)', i, ':', keyc(i)%key, '=>', ia(keyc(i)%key)
          end do    
       end block
    end program Hash

実行結果

$ flang hash.f90
$ ./a.out
          41
         100
         300
  1:                    =>         0
  2:             Rhodium=>      4700
  3:                    =>         0
  4:                    =>         0
  5:            Platinum=>       946
  6:                    =>         0
  7:                    =>         0
  8:                    =>         0
  9:           Palladium=>      1590
 10:                    =>         0
 11:                    =>         0
 12:                    =>         0
 13:                    =>         0
 14:                    =>         0
 15:                    =>         0
 16:                    =>         0
 17:                    =>         0
 18:                    =>         0
 19:                    =>         0
 20:                    =>         0
 21:                    =>         0
 22:                    =>         0
 23:                    =>         0
 24:                    =>         0
 25:                   a=>       100
 26:                   b=>       200
 27:        Fortran 2018=>      2018
 28:                    =>         0
 29:                    =>         0
 30:                    =>         0
 31:          FORTRAN 77=>      1978
 32:                    =>         0
 33:                    =>         0
 34:                    =>         0
 35:                    =>         0
 36:                    =>         0
 37:                    =>         0
 38:                    =>         0
 39:                    =>         0
 40:                    =>         0
 41:                    =>         0
 42:           FORTRAN I=>      1957
 43:                    =>         0
 44:          Fortran 90=>      1991
 45:                    =>         0
 46:                    =>         0
 47:          Fortran 95=>      1997
 48:              Silver=>        17
 49:                    =>         0
 50:                    =>         0
 51:                    =>         0
 52:                    =>         0
 53:                    =>         0
 54:                    =>         0
 55:                    =>         0
 56:                    =>         0
 57:                    =>         0
 58:          FORTRAN II=>      1958
 59:                    =>         0
 60:        Fortran 2003=>      2004
 61:                    =>         0
 62:                    =>         0
 63:        Fortran 2008=>      2010
 64:                    =>         0
 65:                    =>         0
 66:          FORTRAN 66=>      1966
 67:                    =>         0
 68:                    =>         0
 69:                    =>         0
 70:                    =>         0
 71:          FORTRAN IV=>      1961
 72:                    =>         0
 73:                Gold=>      1488