GNRをReplicateするためのWindowsにおけるFortran環境構築ガイド

Published:

はじめに

この記事は、Gandhi, Navarro, and Rivers (2020) が Journal of Political Economy (JPE) で発表した論文 “On the Identification of Gross Output Production Functions” のFortranベースのReplication Code(以下、GNRコード)をWindows PCで実行するための環境構築手順を、備忘録としてまとめたものである。

筆者自身、計算科学を専門としていないため、環境構築の段階で多くの時間を費やした。特に、Windows上で科学技術計算ライブラリを連携させる部分で苦労した経験から、同じ道を通る読者の一助となることを目的とする。

本稿で紹介するのは、WSL (Windows Subsystem for Linux) 2 上に Intel oneAPI HPC Toolkit をインストールし、数値計算ライブラリである MKL を利用してFortranコードをコンパイル・実行する手法である。

【重要:免責事項】 この記事は、筆者個人の経験に基づき作成したものである。掲載されている情報の正確性には万全を期しているが、環境の違いなどにより予期せぬ問題が発生する可能性もある。本記事の手順に従って生じたいかなる損害についても、筆者は一切の責任を負わないため、あらかじめ了承されたい。


なぜWSL (Windows Subsystem for Linux) を使うのか?

Windows上で直接Fortran環境を構築することも可能であるが、多くの場合、複雑な手順を伴う。特に、GNRコードが必要とするBLASLAPACKといった科学技術計算ライブラリの導入と連携は、初心者にとって大きなハードルとなる。実際、筆者はWindows上での環境構築に多くの時間を費やし、苦労した。

そこでWSL (Windows Subsystem for Linux)の出番となる。メリットは以下の通りである。

  • ライブラリ管理が容易: Linuxディストリビューション(本稿ではUbuntu)の豊富なパッケージマネージャー (aptなど) を利用でき、ライブラリのインストールや管理が格段に容易になる。
  • ドキュメントが豊富: 科学技術計算の分野では、Linux環境を前提としたドキュメントやツールが多く、情報収集がしやすいという利点がある。
  • Windowsとのシームレスな連携: WSL 2では、Windowsのファイルシステム (Cドライブなど) へのアクセスが簡単で、Windowsのエディタでコードを編集し、Linux上でコンパイル・実行するというスムーズな開発フローを実現できる。

以上の理由から、WSLの利用を強く推奨する。


Step 1: WSLのインストールと初期設定

まず、Windows上にLinux環境を構築する。

  1. WSLのインストール (Windows PowerShell) PowerShellまたはコマンドプロンプト管理者として起動し、以下のコマンドを実行する。これにより、WSLとデフォルトのLinuxディストリビューションであるUbuntuがインストールされる。

    wsl --install
    

    インストール完了後、PCの再起動を求められる場合がある。再起動後、Ubuntuのターミナルが自動的に起動する。

    もし自動で起動しない場合や、手動でUbuntuをインストールしたい場合は、同じくPowerShellで以下のコマンドを実行する。

    wsl --install -d ubuntu
    
  2. Linuxユーザーのセットアップ (Ubuntu Bash) ここからは、起動したWSL (Ubuntu) のターミナル内での作業となる。使用するシェルはbashである。 初回のUbuntu起動時に、ユーザー名とパスワードの設定が求められる。これらはWindowsのログイン情報とは別のもので、Linux環境でのみ使用するため、忘れないように管理する必要がある。

  3. パッケージの更新 インストールが完了したら、まずパッケージリストを最新の状態に更新しておく。

    sudo apt update && sudo apt upgrade
    

    sudoは管理者権限でコマンドを実行するという意味であり、先ほど設定したパスワードの入力が求められる。


Step 2: Intel oneAPI HPC Toolkitのインストール

次に、Fortranコンパイラと数値計算ライブラリMKLを含む Intel oneAPI HPC Toolkit をインストールする。この作業も引き続き WSL (Ubuntu) のbashシェル上で行う。

  1. Intelリポジトリのセットアップ PowerShellまたはコマンドプロンプトを起動後、wslを入力し、bashシェルに切り替える。Intelの公式リポジトリをaptのソースリストに追加する。以下のコマンドを一行ずつ実行すること(参考サイト)。

    # IntelのGPGキーを取得・登録
    wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
    
    
    # oneAPIのリポジトリをaptのソースリストに追加
    echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list 
    
    
    # パッケージリストを更新
    sudo apt update
    
  2. oneAPI Toolkitのインストール GNRコードのコンパイルに必要なBase KitHPC Kitをインストールする。

    sudo apt install intel-basekit
    sudo apt install intel-hpckit
    

    これには少々時間がかかる


Step 3: 環境変数の設定

インストールしたIntel oneAPIのツール(コンパイラやライブラリ)を使えるようにするため、環境変数を設定するスクリプトを実行する。

  1. 一時的な有効化 以下のコマンドを実行すると、現在のbashセッションでIntel Fortranコンパイラが有効になる。

    source /opt/intel/oneapi/setvars.sh
    

    Command not found などのエラーが出なくなったことを確認する。

  2. 設定の永続化 (推奨) ターミナルを起動するたびに上記のコマンドを実行するのは手間であるため、シェルの設定ファイル (.bashrc) に追記して自動で読み込まれるようにする。

    echo "source /opt/intel/oneapi/setvars.sh" >> ~/.bashrc
    source ~/.bashrc
    

    これで、次回以降ターミナルを起動した際に自動的にIntel oneAPIの環境がセットアップされる。


