【ララベル速報】 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
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
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