Intel MKLとifxの利用

Intel MKLとifxの利用 #

Intel MKLを用いる環境を整えます。導入過程で、intel fortran compiler (ifx)とOpenMPの環境も導入可能になりますので記載します。

1. 実行環境 #

下記の環境で実施しています。

種類 情報、バージョン コマンド
OS Windows 11 Home 64-bit, 24H2
CPU Intel Core Ultra 7 265K
CPU アーキテクチャ x86_64 uname -m (WSL)
Powershell 5.1.26100.3624 $PSVersionTable (PS)

2. 全体の流れ #

2.1. 必要なツールのインストール #

2.1.1. Intel MKL (oneAPI Math Kernel Library) #

ダウンロード1, ダウンロード2のどちらかを選択できます。

  • ダウンロード1: Intel® oneAPI HPC Toolkit Download

    • 本稿ではこちらをインストールします
    • Visual Studio統合や複数のoneAPIライブラリを同時利用したい場合
    • オフライン環境での一括インストールが必要な場合
  • ライセンス Intel Simplified Software License (Oct 2022)

    • Intel Simplified Software License(2022年10月版以降)
    • 商用・非商用 問わず無償で利用可能
    • 製品への組み込み・再配布を許諾(非独占的、全世界的ライセンス)
    • 禁止事項: リバースエンジニアリング、SaaS提供、著作権表示削除等は禁止
  • 主な要件:

    • OS: Windows 10/11, Windows Server 2019/2022/2025
    • 開発環境:
      • Visual Studio 2019/2022 (“Desktop development with C++”)
      • oneAPI DPC++/C++ Compiler 2025

2.1.2. Visual Studio Community 2022 #

  • ダウンロード: Visual Studio Community 2022

  • ライセンス: License Terms | Microsoft Visual Studio Community 2022

    • 個人開発者: 商用・非商用問わず無制限利用可
    • 非エンタープライズ組織 (PC数<250または年収<100万USD): 最大5ユーザーまで利用可
    • エンタープライズ組織 (PC数>250か年収>100万USD): OSS貢献・学術研究・教育環境など特定シナリオのみ利用可
    • 商用利用は「直接または間接の金銭的利益を得る目的での利用」と定義
  • 主な要件:

    • OS: Windows 10 (v1909以降), Windows 11, Windows Server 2016/2019/2022

2.1.3. Intel Fortran Compiler (ifx, 任意) #

※Intel oneAPI HPC Toolkit 2025.0 リリースノートにて、Intel Fortran Compiler Classic (ifort) は廃止と明記されています。 ifortではなく、ifxと呼ばれるようになっています。

2.2. 全てのツールがうまくいった場合の流れ #

  1. Fortranコードを書きます。例えば次のコードを main.f90 という名前で保存します。

    main.f90
    Fortran
    program main
        use mkl_service
        implicit none
        integer :: mkl_nt
        call mkl_set_num_threads(4) ! 以降の MKL 関数は最大 4 スレッドで実行
    
        ! 設定が反映されているか問い合わせ
        mkl_nt = mkl_get_max_threads()
        print *, 'MKL threads:', mkl_nt
    end program main
  2. ifxとMKLの準備をする

    Intel oneAPIの準備をします。

    Powershell
    cmd.exe "/K" '"C:\Program Files (x86)\Intel\oneAPI\setvars.bat" intel64 vs2022 && powershell'
  3. Fortranプログラムのコンパイルを行う

    Powershell
    ifx /Qmkl=parallel .\main.f90

    main.exeが生成されます。

    ifxでの実行ファイルは、デフォルトで(f90の名称).exeが生成されるようです。

  4. 実行する

    Powershell
    PS C:\work\fortran\test> .\main.exe
    MKL threads:           4
    PS C:\work\fortran\test>

3. 具体的な導入手順 #

Intel MKL (以降、MKLと略します) の必要要件として、Windows: Microsoft Visual Studioが要求されています。そのため、まずこちらをダウンロード・インストールしてからMKLを導入する、という流れになります。

Visual studio (以降、VSと略します) の導入理由としては、恐らくですが次の追加などの作業を自動化するためです。

  • include/libディレクトリの追加
  • MSVCランタイム(CRT)やOpenMPランタイム(libiomp5md.dll)のパス設定

VSを利用すれば、VSのプロパティダイアログを利用して行うことができるため、これらが自動的に設定されます。

では具体的にVSとMKLのインストールを行っていきます。

