【ララベル速報】 llvm13 出る!
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 では問題なくコンパイル&実行できました。
文字列を 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