WSLでFortran (Intel oneAPI Base Toolkit + HPC Toolkit)


0. はじめに

Fortranという言語の歴史は古くエンジニアリングの数値計算ではまだ現役です.

この記事では,WindowsPCにおいてわざわざLinux(Ubuntu)OSを入れること無くLinux環境の利点を享受すべく,Windows Subsystem for Linux(WSL)を用いてFortranでの開発を行うことを目的とします.

WSLは非常にWindowsとの親和性が高く,他の仮想環境の比べて起動の速さや相互ファイルアクセスなど際立って優秀です.

この記事はもともとIntel pararell studio 向けに書いたものですが,現在はIntel oneAPI Base Toolkit + HPC Toolkitを使うことになります.こちらはwindows でもLinuxでもあまり導入には違いがないと思います.この記事は過去の遺産として残しておきます.

0.1. Linux環境のメリット(なぜWindows上で開発しないのか)

  • VScode上でのデバッグの可否
  • Intel コンパイラが学生無料で使用可能
  • (Windows環境が汚染されない)

0.2. 環境

ソフトウェア バージョン
Windows 10 Pro 1909
Visual Studio Code 1.45
Ubuntu 18.04.4

1. WindowsへのWSL,Ubuntuの導入

以前記事を書いたので,そちらを参考に.
=>[VScode] WSL上でGitを利用するための開発環境構築

2. Ubuntuへのコンパイラの導入

今回候補に上げるコンパイラの情報を表にまとめた

コンパイラ 入手 バージョン コンパイル(on VScode) デバッグ(on VScode)
gfortran (windows) 無償 4.10.0 成功* 失敗*
gfortran (Ubuntu on WSL) 無償 7.5.0 成功 成功
Intel (windows) 有償 17.0.4.210 成功* 失敗*
Intel (Ubuntu on WSL) 有償
(学生無償)
19.1.1.217 失敗** --

* :この環境では未検証.こちらの方の情報を参照
** : VScodeのtasks.jsonを使った方法ではifortのpathがどうしても通せず不可だった.VScodeのターミナルからコマンドを打つことになる.

2.1. gfortran

Ubuntuにgfortranを入れる.GDBも入っていない場合があるので入れる.
ターミナル上で以下を行うだけで完了.

$ sudo apt-get update
$ sudo apt-get install gfortran
$ sudo apt-get install gdb

2.2. Intel® Parallel Studio XE

Intel(R) Parallel Studio XE for Linuxは,学生であると非商用に限り,無料かつ期間制限なしで使うことができる.これには,FortranとC++の両方のコンパイラを含んでいる.

  • ダウンロード画面にて"Custamizable Package"をダウンロード(.tgzファイルがダウンロードされる).
  • ダウンロードファイルをWindowsエクスプローラーでどこか(Ubuntuのホームディレクトリが楽)に移す.
  • Ubuntuのターミナルでファイルのあるディレクトリまで移動し,展開.
$ tar xf [ダウンロードしたフォルダ名].tgz
  • ディレクトリを移動し,インストールシェルスクリプトを読み込み.
$ cd [ダウンロードしたフォルダ名]
$ sudo ./install.sh
  • これで表記に従ってインストールをしていけばいい
  • 認証を求められるので,その際は,上記画面またはメールで届くシリアルナンバーを入力.
  • 自分の環境ではXorg X11 libXss runtime library, NSS library, ALSA libraryを入れろと指示されたので,一度中断してこれらを以下のコマンドでインストール後,再度インストーラを実行した.
$ sudo apt-get install libxss1
$ sudo apt-get install libnss3
$ sudo apt-get install libasound2
  • またこれでもデフォルトではエラーで進まないので,Custom Installを選択し,いくつかのパッケージをインストールから外すことでクリアした.インストールしたものは下記の通りで最低限という感じ.
   1. [ ]    IA-32
   2. [x]    Intel(R) 64
  1. Accept and continue [ default ]
   2. [None] Intel Trace Analyzer and Collector 2019 Update 3
   3. [None] Intel Cluster Checker 2019 Update 2
   4. [None] Intel VTune Amplifier 2019 Update 3
   5. [None] Intel Inspector 2019 Update 3
   6. [None] Intel Advisor 2019 Update 3
   7. [All] Intel C++ Compiler 19.0 Update 3
   8. [All] Intel Fortran Compiler 19.0 Update 3
   9. [All] Intel Math Kernel Library 2019 Update 3 for C/C++
   10.[All] Intel Math Kernel Library 2019 Update 3 for Fortran
   11.[All] Intel Integrated Performance Primitives 2019 Update 3
   12.[All] Intel Threading Building Blocks 2019 Update 4
   13.[None] Intel Data Analytics Acceleration Library 2019 Update 3
   14.[None] Intel MPI Library 2019 Update 3
   15.[None] GNU* GDB 8.0
   16.[None] Intel(R) Distribution for Python*
  • インストールは10分程度.
  • インストールが終わってもpathにifortが追加されていないので,Ubuntuホームディレクトリの".bashrc"ファイル末尾に以下の一文を書き込む.適当なテキストエディタでOK.
    • **********はバージョン由来のディレクトリなので"ompilervars.sh"がある場所を要確認.今回の環境では2020.1.217だった.
