覚え書き: cmdstanr+OpenCLでGPUをうまく使えたり使えなかったり (Windows-Intel編)

 cmdstanrパッケージでOpenCLを経由してGPUを使う方法についての試行錯誤の記録、前回のWindows+NVIDIA編に続く第二弾。こんどはWindows+Intel。実のところ、前回記事にまとめた実験の途中で、PC再起動などで手が空いた時間にノートPCでも試してみた、といういきさつである。
 気をとりなおして頑張ろう!

目次

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と比べてスピードが高くなるとは思えない」とのことである。
 つまり、野望を達成できたところであまり良いことはないってことらしい。あきらめよう... あのぶどうは酸っぱいにちがいない...