使用管道屏障代替信号量

2024-01-01

我想确保我正确理解管道障碍。 因此,只要第二个屏障的源阶段晚于第一个屏障的目标阶段,屏障就能够同步两个命令缓冲区。它是否正确? 当然,如果命令缓冲区在管道的不同迭代期间执行,我将需要使用信号量。

在我看来,同步是 Vulkan 中最难掌握的部分。 IMO 规范对此还不够明确。


前言:

适用于 Vulkan 管道屏障的大部分内容也适用于通用屏障和内存屏障,因此您可以从那里开始建立您的直觉。

我要指出的是,尽管该规范不是教程,但它相当清晰且可读。同步is也许最难的部分和规范中的描述反映了这一点。最重要的是,内存屏障对于大多数人来说都是新奇的(它们通常被高级语言编译器屏蔽掉这样的概念)。

需要的定义:

Pipeline是如何处理工作单元的抽象方案。有四种类型(尽管 Vulkan 没有告诉供应商如何做事,只要他们遵守规则):

  1. 主机访问伪管道(一级)
  2. 转移(一级)
  3. 计算(一级)
  4. 图形(有很多阶段,即 DI→VI→VS→TCS→TES→GS→EFT→FS→LFT→输出)

有特殊阶段 TOP(在完成任何操作之前)、BOTTOM(在所有操作完成之后)和 ALL(与设置了所有阶段的位字段相同)。

(行动)command是一个需要(一个或多个)通过管道的命令。它必须被记录到命令缓冲区(除了主机通过vkMapMemory()).

命令缓冲区是一些命令序列(在recorded命令!)。和queue也是一个序列recorded命令(从提交的命令缓冲区连接)。

队列在执行命令的顺序上有一定的余地(只要保留用户设置的状态,它就可以重新排序命令)并且也可以重叠命令(例如,在完成上一个命令的 FS 之前执行下一个命令的 VS)。用户定义的同步原语设置了此余地的边界。 (还有一些隐含的保证——但最好不要依赖它们并过度同步,直到有信心为止)

我对解释管道障碍的看法:

(也许不幸的是)管道障碍合并了三个独立的方面——执行障碍、内存障碍和布局转换(如果是图像)。

The 执行障碍部分确保在屏障到达之前记录的所有命令执行至少指定的管道阶段(或多个阶段)srcStageMask beforeBarrier 开始执行其指定阶段(或多个阶段)后记录的任何命令dstStageMask.

它只处理执行依赖性,而不处理内存!这记忆屏障部分确保内存(缓存)被正确刷新并在两者之间的某个位置失效执行障碍依赖性(即在依赖命令和阶段之后以及依赖命令和阶段之前)。

您提供它是什么类型的内存依赖关系以及什么类型的源/消费者之间的依赖关系(因此驱动程序可以选择适当的操作而无需记住状态本身)。典型的写-读依赖关系(读-读和读-写不需要任何内存同步,写-写通常没有多大意义——为什么要覆盖一些数据而不先读取它们)。

