初始化目標裝置

OpenCL 核心可以在 GPU 或 CPU 上執行。這允許後備解決方案,其中客戶可能具有非常過時的系統。程式設計師還可以選擇將其功能限制為 CPU 或 GPU。

要開始使用 OpenCL,你需要一個上下文和一個裝置。兩者都是由 OpenCL API(也稱為 cl::Context 或 clContext&~Device)定義的結構,並定義使用的目標處理器。

要獲取裝置和上下文,你需要查詢可用平臺列表,每個平臺可以託管多個裝置。平臺代表你的物理 GPU 和 CPU,而裝置可以進一步區分所包含的計算單元。對於 GPU,大多數平臺只有一個裝置。但 CPU 可能會在其 CPU 功能之外提供額外的整合 GPU。

上下文管理記憶體,命令佇列,不同的核心和程式。上下文可以限於單個裝置,也可以引用多個裝置。

在我們開始編碼之前的快速 API 說明:幾乎每次呼叫 OpenCL 都會給出一個錯誤值,可以是返回值,也可以是 ref 值(C 中的指標)。現在讓我們開始吧。

ErrorCode err;
var platforms = Cl.GetPlatformIDs(out err);
if(!CheckError(err, "Cl.GetPlatformIDs")) return;
foreach (var platform in platforms) {
    foreach (var device in Cl.GetDeviceIDs(platform, DeviceType.Gpu, out err)) {
        if(!CheckError(err, "Cl.GetDeviceIDs")) continue;
        [...]
    }
}

此程式碼段會查詢系統上所有可用的 GPU 裝置。你現在可以將它們新增到列表中,或直接使用第一個匹配項啟動上下文。 ‘CheckError(...)‘函式是一個簡單的實用程式,它檢查錯誤程式碼是否具有成功值或不同的值,並且可以為你提供一些日誌記錄。建議使用單獨的函式或巨集,因為你會呼叫很多。

ErrorCode 只是 C#資料型別 cl_int 的列舉,C / C++可以將 int 值與此處列出的預定義錯誤常量進行比較: https//www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/ XHTML / errors.html

你還可能想要檢查裝置是否支援所有需要的功能,否則你的核心可能會在執行時崩潰。你可以使用查詢裝置功能

Cl.GetDeviceInfo(_device, DeviceInfo.ImageSupport, out err)

此示例詢問裝置是否可以執行影象功能。對於下一步和最後一步,我們需要從收集的裝置中構建我們的上下文。

_context = Cl.CreateContext(null, 1, new[] { _device }, ContextNotify, IntPtr.Zero, out err);

有些東西在這裡發生。對於 C / C++人來說,IntPtr 是 C#中的指標地址。我將專注於這裡的重要部分。

  • 第二個引數定義要使用的裝置數
  • 第三個引數是這些裝置的陣列(或 C / C++中的指標)
  • 第三個引數是回撥函式的函式指標。只要在上下文中發生錯誤,就會使用此函式。

為了進一步使用,你需要在某處保留你使用過的裝置和上下文。

完成所有 OpenCL 互動後,你需要再次釋出上下文

Cl.ReleaseContext(_context);