精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

NVIDIA驅動程序支持OpenCL和Vulkan進行互操作

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-10 11:41 ? 次閱讀

OpenCL 正在改進與其他 API (如 Vulkan )的互操作方式。本文向您介紹了最新的 OpenCL 互操作風格,最新的NVIDIA驅動程序已經支持這種風格。我們提供了可下載的示例代碼,所以您今天可以嘗試這個新功能。

需要一種新的互操作方式

開發人員通常將 OpenCL for compute 與其他 API (如 OpenGL )一起使用,以訪問包括圖形渲染在內的功能。 OpenCL 長期以來一直支持通過擴展與 OpenGL 、 OpenGL ES 、 EGL 、 Direct3D 10 和 Direct3D 11 共享隱式緩沖區和圖像對象:

cl_khr_gl_sharing

cl_khr_gl_event

cl_khr_egl_image

cl_khr_egl_event

cl_khr_d3d10_sharing

cl_khr_d3d11_sharing

新一代 GPU API (如 Vulkan )使用對外部內存的顯式引用以及信號量來協調對共享資源的訪問。到目前為止,還沒有 OpenCL 擴展來支持外部內存和信號量與這類新的 API 共享。

OpenCL 和 Vulkan 之間的互操作在移動和桌面平臺上都有很強的需求。 NVIDIA 與 Khronos OpenCL 工作組密切合作,發布了一套臨時跨供應商的 KHR 擴展。這些擴展使應用程序能夠在 OpenCL 和 Vulkan 等 API 之間高效地共享數據,與使用隱式資源的前一代互操作 API 相比,靈活性顯著提高。

這組新的外部內存和信號量共享擴展提供了一個通用框架,使 OpenCL 能夠使用 Vulkan 開發人員熟悉的方法導入外部 API 導出的外部內存和信號量句柄。然后, OpenCL 使用這些信號量來同步外部運行時,協調共享內存的使用。

圖 1 。 OpenCL 與 Vulkan 軟件的互操作關系

然后可以添加特定于 API 的外部互操作擴展,以處理與特定 API 交互的細節。 Vulkan 互操作現在可用,并計劃使用其他 API ,如 DirectX 12 。

OpenCL 新的外部信號量和內存共享功能包括單獨的一組精心構造的擴展。

信號量擴展

這組擴展增加了從操作系統特定的信號量句柄創建 OpenCL 信號量對象的能力。

cl_khr_semaphore – 表示帶有等待和信號的信號量。這是一個新的 OpenCL 對象類。

cl_khr_external_semaphore – 使用導入和導出外部信號量的機制擴展cl_khr_semaphore,類似于 VK_KHR_external_semaphore 。

以下擴展使用特定于句柄類型的行為擴展cl_khr_external_semaphore:

cl_khr_external_semaphore_opaque_fd – 使用帶有引用傳輸的 Linux fd 句柄共享外部信號量,類似于 VK_KHR_external_semaphore_fd 。

cl_khr_external_semaphore_win32 – 與 VK_KHR_external_semaphore_win32 類似,使用 win32 NT 和 KMT 句柄與引用轉移共享外部信號量。

內存擴展

這些擴展增加了從操作系統特定的內存句柄創建 OpenCL 內存對象的能力。它們的設計與 Vulkan 外部存儲器擴展 VK_KHR_external_memory 。 類似

cl_khr_external_memory – 從其他 API 導入外部內存。

以下擴展使用特定于句柄類型的行為擴展cl_khr_external_memory:

cl_khr_external_memory_opaque_fd – 使用 Linux fd 句柄共享外部內存,類似于 VK_KHR_external_memory_fd 。

cl_khr_external_memory_win32 – 使用 win32 NT 和 KMT 句柄共享外部內存,類似于 VK_KHR_external_memory_win32 。

使用 OpenCL

典型的互操作用例包括以下步驟。

檢查所需的支持是否可用:

檢查底層 OpenCL 平臺和帶有clGetPlatformInfo和clGetDeviceInfo的設備是否支持所需的擴展cl_khr_external_semaphore和cl_khr_external_memory。

為了能夠使用 Win32 信號量和內存句柄,請檢查cl_khr_external_semaphore_win32_khr和cl_khr_external_memory_win32_khr擴展是否存在。