Step 4: Fortranコードのコンパイルと実行

いよいよGNRコードをコンパイルし、実行する。GNRのReplication Packageには複数の計算が含まれているが、ここでは例としてFigure 1を再現するための手順を示す。同様のプロセスで、Table 1など他の結果も再現することが可能である。

  1. ソースコードのディレクトリへ移動 コンパイル作業を行う前に、cd (change directory) コマンドを使って、ソースコードが保存されているフォルダへ移動する。ここでは、WSLのターミナルからWindows上のフォルダへアクセスする方法を説明する。

    ■ WSLからWindowsファイルへのアクセスルール

    WSLでは、Windowsのドライブが /mnt/ という特殊なディレクトリ以下に自動的に接続(マウント)される。

    • Cドライブ/mnt/c
    • Dドライブ/mnt/d

    Windowsのパス C:\Users\user は、WSL上では /mnt/c/Users/user となる。パスの区切り文字が \(バックスラッシュ)から /(スラッシュ)に変わる点に注意が必要である。

    ■ 具体例:Windowsのデスクトップに置いたフォルダへ移動する

    多くの方がファイルを保存しがちな、Windowsのデスクトップを例に見ていく。 仮に、GNR_Code というソースコードフォルダをWindowsのデスクトップに置いたとする。その場合のWindowsパスは通常このようになる。

    C:\Users\<あなたのWindowsユーザー名>\Desktop\GNR_Code

    これをWSLのターミナルから移動するには、以下のコマンドを実行する。

    # <あなたのWindowsユーザー名> の部分は、ご自身のものに書き換えること。
    # 例:ユーザー名が "user" なら cd /mnt/c/Users/user/Desktop/GNR_Code
    cd /mnt/c/Users/<あなたのWindowsユーザー名>/Desktop/GNR_Code
    

    ヒント: Windowsユーザー名がわからない場合、Windowsのエクスプローラーを開き、アドレスバーに %USERPROFILE% と入力してEnterキーを押すと、ユーザーフォルダ(C:\Users\<あなたのWindowsユーザー名>)に移動でき、名前を確認できる。

  2. コンパイル 以下のコマンドを実行して、ソースコードをコンパイルし、MKLライブラリとリンクして実行ファイルを生成する。

    mpiifx -o mc_run -I${MKLROOT}/include/mkl/intel64/ilp64 -i8  -I"${MKLROOT}/include" nrutil.f90 probability.f90 random.f90 minimization.f90 simplex.f90 integration.f90 interpol.f90 globvar.f90 main.f90  ${MKLROOT}/lib/libmkl_blas95_ilp64.a ${MKLROOT}/lib/libmkl_lapack95_ilp64.a ${MKLROOT}/lib/libmkl_scalapack_ilp64.a -Wl,--start-group ${MKLROOT}/lib/libmkl_intel_ilp64.a ${MKLROOT}/lib/libmkl_sequential.a ${MKLROOT}/lib/libmkl_core.a ${MKLROOT}/lib/libmkl_blacs_intelmpi_ilp64.a -Wl,--end-group -lpthread -lm -ldl
    

    コマンド解説:

    • mpiifx: MPI(並列計算の規格)に対応したIntel Fortranコンパイラ(古い、Fortranだとmpiifortである場合がある。実際、大学のスパコンはそうだった。)。
    • -o table1_run: table1_run という名前で実行ファイルを生成する。
    • *.f90: コンパイル対象のソースファイル群である。
    • -I${MKLROOT}/...: MKLのヘッダーファイル(.modファイルなど)が格納されているディレクトリを指定する。
    • -L${MKLROOT}/...: MKLのライブラリファイルが格納されているディレクトリを指定する。
    • -l...: リンクするライブラリを指定する。ここでは、BLAS95、LAPACK95インターフェースやMKLのコアライブラリなどを指定している。リンカフラグの順序が重要になる場合があるため、注意されたい。

    【補足:他の結果を再現する場合】 上記のコマンドは、Figure 1を再現するためのプログラム (main.f90 を中心とする) をコンパイルし、table1_run という実行ファイルを作成する例である。どのソースファイルをコンパイルすべきかといった詳細については、GNRコードに付属のREADMEファイルなどを参照されたい。

  3. 実行 コンパイルが成功すると table1_run という実行ファイルが生成される。以下のコマンドでプログラムを実行する。

    mpirun -np 12 ./table1_run
    
    • mpirun: MPIプログラムを実行するためのコマンドである。
    • -np 12: 12個のプロセスを並列で起動して計算を実行する。この数値は、使用するCPUのコア数に応じて調整すること。
    • ./table1_run: 現在のディレクトリにある table1_run を実行する。

おわりに

以上で、Windows上のWSL環境でFortranコードをコンパイルし、MKLを利用して実行するまでの手順は完了である。筆者はとても苦労したので、この記事が、読者の研究や学習の一助となれば幸いである。