在某些硬件上,内存中的不同数据布局可能是有利的(甚至是必要的)。在处理内存依赖性的同时,数据被重新排序以遵循新的指定布局。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用管道屏障代替信号量 的相关文章

  • 初识Vulkan渲染管线

    目前参考 Vulkan规范 和 Vulkan开发实战详解 对渲染管线有了一个初步的认识 现结合中英文的渲染管线图进行笔记整理 中英文的渲染管线图分别如下所示 xff1a 绘制命令送入设备队列执行后 xff0c Vulkan将原始的物体顶点坐
  • Vulkan入门精要

    Vulkan入门精要 fuxiii github io https fuxiii github io Essentials of Vulkan
  • Turbo跨平台开源渲染引擎

    Turbo跨平台开源渲染引擎 基于Vulkan开发的跨平台渲染引擎 欢迎来参观 使用 提意见 o o Turbo开源引擎地址 Turbo开源引擎开发记录视频
  • [Vulkan教程] 一: 创建VkDevice

    这个系列的文章是写给对已有的D3D11和GL比较熟悉并理解多线程 资源暂存 同步等概念但想进一步了解它们是如何以Vulkan实现的读者 文章并不追求通俗易懂 里面有很多术语 为了解里面的晦涩内容 建议去阅读Vulkan规范或者更深度的教程
  • Vulkan【15】图形管线(Graphics Pipline)

    创建图形管线 本节的代码是 14 init pipeline cpp 你越来越接近把这些拉到一起来渲染一个立方体 下一步是通过设置图形管道来配置GPU来进行渲染 一个图形管线由着色阶段 管线布局 渲染过程和固定功能管线阶段组成 您在前面的部
  • Vulkan再探(7):纹理贴图

    08 20 2020 文章目录 纹理贴图 Texture Mapping 纹理属性 加载图片 临时缓冲区储存图片信息 生成贴图等级 生成图像和存储空间 难点 传输数据 图解 拷贝缓冲区到图像 创建采样器 创建图像视图 创建组合图像采样器描述
  • 无论如何,是否有将 VkDescriptorImageInfo 设置为 null 或有某种方式跳过使用 VkWriteDescriptorSet 而不会出现 vulkan 抱怨

    我将使用的一些网格并不总是具有 DiffuseMap 或 SpecularMap 当我尝试加载没有漫反射和镜面反射贴图的内容时 程序崩溃 因为 DiffuseMap ImageView SpecularMap ImageView 中没有任何
  • 为什么我们需要多个渲染通道和子通道?

    我过去有过使用 DirectX12 的经验 但我不记得 Vulkan 中类似渲染通道的东西 所以我无法进行类比 如果我理解正确 则同一子通道内的命令缓冲区不需要同步 那么为什么要复杂化并制作多个呢 为什么我不能只使用一个命令缓冲区并将所有与
  • 如何使 VK_LAYER_KHRONOS_validation 可用?

    解决方案 卸载 vulkan 在注册表 HKLM SOFTWARE Khronos Vulkan ExplicitLayers 和 HKLM SOFTWARE WOW6432Node Khronos Vulkan ExplicitLayer
  • Vulkan 中的 VKAPI_ATTR 和 VKAPI_CALL 宏

    我一直在寻找但我仍然不确定what VKAPI ATTR and VKAPI CALL是 我不确定它们是否应该是一个宏或一些我不知道的奇特的 C 函数声明 What is VKAPI ATTR void VKAPI CALL vkComma
  • Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

    在 Vulkan 规范 1 0 9 第 180 页 中 我们有以下内容 typedef struct VkMemoryHeap VkDeviceSize size VkMemoryHeapFlags flags VkMemoryHeap 和
  • “VkVertexInputBindingDescription”中“绑定”的目的是什么?

    https www khronos org registry vulkan specs 1 0 man html VkVertexInputBindingDescription html https www khronos org regi
  • 对 VkDescriptorPoolCreateInfo.pPoolSizes 的这种理解是否正确?

    在Vulkan中 我知道描述符池用于分配某些布局的描述符集以在着色器中使用 但是在VkDescriptorPoolCreateInfo传递给vkCreateDescriptorPool 有一个字段pPoolSizes它需要一堆包含描述符类型
  • 有没有一种方法可以在不使用暂存缓冲区的情况下更新纹理?

    我正在与https vulkan tutorial com https vulkan tutorial com 深度缓冲代码作为基础 进行了一些更改以每帧更新命令缓冲区 我正在使用一种粗略的方法来检查 fps 不确定它到底有多准确 但我正在
  • 使用fences清理命令缓冲区并同时同步交换链图像

    假设我有一个交换链 其中包括n图像和我允许k 飞行中的帧 我确保之间的正确同步vkAcquireNextImageKHR vkQueueSubmit and vkQueuePresentKHR通过一组信号量imageAvailableSem
  • Vulkan 内存对齐要求

    我正在为 Vulkan 设备内存实现一个简单的内存管理器 并希望确保我了解内存的对齐要求以及如何满足这些要求 因此 假设我使用 vkAllocateMemory 分配了一个内存 池 并希望将该池中的内存块子分配给各个资源 基于 VkMemo
  • 升级到1.2.162.1后:vkQueueWaitIdle == VK_ERROR_DEVICE_LOST

    我最近将光线追踪渲染器从 Vulkan SDK 版本 1 2 148 0 升级到 1 2 162 1 这是必要的 因为光线追踪扩展已经结束测试版 因此现在可以与非测试版一起使用 显卡驱动程序 我的 RTX 2070 SUPER 的版本为 4
  • Vulkan:上传 3 通道图像到设备

    假设主机端有一个3通道图像 float或uint8 需要传输到设备图像 vkCmdCopyBufferToImage用于它 对于设备图像的格式 我看到两个选项 使用 R32G32B32A32 SFLOAT R8G8B8A8 SNORM 并将
  • 什么时候关闭光栅化步骤才有意义?

    在 vulkan 中 有一个创建管道所需的结构 名为VkPipelineRasterizationStateCreateInfo 在这个结构体中有一个名为rasterizerDiscardEnable 如果该成员设置为VK TRUE那么在光
  • vulkan 扩展:哪些由谁支持?

    有EXT KHR or AMD or NV扩展 也许还有其他一些 我知道NV means NvidiaAMD 不太可能支持 it nv 扩展 但是 khr 或 ext 又如何呢 他们是所有人都强制支持的吗 有一个website https

