之前一直在 Mac 上使用 ISPC,奈何核心/線程太少了。最近想在 Ubuntu 上搞搞,但是 snap 安裝的 ISPC不知道為什么只能單核,很奇怪,就想著編譯一下,需要 Clang 和 LLVM。但是 Ubuntu 很搞,他的很多軟件版本是和系統版本掛鉤的,默認安裝的是 14,這樣安裝可能會缺東西。沒辦法,搞吧,順道研究下這兩個的編譯和使用。
本文并不是很詳細,屬于備忘錄性質。
準備工作
首先安裝需要的工具:
sudo apt-get install git curl cmake xz-utils m4 flex bison python3 libtbb-dev g++-multilib
LLVM
雖然官方文檔里說可以用 APT 安裝,但是版本不太對。雖然 LLVM 編譯需要很長時間,如果你的核心數不夠多,那么可以用官方腳本安裝,然后自己手動改名稱,嗯,也挺麻煩的。
不過現在絕大部分處理器編譯的速度都還可以,畢竟大小核心加起來基本上都有十幾個了。我曾經在 6 核處理器上編譯了一晚上,太慢了。
需要注意 LLVM 編譯時間很長而且選項很復雜,這里只說我們需要的 LLVM、Clang 和 LLD,命令如下:
cmake -S llvm -B build -G 'Unix Makefiles' -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=Release
這里使用全部的線程構建:
make -j$(nproc)
然后安裝命令如下(就是放到該放的地方):
cmake --build . --target install
不過沒有復制FileCheck
,所以自己挪一下(不知道是我執行其他命令的緣故還是就是這個命令沒有操作,反正我手動挪了):
sudo cp FileCheck /usr/local/bin/FileCheck
安裝完之后看看llvm-config
版本和位置:
$ which llvm-config
/usr/local/bin/llvm-config
$ llvm-config --version
21.0.0git
你也可以對clang
等進行相關檢查。
如果你想看更多編譯情況可以看我的另外一篇博客:
ISPC
首先克隆倉庫:
git clone https://github.com/ispc/ispc.git
不建議使用官方的腳本,因為網絡問題,下載太慢了。
然后開始編譯(不要在 ISPC 項目目錄下運行,因為是單獨生成build-ispc
文件夾存放生成內容):
cmake -B build-ispc ispc
然后開始構建(不要用官方文檔里的cmake --build build-ispc
,這個只能使用一個核心,太慢了):
cd build-ispc
make -j$(nproc)
然后把生成二進制目錄添加到PATH
環境變量里:
export PATH="$PATH:<自己改目錄>/build-ispc/bin"
關于這部分如果你不熟悉,那么可以看看 macOS在終端上如何直接使用腳本或者下載的程序 - ZhongUncle CSDN。
最后看看ispc
版本:
$ ispc --version
Intel(r) Implicit SPMD Program Compiler (Intel(r) ISPC), 1.27.0dev (build commit f988909621671856 @ 20250313, LLVM 21.0.0)
使用 ISPC
這里需要注意,ispc
編譯的時候使用--pic
選項:
ispc SGEMM_kernels.ispc -O3 -o SGEMM_kernels_ispc.o -h SGEMM_kernels_ispc.h --target=avx2-i32x16 --pic
--pic
這個選項太冷了,我是翻文檔翻出來的,絕了。
然后再使用clang++
、g++
之類的通用編譯器編譯:
clang++ -O3 SGEMM_main.cpp SGEMM_kernels_ispc.o ../common/tasksys.cpp
否則可能會出現如下問題:
/usr/bin/ld: SGEMM_kernels_ispc.o: relocation R_X86_64_32 against `.text' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status
正確編譯后,運行看看:
$ ./a.out 2048 16 4096Usage: SGEMM (optional)[ispc iterations] (optional)[[Matrix A Rows] [Matrix A Columns/ matrix B Rows] [Matrix B Columns]]
./a.out
ispc iterations = 500[default], Matrix A Rows = 2048, Matrix A Columns/ matrix B Rows = 16, Matrix B Columns = 4096SGEMM_naive_withTasks 5.4232 millisecs 49.4920 GFLOPs Validation: valid.SGEMM_tileShuffle_withTasks 2.7940 millisecs 96.0635 GFLOPs Validation: valid.SGEMM_tileNoSIMDIntrin_withTasks 1.4964 millisecs 179.3685 GFLOPs Validation: valid.SGEMM_tileBlockNoSIMDIntrin_withTasks 1.0402 millisecs 258.0334 GFLOPs Validation: valid.SGEMM_tileBlockNoSIMDIntrin_2_withTasks 1.0505 millisecs 255.5048 GFLOPs Validation: valid.
這時候 CPU 利用率需要滿載,如下(注意看./a.out 2048 16 4096
這行):
題外話
ISPC 是我學過的第一個并行計算語言,并且付出了很大精力去研究和學習。
雖然有感情,但是我并不推薦使用 ISPC,原因很簡單,Intel 修改 ISPC 太快太多了,再加上文檔并不完善。這樣會浪費大量時間在研究和更新上,而不是寫代碼上,太麻煩了。
希望能幫到有需要的人~