為了能夠使用 FD 信號量和內存句柄,請檢查cl_khr_external_semaphore_opaque_fd_khr和cl_khr_external_memory_opaque_fd_khr擴展是否存在。這也可以通過查詢支持的句柄類型來檢查。

導入外部信號量需要cl_khr_external_semaphore。如果支持cl_khr_external_semaphore_opaque_fd,則可以使用clCreateSemaphoreWithPropertiesKHR和 OpenCL 中的 FD 句柄導入 Vulkan 導出的外部信號量。

// Get cl_devices of the platform. clGetDeviceIDs(..., &devices, &deviceCount); // Create cl_context with just first device clCreateContext(..., 1, devices, ...); // Obtain fd/win32 or similar handle for external semaphore to be imported from the other API. int fd = getFdForExternalSemaphore();// Create clSema of type cl_semaphore_khr usable on the only available device assuming the semaphore was imported from the same device. cl_semaphore_properties_khr sema_props[] = {(cl_semaphore_properties_khr)CL_SEMAPHORE_TYPE_KHR, (cl_semaphore_properties_khr)CL_SEMAPHORE_TYPE_BINARY_KHR, (cl_semaphore_properties_khr)CL_SEMAPHORE_HANDLE_OPAQUE_FD_KHR, (cl_semaphore_properties_khr)fd, 0}; int errcode_ret = 0; cl_semaphore_khr clSema = clCreateSemaphoreWithPropertiesKHR(context, sema_props, &errcode_ret);

導入圖像需要cl_khr_external_memory和對圖像的支持。在 OpenCL 中,通過clCreateSemaphoreWithPropertiesKHR使用 Win32 句柄導入 Vulkan 導出的外部信號量。

// Get cl_devices of the platform. clGetDeviceIDs(..., &devices, &deviceCount); // Create cl_context with just first device clCreateContext(..., 1, devices, ...); // Obtain fd/win32 or similar handle for external semaphore to be imported from the other API. void *handle = getWin32HandleForExternalSemaphore();  // Create clSema of type cl_semaphore_khr usable on the only available device assuming the semaphore was imported from the same device. cl_semaphore_properties_khr sema_props[] = {(cl_semaphore_properties_khr)CL_SEMAPHORE_TYPE_KHR, (cl_semaphore_properties_khr)CL_SEMAPHORE_TYPE_BINARY_KHR, (cl_semaphore_properties_khr)CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KHR, (cl_semaphore_properties_khr)handle, 0}; int errcode_ret = 0; cl_semaphore_khr clSema = clCreateSemaphoreWithPropertiesKHR(context, sema_props, &errcode_ret);

在 OpenCL 中,使用 FD 句柄將 Vulkan 導出的外部內存作為緩沖內存與clCreateBufferWithProperties一起導入。

// Get cl_devices of the platform. 
clGetDeviceIDs(..., &devices, &deviceCount); 
 
// Create cl_context with just first device 
clCreateContext(..., 1, devices, ...); 
 
// Obtain fd/win32 or similar handle for external memory to be imported from other API. 
int fd = getFdForExternalMemory(); 
 
// Create extMemBuffer of type cl_mem from fd. 
cl_mem_properties_khr extMemProperties[] = 
{ (cl_mem_properties_khr)CL_EXTERNAL_MEMORY_HANDLE_OPAQUE_FD_KHR, 
 (cl_mem_properties_khr)fd,
0

}; 
cl_mem extMemBuffer = clCreateBufferWithProperties(/*context*/ clContext, 
 /*properties*/ extMemProperties, 
 /*flags*/ 0, 
 /*size*/ size, 
 /*host_ptr*/ NULL, 
 /*errcode_ret*/ &errcode_ret);

在 OpenCL 中,使用clCreateImageWithProperties將 Vulkan 導出的外部內存作為圖像內存導入。

