# Introduction
Portable Computing Language (PoCL) 是一個 OpenCL 標準的開源實作。最近筆者被同學問到如何編譯 PoCL 的問題,雖然這方面並非筆者熟悉的領域,但還是嘗試將建置的過程記錄一下。本文將說明如何編譯 PoCL 並啟用 CUDA (Compute Unified Device Architecture) 的支援,並假設您已預先安裝好 Docker 環境、NVIDIA 的驅動程式與 NVIDIA Container Toolkit。
# 編譯環境
您可能會問,為什麼不把 PoCL 的下載與安裝寫進 Dockerfile?當然可以這麼做,而且本來就該這麼做!只是因為筆者想要在本文中強調編譯的過程,不然文章就一個 Dockerfile 就可以寫完了,所以這裡只建完所需的編譯環境而已,您可以自行把後面所有下載、編譯建置步驟依需求寫進 RUN
與 CMD
裡 (如果您要在 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 的字樣囉!