$ source /opt/intel/compilers_and_libraries_**********/linux/bin/compilervars.sh intel64
  • 一応Ubuntuを再起動した後,$ ifort -vでバージョンが表示されれば完了.

参考:
Fortran環境を構築!Intel(R) Parallel Studio XE 2018 for Linuxを使おう!
Installation to Linux VM

2020/10/06追記:ホストOSがUbuntu18.04の環境でIntel® Parallel Studio XE 2020をインストールしてみたが,Xorg X11 libXss runtime library, NSS libraryらはプリインストールで入れる必要がなかった.また,デフォルト設定で問題なくインストールできた.この設定はWSL上の問題だけのようです.

3. VScode上の設定

ここまでで開発に必要なものは揃ったので,適当に完成ファイルを放り込んだ後Ubuntuターミナルからコマンドを打てばコンパイル,実行は問題ない.
以下ではエディタを使って楽したい場合ということでVScode上でビルド,デバッグする方法を書く.

3.1. VSCodeに以下の拡張機能を入れる

  • Remote WSL
    • VScodeでWSLを使うため.こちらを参照.
  • Modern Fortran (Remote WSL上)
    • Syntax Highlightと変数・関数・モジュール定義への移動
  • FORTRAN IntelliSense (Remote WSL上)
    • 変数の入力補完と関数・サブルーチン引数の入力支援やホバーによる関数の引数定義の確認など
  • C/C++ (Remote WSL上)
    • GDB/LLDBをデバッグに使用するために必要

3.1.1. Modern Fortran

Modern Fortranはlintingにgfortranを使うので,Modern Fortranインストール後,VSCodeの設定からgfortranの実行ファイルのパスを追加します.("ctl"+","でsettingを開いてfortranで検索して該当箇所に以下のように入れる)

3.1.2. FORTRAN IntelliSense

FORTRAN IntelliSenseはFortran Language Serverを利用するので,インストールしてパスを設定します.Ubuntuのターミナルで 以下を実行するとインストールされます.

pip3 install fortran-language-server

VScodeの設定でpathを入力.<Ubuntuのホームディレクトリ>/.local/bin/fortlsにあると思います.

3.2. Settingの変更

3.2.1. gfortran

VScode機能によるコンパイルにはtasks.json,デバッグにはlaunch.jsonに正しい記載が必要です.非常にわかりやすい説明がこちらにあるので,参照してください.
一応保存ディレクトリは各自の環境に読み替えてください.

3.2.2. ifort

上の参考サイトなども見ながらいろいろと試してみましたが,ifortのpathがビルド実行時にのみ通せず,VScodeの機能によるビルドは不可能そう(当然デバッグも無理)という状況です.追加で調査は続けていきたいと思います.
WSLやVScodeは日々開発が進められているので,どこかで使えるようになるのを祈ります...

コンパイルする際には以下のようなMakefileを作ってVScodeのターミナル欄に$ makeで行うのが楽かと思います.

TARGET = go
OBJECTS = main.o
# ファイル,必要に応じて変更
MOD_FILES = main.mod
# ファイル,必要に応じて変更

FC = ifort
# FC = gfortran
# 使わない方はコメントアウト

# for gfortran
ifeq (${FC},gfortran)
	FFLAGS = -fimplicit-none -fbounds-check
endif
# for ifort
ifeq (${FC},ifort)
	MKLROOT = /opt/intel/mkl
	FFLAGS = -i8 -I${MKLROOT}/include
endif

%.o: %.mod
.SUFFIXES : .o .f90
.f90.o:
	${FC} -c $<
${TARGET} : ${OBJECTS}
	${FC} -o $@ ${OBJECTS} ${FFLAGS}

.PHONY: clean
clean:
	${RM} ${OBJECTS} ${MOD_FILES}

4. まとめ

FortranをWSLを利用して開発するための方法とその差をgfortranとIntel Parallel Studioの2つに分けて紹介しました.

結論として,**「導入が簡単&VScodeデバッガが動くgfortran」をとるか「高機能なIntel Parallel Studio」**をとるかという話になりそうです.計算速度に関しては,手持ちのコードでIntelがgfotranの3倍程度高速でした.並列化やベクトル化率など気にしてないので,参考程度に.

** 2021/8/14 追記 **
上記Intel® Parallel Studio XEのライセンスが切れてしまったことを受けて,
Intel oneAPI Base Toolkit + HPC Toolkitを用いてintel fortranを導入してみました
https://qiita.com/implicit_none/items/35bc4be8f2022903747a
上記の方法で無事うまくいくことを確認しました.

WSL上でもGUIを起動させられますが,完全にコマンドライン上で行うのがおすすめです.