// Create img of type cl_mem. Obtain fd/win32 or similar handle for external memory to be imported from other API. int fd = getFdForExternalMemory(); // Set cl_image_format based on external image info cl_image_format clImgFormat = { }; clImageFormat.image_channel_order = CL_RGBA; clImageFormat.image_channel_data_type = CL_UNORM_INT8; // Set cl_image_desc based on external image info size_t clImageFormatSize; cl_image_desc image_desc = { }; image_desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY; image_desc.image_width = width; image_desc.image_height = height; image_desc.image_depth = depth; cl_mem_properties_khr extMemProperties[] = { (cl_mem_properties_khr)CL_EXTERNAL_MEMORY_HANDLE_OPAQUE_FD_KHR, (cl_mem_properties_khr)fd, 0 }; cl_mem img = clCreateImageWithProperties(/*context*/ clContext, /*properties*/ extMemProperties, /*flags*/ 0, /*image_format*/ &clImgFormat, /*image_desc*/ &image_desc, /*errcode_ret*/ &errcode_ret)

使用信號量 wait 和 signal 在 OpenCL 和 Vulkan 之間同步。

// Create clSema using one of the above examples of external semaphore creation. int errcode_ret = 0; cl_semaphore_khr clSema = clCreateSemaphoreWithPropertiesKHR(context, sema_props, &errcode_ret); while (true) { // (not shown) Signal the semaphore from the other API, // Wait for the semaphore in OpenCL clEnqueueWaitSemaphoresKHR( /*command_queue*/ command_queue, /*num_sema_objects*/ 1, /*sema_objects*/ &clSema, /*num_events_in_wait_list*/ 0, /*event_wait_list*/ NULL, /*event*/ NULL); clEnqueueNDRangeKernel(command_queue, ...); clEnqueueSignalSemaphoresKHR(/*command_queue*/ command_queue, /*num_sema_objects*/ 1, /*sema_objects*/ &clSema, /*num_events_in_wait_list*/ 0, /*event_wait_list*/ NULL, /*event*/ NULL); // (not shown) Launch work in the other API that waits on 'clSema'

關于作者

Nikhil Joshi 目前在NVIDIA 管理 OpenCL 驅動程序團隊。他還代表 NVIDIA 參加 Khronos OpenCL 工作組。他在 NVIDIA 的計算團隊工作了 10 多年,致力于不同的計算 API ,包括 CUDA 、 Renderscript 和 OpenCL

Rekha Mukund 是 NVIDIA 計算組的產品經理,負責為汽車、 Jetson 和 Android 平臺開發 CUDA Tegra 產品。她還負責管理 NVIDIA SimNet 產品和 OpenCL 計劃。在加入 NVIDIA 之前, Rekha 在付費電視技術領域與思科合作了八年多。她是英國大學計算機科學學院的金牌獲得者,他是印度國家級乒乓球運動員和狂熱的旅行者。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7452

    瀏覽量

    163606
  • NVIDIA
    +關注

    關注

    14

    文章

    4940

    瀏覽量

    102816
  • 操作系統
    +關注

    關注

    37

    文章

    6738

    瀏覽量

    123190
