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, 任意) #
- ライセンス: the Intel End User License Agreement, 詳細はLicensing Information for Intel® Software Development Tools.
※Intel oneAPI HPC Toolkit 2025.0 リリースノートにて、Intel Fortran Compiler Classic (ifort) は廃止と明記されています。 ifortではなく、ifxと呼ばれるようになっています。
2.2. 全てのツールがうまくいった場合の流れ #
-
Fortranコードを書きます。例えば次のコードを
main.f90
という名前で保存します。main.f90
Fortranprogram 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
-
ifx
とMKLの準備をするIntel oneAPIの準備をします。
Powershellcmd.exe "/K" '"C:\Program Files (x86)\Intel\oneAPI\setvars.bat" intel64 vs2022 && powershell'
-
Fortranプログラムのコンパイルを行う
Powershellifx /Qmkl=parallel .\main.f90
→
main.exe
が生成されます。※
ifx
での実行ファイルは、デフォルトで(f90の名称).exe
が生成されるようです。 -
実行する
PowershellPS 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版) のインストール #
- Visual Studio Community 2022よりダウンロードを押し、
VisualStudioSetup.exe
を入手します。 - ワークロードの選択では、C++によるデスクトップ開発(Desktop development with C++)のみで十分です。
- インストールします。
インストールが完了したら特にやることはないのでそのまま閉じてしまって結構です。
3.2. 3.2 MKL のインストール #
本稿では、Intel oneAPI HPC ToolkitよりMKLをダウンロードすることを考えます。
Intel oneAPI HPC Toolkitでインストールすることにより、Intel Fortran Complier のインストールも行うことができるようになります。基本的にgfortranよりも高性能(の印象)ですので、ついでにインストールします。
-
Intel® oneAPI HPC Toolkit Downloadよりダウンロードを押し、
intel-oneapi-hpc-toolkit-2025.1.0.665_offline.exe
を入手します。 -
ダウンロードしたexeを実行します。
- インストール時にライセンスが保存できるので、将来のために忘れずに保存しておきましょう。
-
インストールされるライブラリの中に、少なくとも下記の内容が含まれていることを確認します。
- Intel oneAPI Math Kernel Library
- Intel Fortran Compiler
-
インストールを開始します(私は不安でしたので全てのライブラリのインストールを実行しました)。
-
完了後(約20分)、パソコンを再起動します。
3.3. 3.3 Intel Fortran Compiler(ifx)のインストール #
Powershell上でifxを使用する準備をします。
-
ifxのインストール確認
デフォルトでインストールしていれば、下記のパスにifx.exe
があることが確認できます。
C:\Program Files (x86)\Intel\oneAPI\compiler\2025.1\bin\ifx.exe
-
Intel oneAPI の環境設定
下記のコマンドをPowershell上で実行します。Powershellcmd.exe "/K" '"C:\Program Files (x86)\Intel\oneAPI\setvars.bat" intel64 vs2022 && powershell'
こちらを実行することで、初めて
ifx
が使用可能になります。Powershellのコンソールを立ち上げるたびに実行する必要があります。面倒であれば
start_ifx.ps1
などをホームディレクトリに作成し、それを実行するようにすれば良いと思います。私はこうしています。 -
ifxが使用できる準備が整ったか確認
環境変数 “SETVARS_COMPLETED” を確認します。“1” が返ってきたら、Intel Fortran Compiler (ifx) が使用できる準備が整っています。下記のコマンドをPowershellで実行することで環境変数が確認できます。
Powershellecho $Env:SETVARS_COMPLETED
また、ifxのバージョンを確認します。オプションはスラッシュを用います。変な感じがしますが、
ifx /logo
と入力すると確認できます。ifx -version
ではないようです。私の環境では次の通りになりました。PowershellPS 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>
-
Fortranの実行
実際にFortranコードを書いて実行します。
main.f90
という名前で下記のコードを書きます。Fortranprogram hello print *, 'Hello, oneAPI ifx!' end program hello
コンパイルは
ifx main.f90
で行えます。PowershellPS 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
ではないわけです。うれしい変更点です。実行ファイルを実行すると
PowershellPS> .\main.exe Hello, oneAPI ifx! PS>
を得ます。
3.4. ifxでMKLを使用する #
3.4.1. 環境変数MKLROOT
の確認
#
下記のコマンドで、MKLROOT
が設定されているかを確認します。
echo $Env:MKLROOT
デフォルトでインストールしていれば、パスC:\Program Files (x86)\Intel\oneAPI\mkl\latest
が返ってきます。もちろん、setvars.bat
は実行しifxが使用できる状態で行ってください。
3.4.2. 実際のリンク #
MKLへのリンクは次のようにします。
ifx /Qmkl .\main.f90
ヘルプifx /help
で調べますと、リンク方法として以下のオプションが使用可能なようです。
/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で行うか指定できるようですね。
ifx /Qmkl=parallel .\main.f90
3.4.2. MKLで用いるスレッド数の変更 #
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
もちろん、コンパイルは
ifx /Qmkl=parallel .\main.f90
で並列計算の指定してください。 もし、
ifx /Qmkl=sequential .\main.f90
でコンパイルを試みると、コンパイルの段階でmain.obj : error LNK2019: 未解決の外部シンボル OMP_SET_NUM_THREADS が関数 MAIN__ で参照されました
というエラーが出ます。
OpemMP #
CPUで並列計算を行う OpenMP も考えておきましょう。 下記のプログラムで、MKLの並列計算の個数の指定と、openMPの指定ができます。
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
で指定された場所が並列化されます。
ifx /Qmkl=parallel /Qopenmp .\main.f90
実際に行うと、次の結果を得ます。
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
を忘れると、並列計算が行われません。実際、
ifx /Qmkl=parallel .\main.f90
でコンパイルで生成したmain.exe
を実行すると、次の結果を得てしまいます。omp_get_max_threads()
で指定した値が返ってきますが、!$OMP
がコメントとして無視され、実際には並列計算は行われていないということです。
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>