您的位置 首页 芯片行情

NVIDIA驱动程序支持OpenCL和Vulkan进行互操作

  OpenCL 和 Vulkan 之间的互操作在移动和桌面平台上都有很强的需求。 NVIDIA 与 Khronos OpenCL 工作组密切合作,发布了一套临时跨供应商的 KHR 扩展。这些扩展使应用程序能够在 OpenCL 和 Vulkan 等 API 之间高效地共享数据,与使用隐式资源的前一代互操作 API 相比,灵活性显著提高。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

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 在付费电视技术领域与思科合作了八年多。她是英国大学计算机科学学院的金牌获得者,他是印度国家级乒乓球运动员和狂热的旅行者。

审核编辑:郭婷

<!–

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: admin

为您推荐

如何使用GPU编程优化模型/代码

  使用 Python 和 NumPy 库开发的 HIM 模型在 hackathon 开始时没有并行或 GPU 计算。在活动期间, THINKLAB 团队使用 CuPy 为了使他们的代码在 GPU 上并行运行,然后重点将用户定义的 CUDA 内核应用于参数。结果是 672 倍加速,计算时间从 2 周缩短到大约 30 分钟。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

准备去元宇宙过第二人生?小心别被骗了

准备去元宇宙过第二人生?小心别被骗了   电子发烧友网报道(文/黄山明)随着元宇宙在近期的大火,相信大家对于这一技术已不陌生。但元宇宙因为其特性,也需要建立合适的网络安全防护措施,来应对这项技术带来的独特挑战。并且在元宇宙想要得以持续,需要用去中心化的平权式共享机制与共治机制来作为保障,既要做大“蛋糕”,也要分好“蛋糕”。但问题在于,去中心化的元宇宙,在安全问题上也将面临更大的挑战。     先简单解释一下元\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

代工巨头再次换帅,中芯国际高管频频离职,业绩喜人之下原因为何?

电子发烧友网(文/黄山明)3月17日,中芯国际发出公告,公司代理董事长高永岗博士,获委任为中芯国际董事长,自2022年3月17日生效。而在半年前辞去中芯国际董事长职位的“芯片泰斗”周子学最终以身体原因为由,辞去了执行董事一职。   对于这一次的交接,有业内人士称这是一次完美的交接,对中芯国际乃至中国半导体产业都有着重要的影响。不过另一方面,自周子学辞任中芯国际董事长之后,其股价便一路走低,从半年前的21.1港元降至如今的\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

电子测量仪器企业普源精电上市!年营收超3亿,募资7.6亿加速自研芯片项目

电子发烧友网报道(文/莫婷婷)4月8日,普源精电在科创板上市,发行价格60.88元/股,公开发行股份约3032.74万股,占公司发行后总股本的比例为25%。该股上市当日开盘即破发,截至今日收盘,普源精电报39.78元,跌幅34.66%,总市值48.26亿元。   图源:东方财富   在上市之前,普源精电在招股书的风险因素中提到,“公司无法保证未来几年内实现盈利,公司上市后亦可能面临退市的风险”。2020年、2021年上半年,普源精电分别亏损2716.6万元、2036.48万元,连\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

5G上市公司上演“围城”记:一边业绩利润飘红,一边增长前景出现分化

记者统计的15家5G上市公司中,包含了移动运营商、设备供应商、基站器件、5G模组、手机厂商和存储厂商,14家公司实现营业收入和净利润双增长,其中12家营业收入实现10%以上增长,值得一提的是其中5家企业营收实现50%以上的增长。净利润实现15%以上增长有11家。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部