cmdstanrパッケージでOpenCLを経由してGPUを使う方法についての試行錯誤の記録、前回のWindows+NVIDIA編に続く第二弾。こんどはWindows+Intel。実のところ、前回記事にまとめた実験の途中で、PC再起動などで手が空いた時間にノートPCでも試してみた、といういきさつである。
気をとりなおして頑張ろう!
目次
- Case 11: Win10, R4.3.1, Rtools 4.3, cmdstan2.32.2, OpenCLなし, 成功
- Case 12: Win10, R4.3.1, Rtools 4.3, cmdstan2.32.2, OpenCL(Intel), 失敗
- そもそも努力する意味はあるのか
Case 11: Win10, R4.3.1, Rtools 4.3, cmdstan2.32.2, OpenCLなし, 成功
まずはベンチマークとして、OpenCLを使わない場合の時間を計ってみる。
- Windows 10 Home (22H2)
- R 4.3.1
- Rtools 4.3.5550
- cmdstanrパッケージ 0.5.3開発版
- cmdstan 2.32.2
- モデルのコンパイル。前回記事Case 2と同じ。
- サンプリング。無事終了。所要時間は418秒であった。
Case 12: Win10, R4.3.1, Rtools 4.3, cmdstan2.32.2, OpenCL(Intel), 失敗
いよいよOpenCLの登場。
- Windows 10 Home (22H2)
- Intel Iris Xe, ドライバ 31.0.101.4575
- Intelの説明によれば、OpenCLランタイムはグラフィック・ドライバに同梱されているらしい。なんだかよくわからんので、「インテル ドライバー & サポート アシスタント」をインストールしてドライバが最新であることを確認し、念のために「Intel SDK for OpenCL Applications」(2020.3.494)もいれてみた。
- R 4.3.1
- Rtools 4.3.5550
- cmdstanrパッケージ 0.5.3開発版
- いよいよ、cmdstan (2.32.2)のインストールである。
Windowsの場合、OpenCLライブラリの場所を指定しなければならないのだが、どこを指定すればいいのかわからない。OpenCLと名の付くファイルを探したが、NVIDIAの場合と異なり。OpenCL.libというファイルはどこにもない。
仕方がないので、C:/Windows/System32/OpenCL.dll
がそれだと考えることにした。path_to_opencl_lib <- "C:/Windows/System32/" cpp_options = list( # "CXXFLAGS += -fpermissive", # "PRECOMPILED_HEADERS"=FALSE, paste0("LDFLAGS+= -L\"",path_to_opencl_lib,"\" -lOpenCL") ) install_cmdstan(cores = 4, cpp_options = cpp_options, overwrite = TRUE)
コンパイル中になんだかやばそうな赤字のエラーが山ほど出てくる。こんな感じ。
g++ -c -MMD -O2 -DUSE_WINTHREAD -D_WIN32_WINNT=0x0502 -DMINGW_HAS_SECURE_API=1 -D__MSVCRT_VERSION__=0x0700 -msse -mthreads -m64 -mrtm -D_UCRT -DTBB_SUPPRESS_DEPRECATED_MESSAGES=1 -fno-rtti -fno-exceptions -D__TBBMALLOC_BUILD=1 -Wno-parentheses -Wno-uninitialized -Wno-non-virtual-dtor -flifetime-dse=1 -I../tbb_2020.3/src -I../tbb_2020.3/src/rml/include -I../tbb_2020.3/include -I../tbb_2020.3/src/tbbmalloc -I../tbb_2020.3/src/tbbmalloc ../tbb_2020.3/src/tbbmalloc/backref.cpp (ここから赤字) C:/rtools43/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: msvcrt_dll_d000026.o:(.idata$5+0x0): multiple definition of `__imp___C_specific_handler'; KERNEL32_dll_d000023.o:(.idata$5+0x0): first defined here C:/rtools43/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/rtools43/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../lib/crt2.o: in function `pre_c_init': C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:114: undefined reference to `__p__fmode' (中略) collect2.exe: error: ld returned 1 exit status (中略。黒字に戻って) Warning message: There was a problem during installation. See the error message(s) above.
- だめもとで、モデルのコンパイル。コードはCase 1と同じ。例によってたくさんメッセージがでるのだが、結局エラーで止まってしまった。こんな感じ。
g++ -Wno-nonnull -D_UCRT -Wno-deprecated-declarations -std=c++1y -m64 -D_REENTRANT -Wall -Wno-unused-function -Wno-uninitialized -Wno-unused-but-set-variable -Wno-unused-variable -Wno-sign-compare -Wno-unused-local-typedefs -Wno-int-in-bool-context -Wno-attributes -Wno-ignored-attributes -I stan/lib/stan_math/lib/opencl_3.0.0 -I stan/lib/stan_math/lib/tbb_2020.3/include -O3 -I src -I stan/src -I stan/lib/rapidjson_1.1.0/ -I lib/CLI11-1.9.1/ -I stan/lib/stan_math/ -I stan/lib/stan_math/lib/eigen_3.4.0 -I stan/lib/stan_math/lib/boost_1.78.0 -I stan/lib/stan_math/lib/sundials_6.1.1/include -I stan/lib/stan_math/lib/sundials_6.1.1/src/sundials -D_USE_MATH_DEFINES -DBOOST_DISABLE_ASSERTS -DSTAN_OPENCL -DOPENCL_DEVICE_ID=0 -DOPENCL_PLATFORM_ID=0 -DCL_HPP_TARGET_OPENCL_VERSION=120 -DCL_HPP_MINIMUM_OPENCL_VERSION=120 -DCL_HPP_ENABLE_EXCEPTIONS -Wno-ignored-attributes -DINTEGRATED_OPENCL=0 -L"C:/Windows/System32/" -lOpenCL -Wl,-L,"C:/Users/ono/Documents/.cmdstan/cmdstan-2.32.2/stan/lib/stan_math/lib/tbb" -Wl,-rpath,"C:/Users/ono/Documents/.cmdstan/cmdstan-2.32.2/stan/lib/stan_math/lib/tbb" C:/Users/ono/AppData/Local/Temp/Rtmp23d7Po/model-acc1ba6c1a.o src/cmdstan/main_opencl.o -static-libgcc -static-libstdc++ -Wl,-L,"C:/Users/ono/Documents/.cmdstan/cmdstan-2.32.2/stan/lib/stan_math/lib/tbb" -Wl,-rpath,"C:/Users/ono/Documents/.cmdstan/cmdstan-2.32.2/stan/lib/stan_math/lib/tbb" -lOpenCL stan/lib/stan_math/lib/sundials_6.1.1/lib/libsundials_nvecserial.a stan/lib/stan_math/lib/sundials_6.1.1/lib/libsundials_cvodes.a stan/lib/stan_math/lib/sundials_6.1.1/lib/libsundials_idas.a stan/lib/stan_math/lib/sundials_6.1.1/lib/libsundials_kinsol.a stan/lib/stan_math/lib/tbb/tbb.dll -o C:/Users/ono/AppData/Local/Temp/Rtmp23d7Po/model-acc1ba6c1a.exe (ここから赤字) C:/rtools43/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exeC:/rtools43/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe : msvcrt_dll_d000030.o:(.idata$5+0x0): multiple definition of `__imp___C_specific_handler'; KERNEL32_dll_d000027.o:(.idata$5+0x0): first defined here (中略) collect2.exe: error: ld returned 1 exit status collect2.exe: error: ld returned 1 exit status (中略、黒字に戻って) Error: An error occured during compilation! See the message above for more information.
Web上で検索すると、NVIDIAのGPUでStan+OpenCLという記事はみかけるが、IntelのGPUについてはほぼ見当たらない。うーん、これは私の手には負えないな...
そもそも努力する意味はあるのか
[2023/07/27追記] 上述のように、IntelのGPUでOpenCLを使ってStanで並列計算という野望は頓挫した次第だが、 スロベニアの研究者のみなさんが作っている解説によれば、「最近のIntel GPUはOpenCLをサポートしているが、その倍精度数でのパフォーマンスからみて、CPUと比べてスピードが高くなるとは思えない」とのことである。
つまり、野望を達成できたところであまり良いことはないってことらしい。あきらめよう... あのぶどうは酸っぱいにちがいない...