当前位置: 首页 > news >正文

使用 Vulkan VkImage 作为 CUDA cuArray

使用 Vulkan VkImage 作为 CUDA cuArray

【问题标题】:Use Vulkan VkImage as a CUDA cuArray使用 Vulkan VkImage 作为 CUDA cuArray

【发布时间】:2019-08-20 20:01:10

【问题描述】:

将 Vulkan VkImage 用作 CUDA cuArray 的正确方法是什么?

我一直在尝试遵循一些示例,但是我在调用 cuExternalMemoryGetMappedMipmappedArray() 时收到了 CUDA_ERROR_INVALID_VALUE

以有序的方式提供信息。

我正在使用 CUDA 10.1

基本代码来自https://github.com/SaschaWillems/Vulkan,特别是我正在使用01 - Vulkan Gears 演示,丰富了saveScreenshot 方法09 - Capturing screenshots

我不会将快照图像保存到文件中,而是将快照图像作为 CUarray 发送到 CUDA。

我已启用以下实例和设备扩展:

std::vector<const char*> instanceExtensions = {VK_EXT_DEBUG_REPORT_EXTENSION_NAME,VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME };std::vector<const char*> deviceExtensions = { VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME };

我有一个VkImage,创建如下:

        // Create the linear tiled destination image to copy to and to read the memory fromVkImageCreateInfo imageCreateCI(vks::initializers::imageCreateInfo());imageCreateCI.imageType = VK_IMAGE_TYPE_2D;// Note that vkCmdBlitImage (if supported) will also do format conversions if the swapchain color format would differimageCreateCI.format = VK_FORMAT_R8G8B8A8_UNORM;imageCreateCI.extent.width = width;imageCreateCI.extent.height = height;imageCreateCI.extent.depth = 1;imageCreateCI.arrayLayers = 1;imageCreateCI.mipLevels = 1;imageCreateCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;imageCreateCI.samples = VK_SAMPLE_COUNT_1_BIT;imageCreateCI.tiling = VK_IMAGE_TILING_LINEAR;imageCreateCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;imageCreateCI.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;VkExternalMemoryImageCreateInfoKHR extImageCreateInfo = {};/** Indicate that the memory backing this image will be exported in an* fd. In some implementations, this may affect the call to* GetImageMemoryRequirements() with this image.*/extImageCreateInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR;extImageCreateInfo.handleTypes |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;imageCreateCI.pNext = &extImageCreateInfo;// Create the imageVkImage dstImage;VK_CHECK_RESULT(vkCreateImage(device, &imageCreateCI, nullptr, &dstImage));// Create memory to back up the imageVkMemoryRequirements memRequirements;VkMemoryAllocateInfo memAllocInfo(vks::initializers::memoryAllocateInfo());VkDeviceMemory dstImageMemory;vkGetImageMemoryRequirements(device, dstImage, &memRequirements);memAllocInfo.allocationSize = memRequirements.size;// Memory must be host visible to copy frommemAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);VkExportMemoryAllocateInfoKHR exportInfo = {};exportInfo.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR;exportInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;memAllocInfo.pNext = &exportInfo;VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &dstImageMemory));VK_CHECK_RESULT(vkBindImageMemory(device, dstImage, dstImageMemory, 0));

从那里我会:

获取 Vulkan 内存处理程序:

intCuEncoderImpl::getVulkanMemoryHandle(VkDevice device,VkDeviceMemory memory) {// Get handle to memory of the VkImageint fd = -1;VkMemoryGetFdInfoKHR fdInfo = { };fdInfo.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;fdInfo.memory = memory;fdInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;auto func = (PFN_vkGetMemoryFdKHR) vkGetDeviceProcAddr(device,"vkGetMemoryFdKHR");if (!func) {printf("Failed to locate function vkGetMemoryFdKHR\n");return -1;}VkResult r = func(device, &fdInfo, &fd);if (r != VK_SUCCESS) {printf("Failed executing vkGetMemoryFdKHR [%d]\n", r);return -1;}return fd;}

导入内存:

    CUDA_EXTERNAL_MEMORY_HANDLE_DESC memDesc = { };memDesc.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD;memDesc.handle.fd = getVulkanMemoryHandle(device, memory);memDesc.size = extent.width*extent.height*4;CUDA_DRVAPI_CALL(cuImportExternalMemory(&externalMem, &memDesc));

并映射内存:这是失败的步骤。

CUarray CuEncoderImpl::getCUDAArrayFromExternalMemory(const VkExtent3D &extent,const CUexternalMemory &m_extMem) {CUmipmappedArray m_mipmapArray;CUresult result = CUDA_SUCCESS;CUarray array;CUDA_ARRAY3D_DESCRIPTOR arrayDesc = { };arrayDesc.Width = extent.width;arrayDesc.Height = extent.height;arrayDesc.Depth = 0;arrayDesc.Format = CU_AD_FORMAT_UNSIGNED_INT32;arrayDesc.NumChannels = 4;arrayDesc.Flags = CUDA_ARRAY3D_SURFACE_LDST;CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC mipmapArrayDesc = { };mipmapArrayDesc.arrayDesc = arrayDesc;mipmapArrayDesc.numLevels = 1;mipmapArrayDesc.offset = 0;CUDA_DRVAPI_CALL(cuExternalMemoryGetMappedMipmappedArray(&m_mipmapArray, m_extMem, &mipmapArrayDesc));CUDA_DRVAPI_CALL(cuMipmappedArrayGetLevel(&array, m_mipmapArray, 0));return array;
}

我一直在尝试多种参数组合,但到目前为止都失败了。错误指向一个无效的参数,但我不知道如何找出问题所在。

唯一可行的方法是将 Vulkan 映像内存映射到主机缓冲区,然后将其复制到 CUDA 数组中......但我想这很昂贵,如果可能的话我想避免它。

【问题讨论】:

@talonmies Vulkan-CUDA 互操作性是 CUDA 10 的一项功能,请参阅 devblogs.nvidia.com/cuda-10-features-revealed

标签: cuda gpu nvidia vulkan cuda-arrays

【解决方案1】:

为了记录,我终于让它工作了。

我必须对问题中列出的代码进行一些注释和修改:

  1. Vulkan-CUDA 互操作性被宣传为 CUDA 10 的一项功能,请参阅CUDA 10 Features revealed

  1. 要映射的图像的平铺必须是 `VK_IMAGE_TILING_OPTIMAL

imageCreateCI.tiling = VK_IMAGE_TILING_OPTIMAL;
  1. 该图像的内存必须使用VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 分配

memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
  1. 导入内存时的内存描述符应使用内存要求中返回的内存大小(下面的size 是创建图像的代码中的memRequirements.size):

    CUDA_EXTERNAL_MEMORY_HANDLE_DESC memDesc = { };memDesc.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD;memDesc.handle.fd = getVulkanMemoryHandle(device, memory);memDesc.size = size;CUDA_DRVAPI_CALL(cuImportExternalMemory(&externalMem, &memDesc));
  1. 最后映射的数组被描述为CU_AD_FORMAT_UNSIGNED_INT8,有四个通道和CUDA_ARRAY3D_COLOR_ATTACHMENT

    CUDA_ARRAY3D_DESCRIPTOR arrayDesc = { };arrayDesc.Width = extent.width;arrayDesc.Height = extent.height;arrayDesc.Depth = 0;arrayDesc.Format = CU_AD_FORMAT_UNSIGNED_INT8;arrayDesc.NumChannels = 4;arrayDesc.Flags = CUDA_ARRAY3D_COLOR_ATTACHMENT;CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC mipmapArrayDesc = { };mipmapArrayDesc.arrayDesc = arrayDesc;mipmapArrayDesc.numLevels = 1;mipmapArrayDesc.offset = 0;CUDA_DRVAPI_CALL(cuExternalMemoryGetMappedMipmappedArray(&m_mipmapArray, m_extMem, &mipmapArrayDesc));
复制

在这些更改之后,我能够让它工作。 我很少有更改是我这边明显的错误(比如大小),我在第 100 次仔细阅读文档时发现的一些东西,其他人是对文档中提示的猜测,最后,大量的试验和错误.

【讨论】:

非常感谢你,我设法在不到一天的时间内运行了它:)

不过,我不确定一件事。我们必须在这个管道中调用哪些销毁/释放函数?我猜,cudaFreeMipmappedArray 和 cudaDestroyExternalMemory,但不是 mipmap 级别的 cudaFreeArray?

CUDA 10 功能揭晓:图灵、CUDA 图等 |英伟达技术博客 (nvidia.com)

CUDA Toolkit 12.1 Downloads | NVIDIA Developer

NVIDIA/cuda-samples: Samples for CUDA Developers which demonstrates features in CUDA Toolkit (github.com)

相关文章:

使用 Vulkan VkImage 作为 CUDA cuArray

使用 Vulkan VkImage 作为 CUDA cuArray【问题标题】&#xff1a;Use Vulkan VkImage as a CUDA cuArray使用 Vulkan VkImage 作为 CUDA cuArray【发布时间】&#xff1a;2019-08-20 20:01:10【问题描述】&#xff1a;将 Vulkan VkImage 用作 CUDA cuArray 的正确方法是什么&am…...

电商API接口-电商OMS不可或缺的一块 调用代码展示

电商后台管理系统关键的一环就是实现电商平台数据的抓取&#xff0c;以及上下架商品、订单修改等功能的调用。这里就需要调用电商API接口。接入电商API接口后再根据自我的需求进行功能再开发&#xff0c;实现业务上的数字化管理。其中订单管理模板上需要用到如下API:seller_ord…...

Solaris ZFS文件系统rpool扩容

ZFS文件系统简介 Solaris10默认的文件系统是ufs&#xff08;Unix Filesystem&#xff09;&#xff0c;当然也可以选装zfs&#xff1b;Solaris11默认的文件系统是zfs&#xff08;Zettabyte Filesystem&#xff09;。 ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件…...

模式识别 —— 第二章 参数估计

模式识别 —— 第二章 参数估计 文章目录模式识别 —— 第二章 参数估计最大似然估计&#xff08;MLE&#xff09;最大后验概率估计&#xff08;MAP&#xff09;贝叶斯估计最大似然估计&#xff08;MLE&#xff09; 在语言上&#xff1a; 似然&#xff08;likelihood&#xf…...

判断4位回文数-课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)

实例1&#xff1a;判断4位回文数 所谓回文数&#xff0c;就是各位数字从高位到低位正序排列和从低位到高位逆序排列都是同一数值的数&#xff0c;例如&#xff0c;数字1221按正序和逆序排列都为1221&#xff0c;因此1221就是一个回文数&#xff1b;而1234的各位按倒序排列是43…...

【NLP】Word2Vec 介绍

Word2Vec 是一种非常流行的自然语言处理技术&#xff0c;它将每个单词表示为高维向量&#xff0c;并且通过向量之间的相似度来表示单词之间的语义关系。 1 One-Hot 编码&#x1f342; 在自然语言处理任务中&#xff0c;我们需要将文本转换为计算机可以理解的形式&#xff0c;即…...

3月6日,30秒知全网,精选7个热点

///石家庄地铁&#xff1a;在指定店铺购物金额不限 就可免费乘地铁 乘客只要在指定商铺或地铁站内36524便利店购物&#xff0c;便能得到一张当日乘车券&#xff0c;可免费乘坐地铁一次&#xff0c;不限里程 ///神州泰岳&#xff1a;公司语音机器人等产品能够进行多轮问答 公司…...

Python笔记 -- 字典

文章目录1、概述2、增删改查3、遍历3.1、遍历所有键值对3.2、分别遍历键和值4、嵌套4.1、字典列表4.2、在字典中储存列表4.3、在字典中储存字典1、概述 字典是一系列键值对&#xff0c;可将任何Python对象作为字典中的值 字典和列表容易混淆&#xff0c;列表也可用{} 字典是一…...

【独家】华为OD机试 - 滑动窗口(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

MySQL调优 - SQL查询深度分页问题

一、问题引入 例如当前存在一张表test_user&#xff0c;然后往这个表里面插入3百万的数据&#xff1a; CREATE TABLE test_user (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键id,user_id varchar(36) NOT NULL COMMENT 用户id,user_name varchar(30) NOT NULL COMMENT 用…...

0306spring--复习

一&#xff0c;spring是什么 Spring是一个轻量级的控制反转&#xff08;IOC&#xff09;和面向切面编程&#xff08;AOP&#xff09;的容器框架 理念&#xff1a;使现有的技术更加容易使用&#xff0c;本身是一个大杂烩&#xff0c;整合了现有的技术框架 优点&#xff1…...

动手实现一遍Transformer

最近乘着ChatGpt的东风&#xff0c;关于NLP的研究又一次被推上了风口浪尖。在现阶段的NLP的里程碑中&#xff0c;无论如何无法绕过Transformer。《Attention is all you need》成了每个NLP入门者的必读论文。惭愧的是&#xff0c;我虽然使用过很多基于Transformer的模型&#x…...

【Flutter入门到进阶】Flutter基础篇---弹窗Dialog

1 AlertDialog 1.1 说明 最简单的方案是利用AlertDialog组件构建一个弹框 1.2 示例 void alertDialog(BuildContext context) async {var result await showDialog(barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框context: context,builder: (context)…...

【操作系统】进程和线程的区别

文章目录1. 概述2. 进程3. 线程4. 协程5. 进程与线程区别1. 概述 进程和线程这两个名词天天听&#xff0c;但是对于它们的含义和关系其实还有点懵的&#xff0c;其实除了进程和线程&#xff0c;还存在一个协程&#xff0c;它们的关系如下&#xff1a; 首先&#xff0c;我们需要…...

Linux开发环境配置--正点原子阿尔法开发板

Linux开发环境配置–正点原子阿尔法开发板 文章目录Linux开发环境配置--正点原子阿尔法开发板1.网络环境设置1.1添加网络适配器1.2虚拟网络编辑器设置1.3Ubuntu和Windows网络信息设置Ubuntu网络信息配置方式&#xff1a;1.系统设置->网络->选项2.配置网络文件2源码准备2.…...

Android ThreadPoolExecutor的基本使用

ThreadPoolExecutor是Java中的一个线程池类&#xff0c;Android中也可以使用该类来管理自己的线程池&#xff0c;它为我们管理线程提供了很多方便。 线程池是一种能够帮助我们管理和复用线程的机制&#xff0c;它可以有效地降低线程创建和销毁的开销。使用线程池可以避免不必要…...

基于区域生长和形态学处理的图像融合方法——Matlab图像处理

✅ 大三下时弄的 文章目录最终效果图摘要1 研究背景及意义2 基本原理描述3 实验数据来源3.1 原始图像的来源3.2 天空背景图像的来源4 实验步骤及相应处理结果4.1 原始图像的预处理4.2 区域生长法分割图像4.3 形态学处理填充孔洞4.4 边缘检测根据二值图像构造RGB图像4.5 图像拼接…...

三个案例场景带你掌握Cisco交换机VLAN互通

VLAN间路由的方式现在主流的组网主要是依靠三层交换机通过配置SVI接口【有的厂商叫VLANIF接口】&#xff0c;当然也有比较小型的网络&#xff0c;它就一个出口路由器可管理的二层交换机&#xff0c;还有一种更加差的&#xff0c;就是出口路由一个可管理的二层交换机&#xff0c…...

小白入门之持久连接与非持久连接的差别

对比 HTTP 0.9 已过时 HTTP1.0&#xff1a;非持续连接&#xff0c;每个连接只处理一个请求响应事务&#xff0c;有些服务器端甚至还在用此&#xff0c;可以在一定时间内复用连接&#xff0c;具体复用时间的长短可以由服务器控制&#xff0c;一般在15s左右。 HTTP 1.1 默认使用持…...

TypeScript篇.01-简介,类,接口,基础类型

1.简介(1)安装及编译安装: npm install -g typescript创建 .ts 后缀名的文件编译: tsc 文件名.ts 编译后会生成同名 .js 的文件查看: 在html文件中script引入js文件,运行查看控制台即可(2)类型注解TypeScript里的类型注解是一种轻量级的为函数或变量添加约束的方式 变量或函数声…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...