編譯你的核心
可以在目標裝置上執行時編譯核心。要做到這一點,你需要
- 核心原始碼
- 要編譯的目標裝置
- 使用目標裝置構建的上下文
快速術語更新:程式包含一組核心。你可以將程式視為完整的 C / C++ / C#原始檔,而核心是該檔案的不同功能成員。
首先,你需要使用原始碼建立程式。
var program = Cl.CreateProgramWithSource(_context, 1, new[] { source }, null, out err);
你可以將多個原始檔合併到一個程式中並將它們一起編譯,這樣你就可以將核心放在不同的檔案中並一次編譯它們。
在下一步中,你需要在目標裝置上編譯程式。
err = Cl.BuildProgram(program, 1, new[] { _device }, string.Empty, null, IntPtr.Zero);
現在有一點需要注意:錯誤程式碼只告訴你,函式呼叫本身是否成功,而不是你的程式碼是否實際編譯。為了驗證這一點,我們必須查詢一些其他資訊
BuildStatus status;
status = Cl.GetProgramBuildInfo(program, _device, ProgramBuildInfo.Status, out err).CastTo<BuildStatus>();
if (status != BuildStatus.Success) {
var log = Cl.GetProgramBuildInfo(program, _device, ProgramBuildInfo.Log, out err);
}
C / C++人員可以忽略最後的強制轉換,只是將返回的整數與相應的常量進行比較。
第一個呼叫檢查我們的構建是否真的成功。如果沒有,我們可以檢索日誌並確切地看到出錯的地方。請參閱有關不同平臺的一些常見陷阱的評論。
構建程式後,需要從編譯的程式中提取不同的核心。為此,你可以使用建立核心
_kernel = Cl.CreateKernel(_program, kernel, out err);
其中’kernel’是核心名稱的字串。完成核心後,需要將其釋出
Cl.ReleaseKernel(_kernel);