先日古い友達からGPUについて質問あり。年寄はGPU素人なのに語ってしまったデス、無責任。それもあり、GPGPUプログラミング再開すべしと。質問はNVIDIAだったのだけれど眠っているJetsonの再開には物理障壁あり、そこでパソコン上でIntel GPUを試みるべしと。先達の皆さまのお陰により開始するのは簡単。
※「やっつけな日常」投稿順 Index はこちら
※使用しているPCは Windows11 Home機。Alder Lake世代(第12世代)のi5-1235U搭載っす。
Windows11上のドライバをまず確認
もしかすると、何もインストールなどせずともOpenCL3.0の「実行」はできるようになっているんでないの?ということで、確認です。まずディスプレイのドライバから。デバイス・マネージャで見てみます。
当然、Intelの内蔵GPU Iris Xe のドライバがインストールされてます。
そのプロパティを見てみると、ドライバは5か月ほど前のものでした。少なくともPCを購入した後、1回は更新されているみたいデス。まあ良いのでないの。
そして、ドライバファイルの詳細を開いたところ、見つけました。OpenCL.dllとな。
これは、Windows上に実行環境は既に入っている雰囲気満々。
WSL2上のUbuntuからOpenCLを使う
プログラムを書くためにまず思いついたのは、普段からお世話になっているWSL2上のUbuntuから使う方法です。「昔、WSLはGPUに仕事をお願いできなかったけれども、最近のWSL2はお願いできる」という話をどこかで小耳に挟んでいたからデス。以下のMicroSoft社のブログ記事を見つけました。
OneAPI/L0, OpenVINO and OpenCL coming to the Windows Subsystem for Linux for Intel GPUs
これを読むと簡単にできそうな、そうでもないような。。。少なくともホストのWindows11側は「実行環境既に整っている」雰囲気バリバリなので、Ubuntu側の「受け入れ態勢」のみかと。
Ubuntuは人気なので関連ありそうな記事多数。WSL2内でないUbuntu上でOpenCLを使うための記事を書いていらっしゃる先達の方がいらっしゃいました。「試行錯誤な日々」様の以下記事が大変参考になりました。ありがとうございます。
UbuntuでIntelのCPUに内蔵されているGPUをOpenCLで使う方法
ただし、当方ではWSL2内で使用しているUbuntuが20.04LTSということが一点問題を引き起こしたです(現時点でLTS版の最新は22.04LTSだと思う。新しいのであればaptでも大丈夫?微妙。)
当方の20.04LTS上でも、わざわざインテルのページからUbuntu用のランタイムをダウンロードしなくても以下のようにすればインストールそのものは可能でした。
$ sudo apt install intel-opencl-icd $ sudo apt install ocl-icd-opencl-dev
上記をインストールすれば、先達の方が用意してくださっているサンプルソースをコンパイルすることも可能でした(以下の1行をソースの頭のほうに追加する必要はあり。)
#define CL_TARGET_OPENCL_VERSION 210
ビルドすれば、ノーエラー、実行オブジェクトのa.out もできてます。しかし、Hello Worldする筈がお返事なしです。なぜかと調べると、どうも20.04LTSのレポジトリにある
intel-opencl-icd
が第12世代に対応していない疑いが出てまいりました。そのため手元のPCではインテルGPUの存在に気づいてない?みたいです。念のため、clinfoに聞いてみると以下のようなお返事。プラットフォームは0個だと。なお、clinfo使う場合は別途aptで入れる必要があります。
しかたがないので、aptでRuntimeを入れるのを諦め、インテルの以下のドキュメント
Intel(R) Graphics Compute Runtime for oneAPI Level Zero and OpenCL(TM) Driver
からたどれる「Alder Lake世代」をサポートしている新しいランタイムを拾ってくることにしました。結局 apt で楽は出来んと。今回拾ってきた先は以下です。
そこに書いてある手動インストールの手順通りに(ステップ多くてメンドクセーですが)入れました。もう一度 clinfoを試みると、その出力の先頭部が以下に。
ちゃんとインテルGPUをWSL2上のclinfoが認識しているじゃん。やったね。しかしそうは問屋が卸さないのであります。clinfoの出力末尾が以下に。
おっと、冒頭でOpenCL 3.0とプラットフォームを認識しているにも関わらず、末尾のNOTEでは、OpenCL 2.1 しか使えんと。そうです apt で入れたもう一つの片割れ、OpenCLのDEVパッケージが古いみたいです。
ocl-icd-opencl-dev
「やっつけ」なので、この件は見なかったことにしてサンプルプログラムをビルドして走らせてみます。Hello Worldするじゃん。2.1だけれども。
MSYS2上のgccからOpenCLを使う
WSL2上からOpenCLを使えることは確認できましたが、本来バージョンの3.0も使いて~です。それであれば「ネイティブな」Windows11上でビルドすればいいんじゃね。ただしWSL2同様にgcc使いたいデス。MSYS2環境でやるしかないか。するとこれまた先達の方がやられてました。「koturnの日記」様の以下の記事です。
上記の記事通りの手順どおりで、何も考えず MSYS2上でのビルドに成功してしまいました。あざーす。ただし、例によって用意していただいているサンプルプログラムの冒頭に以下1行を追加してます。
#define CL_TARGET_OPENCL_VERSION 300
手順通りにサンプルプログラムをビルドすると以下のような警告メッセージがでました。オブジェクトそのものは出来ていたので、今回は追及せず。やっつけ。
インテルGPU、OpenCL 3.0で動作しておる、と。感謝感激、皆、先達の方々のお陰であります。