編譯你的核心

可以在目標裝置上執行時編譯核心。要做到這一點,你需要

  • 核心原始碼
  • 要編譯的目標裝置
  • 使用目標裝置構建的上下文

快速術語更新:程式包含一組核心。你可以將程式視為完整的 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);