這篇主要介紹 Linux/Windows 兩個平臺使用 Intel 內顯資源開發 OpenCL 的解決方案,
並且不用重新編譯核心,不像這篇太 Hardcore 了xD
首先你當然要確定自己的 Intel CPU 有沒有支援 OpenCL?
先參考 Supported APIs for Intel® Graphics,
但是只是參考就好,因為我在裡面用一塊號稱支援 OpenCL 2.0 的晶片支援了 OpenCL 3.0。
我認為 Intel 並不知道自己在做什麼。
LINUX
筆者在此使用 Ubuntu 22.04 做為開發環境,
在此 OS 下你只需按照這篇安裝 intel i915 驅動,
然後驗證驅動有沒有裝好?
sudo apt-get install clinfo
clinfo -l
如果有裝好應該會像筆者的畫面這樣:
接著你想要用 gcc 或 g++ 開發都沒問題,
甚至用 make 編譯專案也可以直接車過去,這就是 UNIX 帶原生編譯器的好處。
Windows
筆者在此使用 Windows 10 做為開發環境,
在 Windows 不用特別去裝 intel 驅動,理論上一定會自行下載。
但 Windows 因為沒有原生編譯器的優勢,所以你必須選擇編譯器流派。
如果你沒有要編譯整個專案,只想自己寫一點東西來驗證,
我推薦使用 MinGW64 就好。
MinGW64 只要再額外安裝 lib 及 headers 便可以執行後續驗證。
使用這份 .C程式碼來驗證:
#include
#include
int main() {
cl_uint platformCount;
clGetPlatformIDs(0, nullptr, &platformCount);
if (platformCount == 0) {
std::cerr << "No OpenCL platforms found." << std::endl;
return 1;
}
cl_platform_id* platforms = new cl_platform_id[platformCount];
clGetPlatformIDs(platformCount, platforms, nullptr);
std::cout << "Number of OpenCL platforms: " << platformCount << std::endl;
for (cl_uint i = 0; i < platformCount; ++i) {
char platformName[128];
clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, sizeof(platformName), platformName, nullptr);
std::cout << "Platform " << i + 1 << ": " << platformName << std::endl;
}
delete[] platforms;
return 0;
}
如果你需要 CMake 整份專案,
那先跟我大喊一聲:Fuck you Intel!
原因是網路上安裝 Intel OpenCL 的教學大多都需要這份:
Intel SDK for OpenCL applications
但是這份已經停更了。
根據 Intel 官方表示後續會分散在各 OneAPI 部件裡面支援,
所以我們會被引導到這個 Intel 官方文件頁面:
Intel Tools for OpenCL™ Applications
我試過了都沒用,不要浪費時間跟 Intel 官方文件在那邊鬧。
他們最近不知道想推 SYCL 還是什麼東西,總之沒有支援。
我會說沒有支援的原因是因為:
你要能 CMake 一份專案最主要要引用兩份東西,
一份叫做 OpenCL.lib,一份叫做 CL.h or CL.hpp。
按照 Intel 官方文件裝完上述套件都找不到 CL.h or CL.hpp,
就算找來 KhronosGroup 版本的 CL.h 代打也會有問題,
天知道 Intel 怎麼寫他們的 OpenCL.lib?
另外一個不推 Intel 解決方案的原因是近年來他們都綁 MSVC,
代表我要載又肥又呆的 Virtual Studio,個人不是很喜歡。
怎麼辦呢?
打不贏就加入!
我在開發死線前尋尋覓覓,發現敵人就在本能寺!
發現敵人的敵人就是朋友,AMD 有做這個欸?
我能不能用 AMD 的文件驅動 Intel CPU 呢?
哇靠!可以!
大家只要下載這個來安裝,並記住安裝路徑。
他會提供 CMake 最需要的 OpenCL.lib 及 CL.h。
接著在你的 CMakeLists.txt 裡面修改,
通常上面兩行要新增 OpenCL.lib 及 CL.h 的路徑,
下面兩行應該本來就有,新增一下就好。
find_path(OPENCL_INCLUDE_DIRS CL/cl.h PATHS /path/to/opencl/include)
find_library(OPENCL_LIBRARIES OpenCL PATHS /path/to/opencl/lib)
include_directories(${OPENCL_INCLUDE_DIRS})
target_link_libraries(YourExecutable ${OPENCL_LIBRARIES})
這樣應該就能成功編譯專案了!
如果本篇內容有誤歡迎聯絡我:
謝謝大家!
REF.
OpenCL入门一:Intel核心显卡OpenCL环境搭建
How to install OpenCL on Windows