fortran66のブログ

fortran について書きます。Amazonのアソシエイトとして収入を得ています。

【ララベル速報】flang20.1 出る!

renaming the "flang-new" compiler just to "flang".

www.phoronix.com

Those interested in all of the fine details around this new "Flang" compiler in LLVM 20+ can read all about it on the LLVM.org blog.

blog.llvm.org

このブログ記事は長いですが、Fortran 処理系が LLVM にもたらした進歩や意義にも触れられていて、いいまとめです。

Why Fortran? や Why Would You Make Another Fortran Compiler? などの素朴な疑問にもきっちり答えています。

WSL2 ubuntu 24.04 にインストール

chatGPT 先生の御託宣により、以下のとおりでバイナリをインストールできました version は flang 20.1.1 で、flang-new-20 で起動されます。上記記事とは異なり、昔の名前で出ていました。

1. LLVMのAPTリポジトリを追加する:

wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
sudo add-apt-repository -y "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-20 main"
sudo apt update

2. Flangのインストール:

sudo apt install -y flang-20

3. インストールの確認:

flang-new-20 --version

test

    program sine
        implicit none
        real, parameter :: pi = 4 * atan(1.0)
        real, parameter :: val(*) = [0.0, 1.0, sqrt(3.0)/2.0, 1.0/sqrt(2.0), sqrt((5.0-sqrt(5.0))/8.0), 1.0/2.0] 
        ! sin(pi  ) = 0
        ! sin(pi/2) = 1
        ! sin(pi/3) = sqrt(3)/2   
        ! sin(pi/4) = 1/sqrt(2)
        ! sin(pi/5) = sqrt((5-sqrt(5))/8)
        ! sin(pi/6) = 1/2
        real :: x, y
        integer :: i
        
        do i = 1, 6
            x = pi / i
       !     y = sin(x)
            y = sind(180.0/i)
            print '(a, i1, 2f10.7, es15.7)', 'pi/', i, y, val(i), y - val(i)   
        end do
    end program sine
$ flang-new-20 --version
Ubuntu flang version 20.1.1 (++20250311083225+dcc378e862de-1~exp1~20250311203242.72)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-20/bin
$ flang-new-20 sine.f90
$ ./a.out
pi/1-0.0000001 0.0000000 -8.7422777E-08
pi/2 1.0000000 1.0000000  0.0000000E+00
pi/3 0.8660254 0.8660254  5.9604645E-08
pi/4 0.7071068 0.7071068  0.0000000E+00
pi/5 0.5877852 0.5877852  0.0000000E+00
pi/6 0.5000000 0.5000000  0.0000000E+00
$

この誤差の出方は、ラジアン計算の時と同じなので、せっかく degree 引数の sind(x) 関数を導入したのに、実装が旧来のままで degree で誤差の出ないそれ用の級数展開になっていないと思われる。まだやっつけ感漂うw