Then Notes 隨筆

PoCL 編譯安裝並啟用 CUDA 支援

Introduction

Portable Computing Language (PoCL) 是一個 OpenCL 標準的開源實作。最近筆者被同學問到如何編譯 PoCL 的問題,雖然這方面並非筆者熟悉的領域,但還是嘗試將建置的過程記錄一下。本文將說明如何編譯 PoCL 並啟用 CUDA (Compute Unified Device Architecture) 的支援,並假設您已預先安裝好 Docker 環境、NVIDIA 的驅動程式與 NVIDIA Container Toolkit

編譯環境

您可能會問,為什麼不把 PoCL 的下載與安裝寫進 Dockerfile?當然可以這麼做,而且本來就該這麼做!只是因為筆者想要在本文中強調編譯的過程,不然文章就一個 Dockerfile 就可以寫完了,所以這裡只建完所需的編譯環境而已,您可以自行把後面所有下載、編譯建置步驟依需求寫進 RUNCMD 裡 (如果您要在 RUN 編譯,理論上可能會需要設定 nvidia-container-runtime,但這部分筆者還沒有時間實際研究過)。

Dockerfile

這邊我們以編譯 PoCL 3 來說,其支援的 LLVM 版本是 14。筆者所用的 CUDA 版本是 11.7.1,您可能要針對自己的版本來調整 nvidia/cuda:11.7.1-devel-ubuntu22.04

Docker Hub: https://hub.docker.com/r/nvidia/cuda

FROM nvidia/cuda:11.7.1-devel-ubuntu22.04
ARG LLVM_VERSION=14
RUN apt update
RUN apt upgrade -y
RUN apt install -y software-properties-common wget
RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
RUN add-apt-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-${LLVM_VERSION} main" && apt update
RUN apt install -y build-essential ocl-icd-libopencl1 cmake git pkg-config libclang-${LLVM_VERSION}-dev clang llvm-${LLVM_VERSION} make ninja-build ocl-icd-libopencl1 ocl-icd-dev ocl-icd-opencl-dev libhwloc-dev zlib1g zlib1g-dev clinfo dialog apt-utils libxml2-dev libclang-cpp${LLVM_VERSION}-dev libclang-cpp${LLVM_VERSION} llvm-${LLVM_VERSION}-dev
CMD ["/bin/bash"]

建置 Docker image

$ docker build -t ubuntu-cuda-llvm . --no-cache

編譯 PoCL

啟動 container,一定要加上 --gpus all 的參數,這樣在 container 中才可以使用 GPU。參數的詳細說明可以在 NVIDIA 的說明文件中找到。

$ docker run --gpus all -it ubuntu-cuda-llvm /bin/bash
cd /home

git clone https://github.com/pocl/pocl
cd pocl

mkdir build
cd build

在編譯前,可以先檢查一下 GPU 有沒有正確被讀到

nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01    Driver Version: 515.65.01    CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
|  0%   40C    P8    19W / 370W |      1MiB / 12288MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

請您確定目前在 pocl/build 目錄中,再來就可以使用 CMake 設定一下參數,其中的 -DENABLE_CUDA=ON 代表要啟用 PoCL 的 CUDA 支援。

cmake -DENABLE_CUDA=ON -DWITH_LLVM_CONFIG=/usr/bin/llvm-config-14 -DCMAKE_INSTALL_PREFIX=/usr ..

下一步開始建置,這一步驟可能需要等待一段時間,依電腦的規格效能決定。

注意結尾有「.」符號

cmake --build .

接著就可以安裝 PoCL:

cmake --install .

驗證安裝

利用 clinfo 我們可以知道有沒有成功安裝 PoCL。

clinfo -l
Platform #0: Portable Computing Language
 +-- Device #0: pthread-12th Gen Intel(R) Core(TM) i9-12900K
 `-- Device #1: NVIDIA GeForce RTX 3080 Ti

看到 Device 中除了 CPU 外,也有 NVIDIA 的顯卡,就可以知道已經成功囉!接下來我們跑一下測試,以下路徑是相對於 pocl/build,您若已經切換到其他目錄記得改一下:

../tools/scripts/run_cuda_tests

理論上就會看到 100% tests passed 的字樣囉!