概要
先日Intel oneAPIで作る無償のFortran開発環境を投稿したところ、「あなたの記事を読んでiRIC用のソルバーを開発すると以下のエラーが出ます!」というクレームをいただきました。試してみると私のPCでも同じ問題が。。。ということでこの記事ではその問題解決方法を紹介します。
前提
Intel oneAPIで作る無償のFortran開発環境を読んでIntel OneAPIおよびVisual Studio2019をインストールされている方を対象としています。インストールしていない環境で実行したい場合は、上記をインストールしていただくか、もしくは、Runtimeライブラリをインストールしてください。ダウンロード&インストールするのは、Intel® Fortran Compiler Classic Runtime for Windows*です。
問題
コマンドプロンプトなどVisual Studio2019以外の環境からソルバーを実行すると問題が生じます。つまり、問題はプログラム実行環境です。改めてエラーメッセージを確認すると「ソルバー実行時にダイナミック(動的)にリンクされるべきライブラリが、ライブラリを探すことになっている場所にない」ということが分かります。
実は、Visual Studio2019上でプログラムを実行するとこの問題は生じません。
解決方法
問題の解決方法は、「プログラム実行環境に必要なライブラリのPathを設定する」です。結論以下を設定すると動作します。Intel oneAPIとVisual Studio 2019へのPath設定です。必ずしもすべてが必要になるわけではありませんが、厳選している時間がもったいないので、すべて設定してしましょう。これでコマンドプロンプト上で実行する場合は問題解決です。
しかし、iRICソルバーの場合どうするの?!という話が残ります。この解決策を知りたい方は、このページの下のほうをご確認ください。
set PATH=C:\Users\riverlink\iRIC\guis\prepost;%PATH%;
set PATH=C:\Program Files (x86)\Intel\oneAPI\vpl\latest\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\tbb\latest\env\..\redist\intel64\vc14;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\mpi\latest\env\..\libfabric\bin\utils;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\mpi\latest\env\..\libfabric\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\mpi\latest\env\..\bin\release;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\mpi\latest\env\..\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\mkl\latest\redist\intel64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\intel64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\itac\latest\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\itac\latest\dll;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\ippcp\latest\redist\intel64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\ipp\latest\redist\intel64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Library\mingw-w64\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Library\usr\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Library\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Scripts;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\condabin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\DLLs;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Library\mingw-w64\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Library\usr\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Library\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\Scripts;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\intelpython\latest\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\dpcpp-ct\latest\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\dnnl\latest\cpu_dpcpp_gpu_dpcpp\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\dev-utilities\latest\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\debugger\latest\gdb\intel64\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\dal\latest\redist\intel64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\bin\intel64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\redist\intel64_win\compiler;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib\oclfpga\host\windows64\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib\oclfpga\llvm\aocl-bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib\oclfpga\windows64\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib\oclfpga\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\advisor\latest\bin64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib\oclgpu;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\ioc\bin;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\compiler\latest\windows\lib\ocloc;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\inspector\latest\bin64;%PATH%
set PATH=C:\Program Files (x86)\Intel\oneAPI\vtune\latest\bin64;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\IntelliCode\CLI;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\HostX64\x64;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\VC\VCPackages;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\bin\Roslyn;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Performance Tools\x64;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Team Tools\Performance Tools;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\vs2019\x64;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\vs2019;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\devinit;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin;%PATH%
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\Ninja;%PATH%
set PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64;%PATH%
set PATH=C:\Program Files (x86)\Windows Kits\10\bin\x64;%PATH%
set PATH=C:\Windows\Microsoft.NET\Framework64\v4.0.30319;%PATH%
iRIC ソルバーをバッチファイルで動作させる
iRICソルバー コマンドプロンプト上で動かす・バッチファイルで操作するの記事にも書きましたが、iRICのソルバーはバッチファイルで動かすことができます。最初のパス設定の部分に上記set ***を追加すると、実行環境を整えることができます。チャレンジしてみてください。
まとめ
今回の問題は、プログラム実行環境にInte oneAPIのライブラリへのPathが正しく設定されていないことで生じていました。そのため、プログラム実行環境に正しくPathを設定することで問題を解決することができました。
ライブラリへのPath設定は頻繁に問題を生じさせます。Intel Fortranの場合、Parallel Studioのバージョンごとにライブラリセットが存在しており、プログラム実行環境を作るためには、Intel® C++ and Fortran Compilers Redistributable Libraries by Versionから適当なインストーラーをダウンロード&インストール&Path設定する必要があります。
複数のParallel Studioのバージョンが入っている場合、Path設定方法に依存していずれかが有効になりますが、適当にライブラリを利用するためには上でやったように、プログラム実行直前にバッチファイルの中で指定するのが良いかと思います。また混乱を避けるためにも、利用しなくなったバージョンのライブラリは削除してくのが良いかと思います。