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

    文章

    7488

    浏览量

    163810
  • NVIDIA
    +关注

    关注

    14

    文章

    4985

    浏览量

    103027
  • 操作系统
    +关注

    关注

    37

    文章

    6818

    浏览量

    123320
收藏 人收藏

    评论

    相关推荐

    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 1290次阅读
    基于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 4306次阅读

    NVIDIA发布Geforce 460.89:支持Vulkan光追

    、指南也同步更新介绍了光追技术。 Vulkan对于光追的支持已经集成于DXC,也就是微软的开源HLSL编译器,因此开发者可以在Vulkan光追程序中使用HLSL着色器,包括从微软DXR
    的头像 发表于 12-16 13:32 6263次阅读

    Vulkan 1.3帮助实现跨平台功能

      NVIDIA 和其他 Khronos 成员开发的 Vulkan 最常被要求的扩展中,共有 23 个现在被纳入全新的 Vulkan 1.3 核心规范。 NVIDIA 已经准备好了第一
    的头像 发表于 04-02 15:51 2006次阅读

    使用Vulkan SC进行安全关键图形和实时GPU处理

      NVIDIA 帮助领导了 Vulkan SC 1.0 API 的创建,目前正在其 NVIDIA -DRIVE 和 NVIDIA Jetson 平台上运送生产
    的头像 发表于 10-11 11:21 1407次阅读

    了解和使用无操作系统和平台驱动程序

    快速发展的技术需要软件支持(固件驱动程序和示例代码)来简化过程中的设计。本文介绍如何使用no-OS(无操作系统)驱动程序和平台驱动程序,通过
    的头像 发表于 12-15 14:28 1244次阅读
    了解和使用无<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 1212次阅读

    NVIDIA显卡驱动下载哪个?NVIDIA显卡驱动下载方法

    关于下载哪个NVIDIA显卡驱动,建议您下载最新版本的官方驱动程序,以确保显卡性能的稳定性和最佳体验。同时,也可以根据您的电脑型号和配置,选择适合您的驱动程序版本。如果您不确定应该下载
    的头像 发表于 03-01 17:11 2641次阅读

    Linux设备驱动程序分类有哪些

    Linux设备驱动程序操作系统与硬件设备之间的桥梁,负责实现硬件设备与操作系统之间的通信和控制。Linux设备驱动程序的分类繁多,可以根据不同的标准
    的头像 发表于 08-30 15:11 555次阅读