CUDA LLVM, PoCL
HPCLLVM
2023-8-25 15:33 JST

Ubuntu の 20.04 がアップデートを繰り返すうちに Cuda が使えなくなった。そこで、11.6 から 12.2 へアップデートすることにした。

CUDA

まずは関連しそうなものすべてを削除。ドライバは 525 だった。削除後 reboot。

sudo apt remove \
    libnvidia-cfg1-525 \
    libnvidia-compute-525 \
    nvidia-compute-utils-525 \
    nvidia-dkms-525 \
    nvidia-kernel-common-525 \
    nvidia-kernel-source-525 \
    nvidia-utils-525 \
    xserver-xorg-video-nvidia-525

そして、535 をインストール。これでいいのかは不明。

sudo apt install /
    libnvidia-cfg1-535 /
    libnvidia-compute-535 /
    nvidia-compute-utils-535 /
    nvidia-dkms-535 /
    nvidia-kernel-common-535 /
    nvidia-compute-utils-535 /
    xserver-xorg-video-nvidia-535

実はすげー試行錯誤している。その後、CUDA を公式ダウンロードサイトから導入。本当は11.7を入れようとしたのだが、色々間違えて最新のものをインストールしてしまった。動いているから良しとする。

LLVM 16

数日前と同じ要領で LLVM 16 を入れる。llvm-spirv が今回は入っている。どうも llvm/projects の下に入れたものが自動的に入るようだ。だとしたら、シンボリックリンクして LLVM_ENABLE_PROJECTS いらねんじゃね?と思って後で試したらうまく行かんかった。当面はこの方法でいく。

$ mkdir Work
$ cd Work
$ git clone https://github.com/llvm/llvm-project.git
$ cd llvm-project/llvm/projects/
$ git clone https://github.com/KhronosGroup/SPIRV-LLVM-Translator.git
$ cd ..
$ git tag
$ git checkout -b llvmorg-16.0.6 llvmorg-16.0.6
$ cd projects/SPIRV-LLVM-Translator/
$ git tag
$ git checkout -b v16.0.0 v16.0.0
$ cd ../../..
$ mkdir build-v16-with-llvm-spirv-without-lld
$ cd build-v16-with-llvm-spirv-without-lld
$ cmake -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DCMAKE_INSTALL_PREFIX=~/Work/root -DLLVM_ENABLE_PROJECTS=lld\;clang\;polly -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -G Ninja ../llvm
$ ninja install
$ cd ..
$ mkdir build-v16-with-llvm-spirv
$ cd build-v16-with-llvm-spirv
$ cmake -DLLVM_USE_LINKER=lld -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DCMAKE_INSTALL_PREFIX=~/Work/root -DLLVM_ENABLE_PROJECTS=lld\;clang\;polly -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -G Ninja ../llvm

$ cmake -DLLVM_USE_LINKER=lld -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DCMAKE_INSTALL_PREFIX=~/Work/root -DLLVM_ENABLE_PROJECTS=lld\;clang\;polly -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -G Ninja ../llvm

lld がなかったので、最初に lld なしで、つぎに lld ありで再インストールしている。今回は Release で build。

PoCL

PoCL も同様にビルドそしてインストール。

$ cmake -DCMAKE_INSTALL_PREFIX=~/Work/root -DENABLE_CUDA=ON -GNinja ..
$ ninja 
$ ninja install

ついでにできた libpoclu.a と poclu.h も手でコピーする。毎回 -GNinja するのめんどくさいので、.bashrc にexport CMAKE_GENERATOR=Ninjaと追加。

過去に作ったアプリを実行してみる。OCL_ICD_VENDORS とか LD_LIBRARY_PATH の設定を忘れないようにする。

$ export OCL_ICD_VENDORS=~/Work/root/etc/OpenCL/vendors/
$ export LD_LIBRARY_PATH=~/Work/root/lib
$ _build/template_gemm_pocl0 _build/template_gemm_pocl0.spv
:+ OpenCL initialisation ...
 |  Using platform: Portable Computing Language
 |  Using device:   NVIDIA GeForce RTX 3060
 - (ok)

poclu_load_program:0
Average:206.978 GFlops, 2.2839
:+ Check Result ...
 |  ok_n:1048576 ng_n:0
 - (ok)

うまくいったようだ。