WSLでFortran (Intel® oneAPI Toolkits)



# 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 11 Pro|2302|
|Visual Studio Code|1.45|
|Ubuntu|22.04.4|

# 1. WindowsへのWSL，Ubuntuの導入

以前記事を書いたので，そちらを参考に．
＝＞[[VScode] WSL上でGitを利用するための開発環境構築](https://qiita.com/Nick_ut/items/64012552092556a0a944)

# 2. Intel One APIの導入

## 2.1. インストール

[こちら](https://qiita.com/tlasu/items/0f49c893e22fa646699d)などで説明されているが，私の現環境(2024/05/23時点)は機能しなかった．リポジトリが最新のものと対応していない説がある．

公式の手順に従って導入する．
参考：https://www.intel.com/content/www/us/en/developer/articles/technical/vs-code-wsl2-and-oneapi-cross-platform-development.html

1. ここにアクセス（https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html#base-kit）

2. 必要なキットのダウンロードページに移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613158/08f3e3fc-f945-2fdc-5491-0bdc1cf18b45.png)

3. Linux -> APT package manager を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613158/b662f3fd-5e38-c543-3743-9bf9733b7e0b.png)

4. ここに表示されている手順に従い，Ubuntuのbashからインストール

補足
- sudo apt updateは複数回行わないと適切に認証できなかった．
- basekitのインストールができていればHPC toolkitは`sudo apt install intel-hpckit`のみでOK
- basekitはおよそ10分程度でインストール完了，HPC toolkitは1分程度．

## 2.2. 使用

シンプルに使用するなら、コンパイラまでのパスを認識させるために`source /opt/intel/oneapi/setvars.sh`を実行．これは.bachrcに書いておくと毎回認識される．

module を使って読み込む場合は少し複雑になるが、以下のようにする。

~~~bash
sudo apt install tcl
sudo apt install environment-modules
# 上記はすでに環境が最新なら不要

cd <oneapi-root-folder>  # 私の環境では/opt/intel/oneapi
sudo ./modulefiles-setup.sh # これでmodulefileディレクトリが作成される
module use <modulefile directory> # 上記のコマンドの最後に表示されるディレクトリ
module avail # これでintel compilerのlistがあるか確認
module load ifort
~~~

# 3. VScode上の設定

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

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

- Remote WSL
    - VScodeでWSLを使うため．[こちら](https://qiita.com/Nick_ut/items/64012552092556a0a944)を参照．
- 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で検索して該当箇所に以下のように入れる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613158/c4f0f48f-ba70-eba0-831d-563ebc1b705e.png)

### 3.1.2. FORTRAN IntelliSense

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

```
pip3 install fortran-language-server
```

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613158/b645edd8-7949-201d-c3b8-de548f5edc8a.png)


## 3.2. Settingの変更

### 3.2.1. gfortran

VScode機能によるコンパイルには```tasks.json```，デバッグには```launch.json```に正しい記載が必要です．非常にわかりやすい説明が[こちら](https://qiita.com/implicit_none/items/d49c9fdf51c307d22819?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items)にあるので，参照してください．
一応保存ディレクトリは各自の環境に読み替えてください．

### 3.2.2. ifort

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

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

```Makefile
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の２つに分けて紹介しました．

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

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

WSL上でもGUIを起動させられますが，完全にコマンドライン上で行うのがおすすめです．
- Base tool kit -> [ここから](https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html)
- HPC tool kit -> [ここから](https://www.intel.com/content/www/us/en/developer/tools/oneapi/hpc-toolkit-download.html?operatingsystem=linux&distributions=webdownload&options=online)



# 5. 以下古い情報：UbuntuへのIntel® Parallel Studio XEの導入

## 5.1. 2020年時点での情報

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

|コンパイラ|入手|バージョン|コンパイル(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)|有償<br>(学生無償)|19.1.1.217|失敗**|--|

\*  ：この環境では未検証．[こちら](https://qiita.com/implicit_none/items/d49c9fdf51c307d22819?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items)の方の情報を参照
\** :  VScodeのtasks.jsonを使った方法ではifortのpathがどうしても通せず不可だった．VScodeのターミナルからコマンドを打つことになる．

## 5.2. gfortran

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

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


## 5.3. Intel® Parallel Studio XE

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

- [Intelのダウンロードサイト](https://registrationcenter.intel.com/en/forms/?productid=2867)から，必要事項などを記入しダウンロード画面までたどり着く．(以下）

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613158/b6943439-a38d-eda3-e32b-5ac9090d74b8.png)

- ダウンロード画面にて"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を使おう！](https://qiita.com/minwinmin/items/afbb0404533fd4b07e72)
[Installation to Linux VM](https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/807571#)

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