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

Using Vulkan -- Queues

应用程序通过VkQueue提交工作,通常以VkCommandBuffer对象或稀疏绑定的形式提交。

提交到同一个VkQueue的命令缓冲区按提交顺序开始执行,但开始后允许独立推进并乱序完成。

提交到不同队列的命令缓冲区彼此之间是无序的,除非使用VkSemaphore显式同步。

同一时间只能由一个线程向某个VkQueue提交工作,但不同线程可以同时向不同VkQueue提交工作。

VkQueue如何映射到底层硬件是实现定义的。部分实现会拥有多个硬件队列,向多个VkQueue提交工作可以独立并发执行;部分实现会在内核驱动层面做调度后再提交给硬件。Vulkan 目前没有办法暴露每个VkQueue具体的映射细节。

并非所有应用都需要或能从多队列中受益。使用单个支持图形的 “通用” 队列向 GPU 提交所有工作是完全合理的。

Queue Family

一个VkQueue可以支持多种操作类型。Queue Family(队列族)表示一组拥有相同属性、支持相同功能的VkQueue,具体能力在VkQueueFamilyProperties中声明。

以下是VkQueueFlagBits中定义的队列操作:

  • VK_QUEUE_GRAPHICS_BIT用于vkCmdDraw*及图形管线相关命令。

  • VK_QUEUE_COMPUTE_BIT用于vkCmdDispatch*vkCmdTraceRays*及计算管线相关命令。

  • VK_QUEUE_TRANSFER_BIT用于所有传输(transfer)命令。规范中的VK_PIPELINE_STAGE_TRANSFER_BIT对 “传输命令” 有详细说明。

仅包含VK_QUEUE_TRANSFER_BIT的队列族通常用于在独立显卡上利用 DMA 异步在主机与设备内存之间传输数据,使得传输可以与独立的图形 / 计算操作并发执行。

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT总是可以隐式执行VK_QUEUE_TRANSFER_BIT命令。

  • VK_QUEUE_SPARSE_BINDING_BIT用于通过vkQueueBindSparse对稀疏资源进行内存绑定。

  • VK_QUEUE_PROTECTED_BIT用于受保护内存。

  • VK_QUEUE_VIDEO_DECODE_BIT_KHRVK_QUEUE_VIDEO_ENCODE_BIT_KHR用于 Vulkan Video。

Knowing which Queue Family is needed

Vulkan 规范中的每个操作都有一个从vk.xml 生成的Supported Queue Types章节。以下是规范中的三种典型示

Querying for Queue Family

如果应用只需要一个图形队列,最简单的查询逻辑如下:

uint32_t count = 0; vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, nullptr); std::vector<VkQueueFamilyProperties> properties(count); vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &count, properties.data()); // Vulkan 要求实现至少暴露一个支持图形的队列族 uint32_t graphicsQueueFamilyIndex; for (uint32_t i = 0; i < count; i++) { if ((properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) { // 此队列族支持图形 graphicsQueueFamilyIndex = i; break; } }

Creating and getting a Queue

VkDeviceVkBufferVkDeviceMemory等句柄不同,Vulkan 没有vkCreateQueuevkAllocateQueue。驱动会在vkCreateDevice/vkDestroyDevice期间负责创建和销毁VkQueue句柄。

下面示例假设某个实现来自 2 个队列族,共支持 3 个VkQueue

以下示例展示如何在逻辑设备上创建全部 3 个VkQueue

VkDeviceQueueCreateInfo queueCreateInfo[2]; queueCreateInfo[0].queueFamilyIndex = 0; // Transfer queueCreateInfo[0].queueCount = 1; queueCreateInfo[1].queueFamilyIndex = 1; // Graphics queueCreateInfo[1].queueCount = 2; VkDeviceCreateInfo deviceCreateInfo = {}; deviceCreateInfo.pQueueCreateInfos = queueCreateInfo; deviceCreateInfo.queueCreateInfoCount = 2; vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device);

创建VkDevice后,应用可以使用vkGetDeviceQueue获取VkQueue句柄:

VkQueue graphicsQueue0 = VK_NULL_HANDLE; VkQueue graphicsQueue1 = VK_NULL_HANDLE; VkQueue transferQueue0 = VK_NULL_HANDLE; // 获取顺序可以任意 vkGetDeviceQueue(device, 0, 0, &transferQueue0); // family 0 - queue 0 vkGetDeviceQueue(device, 1, 1, &graphicsQueue1); // family 1 - queue 1 vkGetDeviceQueue(device, 1, 0, &graphicsQueue0); // family 1 - queue 0
http://www.jsqmd.com/news/490714/

相关文章:

  • 产品种类多的不锈钢带加工厂怎么选,售后服务佳的厂家哪个口碑好 - 工业设备
  • Z-Image-Turbo-辉夜巫女提示词宝典:应对Java八股文式复杂需求
  • Agentic Coding实战:从零开始构建你的第一个AI编程助手
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4:SolidWorks等工程软件学习中的概念答疑助手
  • 旱地喷泉工程2026新看点:口碑项目塑造城市新名片,旱地喷泉有哪些精选国内优质品牌分析 - 品牌推荐师
  • C# 基于OpenCv的视觉工作流-章34-投影向量
  • 华为2288H V3服务器iBMC网络配置与ESXi系统部署实战指南
  • 2026推荐高大空间采暖机组生产厂家,满足多样需求,远程射流空调机组/空调换热器/铜管换热器,采暖机组生产厂家哪家靠谱 - 品牌推荐师
  • YOLO12目标检测5分钟快速上手:开箱即用Web界面,实时识别80类物体
  • 如何利用FOFA快速发现存在Tenda信息泄露漏洞的路由器
  • 本地部署千问大模型
  • SPIRAN ART SUMMONER真实生成效果:‘祈之子’唤醒过程极光特效+图像渐进呈现
  • 【Unity URP】风格化草地02:GPU Instancing高效渲染实战
  • 商旅MICE平台怎么选?2026高性价比平台推荐|含核心功能测评
  • 从Inspeckage到Python脚本:一次完整的安卓APP通信协议逆向实战
  • Phi-3-mini-128k-instruct开源可部署实践:满足等保2.0三级对AI系统的审计要求
  • 百川2-13B-4bits开源镜像部署教程:适配RTX 4090 D的Gradio WebUI完整指南
  • Ubuntu 22.04 LTS 开启SSH的3种方法(附常见问题排查)
  • 原子操作 CAS 与锁实现
  • MacOS新手必看:Homebrew安装全攻略(含常见错误解决方案)
  • DeDeCMS v5.7 SP2 前台密码重置漏洞深度解析:从环境搭建到实战利用
  • Audio Pixel Studio代码实例:集成Whisper实现‘语音合成+语音识别’双向验证
  • 【AI】学习大语言模型原理必看的 10 篇论文
  • 告别论文焦虑:Paperxie 如何帮你轻松搞定降重与 AIGC 检测
  • Xinference 私有化部署实战:Docker 环境下的自定义模型加载与性能调优
  • Nunchaku-FLUX.1-dev开源可部署价值:数据不出域+模型可控+二次开发友好
  • Audio Pixel Studio企业应用:跨国团队会议纪要自动转多语种语音分发系统
  • 爬虫实战:ConnectTimeout与ReadTimeout的深度解析与高效应对策略
  • GIS数据处理必看:为什么你的Arcgis距离测量结果总是出错?坐标系选择指南
  • SSH端口转发失败?手把手教你解决remote port forwarding报错问题