收藏 人收藏

    評論

    相關推薦

    NVIDIA-SMI因為無法與NVIDIA驅動程序通信而失敗

    你好,我有一個奇怪的問題,一切都很好,運作良好,但在一瞬間新的虛擬機點開始。當我嘗試檢查問題時,在“nvidia-smi”命令之后,我有“NVIDIA-SMI失敗,因為它無法與NVIDIA驅動
    發表于 09-10 17:09

    VM Win7 Xenserver 7 Nvidia Grid 369.71驅動程序不應用

    大家好;我全新安裝了Xenserver 7.0并應用了所有發布補丁。該服務器是戴爾R720,它有兩個nvidia K2卡,我還從公共Nvidia驅動程序網站安裝了nvidia網格
    發表于 09-19 16:54

    nvidia不再提供網格驅動程序

    的一行,“從版本375開始,NVIDIA驅動程序不再支持NVIDIA GRID K2,K1,K520和K340產品。”如果nvidia停止發
    發表于 09-27 16:08

    NVIDIA OpenGL驅動程序問題,錯誤代碼9 - NVIDIA GRID K2

    我們的工程師在“蒸餾”模式下打開CATIAv6模型時遇到了問題。我希望有人可以提供幫助。錯誤信息:NVIDIA OpenGL驅動程序檢測到顯示驅動程序出現問題,無法繼續。申請必須關閉。錯誤代碼
    發表于 10-08 14:20

    GPU如何在imx8m plus上工作以及GPU驅動程序如何集成到DRM驅動程序框架中?

    我正在研究 imx8m plus 的 DRM 驅動程序。在linux內核源代碼中,我找到了CRTC、Encoder和Connector的驅動源,但是GPU驅動在哪里呢?我知道 vivante GPU
    發表于 06-08 08:23

    基于eCos操作系統的FLASH驅動程序分析與移植

    基于eCos操作系統的FLASH驅動程序分析與移植 0 引 言   嵌入式系統需要支持的外部設備種類繁多,如何構造運行良好的嵌入式設備的驅動程序,對嵌入式
    發表于 12-28 10:50 ?1266次閱讀
    基于eCos<b class='flag-5'>操作</b>系統的FLASH<b class='flag-5'>驅動程序</b>分析與移植

    Linux驅動程序缺陷檢測研究

    驅動程序操作系統的重要組成部分。驅動程序運行于內核態,其可靠性對于操作系統的安全可靠非常關鍵。針對Linux驅動程序,研究基于符號執行的
    發表于 11-21 15:26 ?9次下載
    Linux<b class='flag-5'>驅動程序</b>缺陷檢測研究

    Linux設備驅動程序的平臺驅動程序和字符驅動程序介紹

    了解Linux設備驅動程序的基礎知識,重點介紹平臺驅動程序和字符驅動程序。 提出了簡單的平臺驅動程序實現和簡單的字符驅動程序實現。
    的頭像 發表于 11-27 06:32 ?4266次閱讀

    NVIDIA發布Geforce 460.89:支持Vulkan光追

    、指南也同步更新介紹了光追技術。 Vulkan對于光追的支持已經集成于DXC,也就是微軟的開源HLSL編譯器,因此開發者可以在Vulkan光追程序中使用HLSL著色器,包括從微軟DXR
    的頭像 發表于 12-16 13:32 ?6234次閱讀

    Vulkan 1.3幫助實現跨平臺功能

      NVIDIA 和其他 Khronos 成員開發的 Vulkan 最常被要求的擴展中,共有 23 個現在被納入全新的 Vulkan 1.3 核心規范。 NVIDIA 已經準備好了第一
    的頭像 發表于 04-02 15:51 ?1970次閱讀

    使用Vulkan SC進行安全關鍵圖形和實時GPU處理

      NVIDIA 幫助領導了 Vulkan SC 1.0 API 的創建,目前正在其 NVIDIA -DRIVE 和 NVIDIA Jetson 平臺上運送生產
    的頭像 發表于 10-11 11:21 ?1342次閱讀

    了解和使用無操作系統和平臺驅動程序

    快速發展的技術需要軟件支持(固件驅動程序和示例代碼)來簡化過程中的設計。本文介紹如何使用no-OS(無操作系統)驅動程序和平臺驅動程序,通過
    的頭像 發表于 12-15 14:28 ?1181次閱讀
    了解和使用無<b class='flag-5'>操作</b>系統和平臺<b class='flag-5'>驅動程序</b>

    摩爾線程正式發布Linux驅動程序

    近日,摩爾線程正式發布Linux驅動程序,面向MTT S80桌面級顯卡,版本號為v2.1.0。該驅動程序,在Ubuntu 20.04.1版本下支持OpenGL 4.0和Vulkan 1
    的頭像 發表于 07-05 10:56 ?1157次閱讀

    NVIDIA顯卡驅動下載哪個?NVIDIA顯卡驅動下載方法

    關于下載哪個NVIDIA顯卡驅動,建議您下載最新版本的官方驅動程序,以確保顯卡性能的穩定性和最佳體驗。同時,也可以根據您的電腦型號和配置,選擇適合您的驅動程序版本。如果您不確定應該下載
    的頭像 發表于 03-01 17:11 ?2543次閱讀

    Linux設備驅動程序分類有哪些

    Linux設備驅動程序操作系統與硬件設備之間的橋梁,負責實現硬件設備與操作系統之間的通信和控制。Linux設備驅動程序的分類繁多,可以根據不同的標準
    的頭像 發表于 08-30 15:11 ?439次閱讀