3.1. Visual Studio (Community版) のインストール #

  1. Visual Studio Community 2022よりダウンロードを押し、VisualStudioSetup.exeを入手します。
  2. ワークロードの選択では、C++によるデスクトップ開発(Desktop development with C++)のみで十分です。
  3. インストールします。

インストールが完了したら特にやることはないのでそのまま閉じてしまって結構です。

3.2. 3.2 MKL のインストール #

本稿では、Intel oneAPI HPC ToolkitよりMKLをダウンロードすることを考えます。

Intel oneAPI HPC Toolkitでインストールすることにより、Intel Fortran Complier のインストールも行うことができるようになります。基本的にgfortranよりも高性能(の印象)ですので、ついでにインストールします。

  1. Intel® oneAPI HPC Toolkit Downloadよりダウンロードを押し、intel-oneapi-hpc-toolkit-2025.1.0.665_offline.exeを入手します。

  2. ダウンロードしたexeを実行します。

    • インストール時にライセンスが保存できるので、将来のために忘れずに保存しておきましょう。
  3. インストールされるライブラリの中に、少なくとも下記の内容が含まれていることを確認します。

    • Intel oneAPI Math Kernel Library
    • Intel Fortran Compiler
  4. インストールを開始します(私は不安でしたので全てのライブラリのインストールを実行しました)。

  5. 完了後(約20分)、パソコンを再起動します。

3.3. 3.3 Intel Fortran Compiler(ifx)のインストール #

Powershell上でifxを使用する準備をします。

  1. ifxのインストール確認
    デフォルトでインストールしていれば、下記のパスにifx.exeがあることが確認できます。
    C:\Program Files (x86)\Intel\oneAPI\compiler\2025.1\bin\ifx.exe

  2. Intel oneAPI の環境設定
    下記のコマンドをPowershell上で実行します。

    Powershell
    cmd.exe "/K" '"C:\Program Files (x86)\Intel\oneAPI\setvars.bat" intel64 vs2022 && powershell'

    こちらを実行することで、初めてifxが使用可能になります。Powershellのコンソールを立ち上げるたびに実行する必要があります。

    面倒であればstart_ifx.ps1などをホームディレクトリに作成し、それを実行するようにすれば良いと思います。私はこうしています。

  3. ifxが使用できる準備が整ったか確認

    環境変数 “SETVARS_COMPLETED” を確認します。“1” が返ってきたら、Intel Fortran Compiler (ifx) が使用できる準備が整っています。下記のコマンドをPowershellで実行することで環境変数が確認できます。

    Powershell
    echo $Env:SETVARS_COMPLETED

    また、ifxのバージョンを確認します。オプションはスラッシュを用います。変な感じがしますが、ifx /logoと入力すると確認できます。ifx -versionではないようです。私の環境では次の通りになりました。

    Powershell
    PS C:\Users\username> ifx -logo
    Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2025.1.0 Build 20250317
    Copyright (C) 1985-2025 Intel Corporation. All rights reserved.
    
    ifx: command line warning #10006: ignoring unknown option '/-version'
    ifx: command line error: no files specified; for help type "ifx /help"
    PS C:\Users\username>
  4. Fortranの実行

    実際にFortranコードを書いて実行します。

    main.f90という名前で下記のコードを書きます。

    Fortran
    program hello
        print *, 'Hello, oneAPI ifx!'
    end program hello

    コンパイルはifx main.f90で行えます。

    Powershell
    PS C:\work\fortran\sample\hello_world> ifx .\main.f90
    Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2025.1.0 Build 20250317
    Copyright (C) 1985-2025 Intel Corporation. All rights reserved.
    
    Microsoft (R) Incremental Linker Version 14.43.34810.0
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    -out:main.exe
    -subsystem:console
    main.obj
    PS C:\work\fortran\sample\hello_world>

    すると、main.exeという名称で保存されます。gfortranや昔のifortのように、a.exeまたはa.outではないわけです。うれしい変更点です。

    実行ファイルを実行すると

    Powershell
    PS> .\main.exe
    Hello, oneAPI ifx!
    PS>

    を得ます。

3.4. ifxでMKLを使用する #

3.4.1. 環境変数MKLROOTの確認 #

下記のコマンドで、MKLROOTが設定されているかを確認します。

Powershell
echo $Env:MKLROOT

デフォルトでインストールしていれば、パスC:\Program Files (x86)\Intel\oneAPI\mkl\latest が返ってきます。もちろん、setvars.batは実行しifxが使用できる状態で行ってください。

3.4.2. 実際のリンク #