随机推荐

  • 为什么 WildFly 10 + JSF 2.3 无法与 Omnifaces 2.6.1 配合使用?

    我一直在尝试在 Wildfly 10 上使用 jsf 2 3 primefaces 6 和omnifaces 2 6 1 启动并运行一个应用程序 我已经拆分了 jsf 2 3 api 和 impl 并完成了 WildFly 的设置 应用程序
  • onItemClick strings.xml(不是 ListView/ArrayList)

    我有一个 on strings xml 文件 所有条目都显示在 ListView 上 现在我想对每个项目触摸 单击进行处理 我已经纠正了这段代码 gt public void onCreate Bundle savedInstanceSta
  • iOS 7 iAd 插页式广告无法被用户关闭

    当我显示插页式广告时 interstitial presentFromViewController self 我收到警告说此方法在 iOS 7 中已弃用 但它仍然可以正常工作 当我显示广告视图时 self requestInterstiti
  • SWIFT ALAssetsLibrary 未枚举组

    我试图将所有用户图像的缩略图收集到一个数组中 但是当我调用enumerateAssetsUsingBlock的方法ALAssetsLibrary似乎什么也没发生 import UIKit import AssetsLibrary class
  • Swing:GlassPane 防止鼠标指针改变

    我有一个 JTabbedPane 其中有一些选项卡以及选项卡旁边有很多未使用的额外空间 所以我尝试使用它并在那里放置一些按钮 就像在 Eclipse 中一样 我将按钮放在 GlassPane 上 JPanel glasspane getPa
  • Keras 中的自定义损失函数应该为批次返回单个损失值,还是为训练批次中的每个样本返回一系列损失?

    我正在学习tensorflow 2 3 中的keras API 在这个guide https www tensorflow org guide keras train and evaluate custom losses在tensorflo
  • 在 R 中使用 apply 和 allocate

    考虑以下示例 Vars lt c car bike lorry Dat lt c 10 20 22 for i in 1 length Vars assign Vars i Dat i 在这里 我想在工作区中生成三个变量 根据中的条目命名V
  • 如何使用正则表达式忽略空格?

    这是我的正则表达式 SK 1 0 9 8 但我想要这样的文字 SK 283 92758 SK 283 92 7 58 可以这样理解 SK28392758 有可能的 使用 可选 量词 每个字符之间有一个空格 S K d 7 d 这允许字符之间
  • Visual Studio 代码格式化程序

    我使用 Visual Studio 2008 来处理 C 和 JavaScript AJAXy 的东西 这是我的问题 我喜欢 Eclipse 尤其是格式化的代码 Ctrl Shift F 相比之下 Visual Studio 的 Ctrl
  • 有人能为我解释一下这个递归吗?

    我从 leetcode 得到了这个代码 class Solution object def myPow self x n if n 0 return 1 if n 1 return 1 x return self myPow x x n 2
  • 将 #define 常量转换为字符串

    我定义了一个常量 define MAX STR LEN 100 我正在尝试这样做 scanf MAX STR LEN s p buf 但这当然行不通 可以使用什么预处理器技巧将 MAX STR LEN 数字转换为字符串 以便我可以在上面的
  • 如何在activemq中杀死消费者

    我试图摆脱某个队列中的所有 消费者数量 每当我清除 删除队列时 如果我再次创建同名的队列 消费者的数量仍然保留 即使有 0 条待处理消息 仍然有 6 个消费者 我的问题可能源于我的 java 代码 但没有关闭会话或连接 我已经尝试过重新启动
  • iOS 上的 .NET MAUI 中的 Entity Framework Core 需要哪些修剪/链接器设置?

    我正在将使用 Entity Framework Core 3 1 和 SQLite 数据库的 Xamarin Forms 5 0 应用程序迁移到 NET MAUI 6 0 和 Entity Framework Core 6 0 调试构建工作
  • 如何生成密码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何生成密码 随机字符 密码短语 高ASCII码 像这样的东西吗 cat dev urandom strings Mac OS X 的
  • 扫描仪永远不会关闭

    我正在开发一款游戏 但我的扫描仪遇到了一些小问题 我得到了一个从未关闭的资源泄漏扫描仪 但我以为我的扫描仪之前可以工作而没有关闭它 但现在不是了 有人可以帮我吗 import java util Scanner public class M
  • Alembicbulk_insert 到带有模式的表

    我正在看这个例子批量插入 https alembic readthedocs org en rel 0 1 ops html alembic op bulk insert Create an ad hoc table to use for
  • 使用 psycopg2 连接到 Google Cloud SQL Postgres 实例

    我正在尝试使用 psycopg2 连接到 Google Cloud SQL Postgres 我创建了一个 postgreSQL 实例并使用默认数据库postgres目前 我可以从 pgadmin 工具以及 gcloud shell 进行连
  • PHP HTML 到 PDF 按比例转换 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 PHP MySQL 和
  • 使用 CodeIgniter 通过 Google 帐户发送电子邮件

    我正在尝试使用 CodeIgniter 发送电子邮件smtp googlemail com 代码没有问题 但 Google 阻止我发送该电子邮件 这是我在 Google 帐户上收到的电子邮件 第三方最近尝试使用应用程序连接到您的 谷歌帐户
  • 使用管道屏障代替信号量

    我想确保我正确理解管道障碍 因此 只要第二个屏障的源阶段晚于第一个屏障的目标阶段 屏障就能够同步两个命令缓冲区 它是否正确 当然 如果命令缓冲区在管道的不同迭代期间执行 我将需要使用信号量 在我看来 同步是 Vulkan 中最难掌握的部分