MKLへのリンクは次のようにします。

Powershell
ifx /Qmkl .\main.f90

ヘルプifx /helpで調べますと、リンク方法として以下のオプションが使用可能なようです。

Txt
/Qmkl[:<arg>]
          link to the Intel(R) Math Kernel Library (Intel(R) MKL) and bring
          in the associated headers
            parallel - link using the threaded Intel(R) MKL libraries. This
                         is the default when /Qmkl is specified
            sequential - link using the non-threaded Intel(R) MKL libraries
            cluster - link using the Intel(R) MKL Cluster libraries plus
                         the sequential Intel(R) MKL libraries

下記のように使用します。MKLを並列で行うか、1つのスレッドで行うか、Clusterで行うか指定できるようですね。

Powershell
ifx /Qmkl=parallel .\main.f90

3.4.2. MKLで用いるスレッド数の変更 #

Fortranプログラムの中で下記のように指定するだけでスレッド数を指定することができます。

Fortran
program main
    use mkl_service
    implicit none
    integer :: mkl_nt

    call mkl_set_num_threads(4) ! 以降の MKL 関数は最大 4 スレッドで実行

    ! 設定が反映されているか問い合わせ
    mkl_nt = mkl_get_max_threads()
    print *, 'MKL threads:', mkl_nt

    ! ... your MKL program
end program main

関数mkl_get_max_threadsの説明は、次の公式ドキュメントに記載があります。

mkl_get_max_threads -Developer Reference for Intel® oneAPI Math Kernel Library for Fortran

もちろん、コンパイルは

Powershell
ifx /Qmkl=parallel .\main.f90

で並列計算の指定してください。 もし、

Powershell
ifx /Qmkl=sequential .\main.f90

でコンパイルを試みると、コンパイルの段階でmain.obj : error LNK2019: 未解決の外部シンボル OMP_SET_NUM_THREADS が関数 MAIN__ で参照されましたというエラーが出ます。

OpemMP #

CPUで並列計算を行う OpenMP も考えておきましょう。 下記のプログラムで、MKLの並列計算の個数の指定と、openMPの指定ができます。

Fortran
program main
    use omp_lib
    use mkl_service
    implicit none
    integer :: omp_nt
    integer :: mkl_nt
    integer :: tid, nthreads

    call mkl_set_num_threads(4) ! 以降の MKL 関数は最大 4 スレッドで実行
    ! 設定が反映されているか問い合わせ
    mkl_nt = mkl_get_max_threads()
    print *, 'MKL threads:', mkl_nt

    call omp_set_num_threads(6) ! OpenMP 並列領域を 6 スレッドで実行
    ! 設定が反映されているか問い合わせ
    omp_nt = omp_get_max_threads()
    print *, 'OpenMP threads:', omp_nt

    ! 並列領域の開始:スレッド数は環境変数 OMP_NUM_THREADS または omp_set_num_threads で制御
    !$OMP PARALLEL PRIVATE(tid)
    tid = omp_get_thread_num() ! スレッド番号(0~)を取得
    if (tid .eq. 0) then
        nthreads = omp_get_num_threads() ! スレッド総数を取得
        print *, 'Number of threads = ', nthreads
    end if
    print *, 'Hello from thread ', tid
    !$OMP END PARALLEL

end program main

コンパイルは次のコマンドです。/QopenmpがOpenMPを使用するフラグです。こちらを用いることで、!$OMPで指定された場所が並列化されます。

Powershell
ifx /Qmkl=parallel /Qopenmp .\main.f90

実際に行うと、次の結果を得ます。

Powershell
PS C:\work\fortran\test_openmp> .\main.exe
 MKL threads:           4
 OpenMP threads:           6
 Number of threads =            6
 Hello from thread            1
 Hello from thread            2
 Hello from thread            0
 Hello from thread            3
 Hello from thread            4
 Hello from thread            5
PS C:\work\fortran\test_openmp>

もし、コンパイルオプション/Qopenmpを忘れると、並列計算が行われません。実際、

Powershell
ifx /Qmkl=parallel .\main.f90

でコンパイルで生成したmain.exeを実行すると、次の結果を得てしまいます。omp_get_max_threads()で指定した値が返ってきますが、!$OMPがコメントとして無視され、実際には並列計算は行われていないということです。

Fortran
PS C:\work\fortran\test_openmp> .\main.exe
 MKL threads:           4
 OpenMP threads:           6
 Number of threads =            1
 Hello from thread            0
PS C:\work\fortran\test_openmp>