- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 vulkan.h 中,VkAccessFlagBits
的每个实例都出现在包含 srcAccessMask
和 dstAccessMask
的对中:
VkAccessFlags srcAccessMask;
VkAccessFlags dstAccessMask;
在每种情况下,根据我的理解,这些掩码的目的是帮助指定两组操作,使得第一组中的操作结果对第二组中的操作可见。例如,在屏障之前发生的写入操作不应卡在缓存中,而应一直传播到可以在屏障之后读取它们的位置。或者类似的东西。
访问标志有读和写两种形式:
/* ... */
VK_ACCESS_SHADER_READ_BIT = 0x00000020,
VK_ACCESS_SHADER_WRITE_BIT = 0x00000040,
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080,
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100,
/* ... */
但在我看来,srcAccessMask
可能应该始终是某种VK_ACCESS_*_WRITE_BIT
组合,而dstAccessMask
应该始终是某种组合VK_ACCESS_*_READ_BIT
值。如果这是真的,那么 READ/WRITE 区别与 src/dst 区别相同并且隐含在 src/dst 区别中,因此只要有 VK_ACCESS_SHADER_BIT 等就足够了,没有 READ_ 或 WRITE_ 变体。
那么为什么会有 READ_ 和 WRITE_ 变体呢?指定某些读取操作必须在其他操作开始之前完全完成是否有用?请注意,所有使用 VkAccessFlagBits 的操作都会产生(我认为)执行依赖性和内存依赖性。在我看来,执行依赖性应该足够好,以防止早期读取接收稍后写入写入的值。
最佳答案
在写这个问题时,我遇到了 Vulkan 规范中的一个声明,它至少提供了部分答案:
Memory dependencies are used to solve data hazards, e.g. to ensure that write operations are visible to subsequent read operations (read-after-write hazard), as well as write-after-write hazards. Write-after-read and read-after-read hazards only require execution dependencies to synchronize.
这来自 6.4 节。执行和内存依赖性。另外,该部分前面的内容:
The application must use memory dependencies to make writes visible before subsequent reads can rely on them, and before subsequent writes can overwrite them. Failure to do so causes the result of the reads to be undefined, and the order of writes to be undefined.
据此我推测,是的,涉及这些访问标志的 Vulkan 命令产生的执行依赖关系可能使您不必将 VK_ACCESS_*_READ_BIT
放入 srcAccessMask
字段 - 但实际上您可能希望在某些 dstAccessMask
字段中具有 READ_ 标志、WRITE_ 标志或两者,因为显然可以使用显式依赖项来防止读取- 写入后危险的方式不会防止写入后危险。 (也许反之亦然?)
就像,也许您的 Vulkan 有时会决定,为了后续的读取操作,写入实际上不需要一直通过特定缓存传播到其最终指定的目的地,如果 Vulkan 碰巧知道该读取操作将简单地从同一个缓存中读取,从而节省一些时间?但随后可能会发生第二次写入,并写入不同的缓存,并且在竞争中将剩下两个缓存(获胜者的选择未定义)以将它们的两个值发送到同一位置。或者其他的东西?也许我对这些缓存的思维模型是完全错误的。
至少,已经相当确定的是,内存屏障是令人困惑的。
关于memory - 为什么VkAccessFlagBits同时包含读位和写位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39553185/
我在不同的硬件上测试 Cassandra 已经有一段时间了。 首先我有 2 个 CPU 和 6 GB RAM 然后我更改为 16 个 CPU 和 16 GB RAM(其中只有 6 GB 可供我的测试使
我只是想从二进制文件中读/写。我一直在关注 this教程,它的工作原理......除了它似乎正在将内容写入 txt 文件。我在测试的时候把文件命名为test.bin,但是记事本可以打开并正常显示,所以
我编写了一些简单的 Java 代码来从文本文件中读取字符串,将它们组合起来,然后将它们写回。 (有关输出没有变化的简化版本,请参见下面的片段) 问题是输入文件和输出文件中的特定字符(- 和 ...)是
我真的很感兴趣——你为什么要放 readln; 从键盘读取一些值到变量后的行?例如, repeat writeln('Make your choise'); read(CH); if (CH = '1
只要程序不允许同时写入存储在模块中的共享数据结构的相同元素,它是线程安全的吗?我知道这是一个菜鸟问题,但在任何地方都找不到明确解决的问题。情况如下: 在程序开始时,数据被初始化并存储在模块级可分配数组
我有一个数据结构,其操作可以归类为读取操作(例如查找)和写入操作(例如插入、删除)。这些操作应该同步,以便: 读操作不能在写操作执行时执行(除非在同一线程上),但是读操作可以与其他读操作并发执行。 在
我在Java套接字编程中有几个问题。 在读取客户端套接字中的输入流时,如果抛出IO异常;那么我们是否需要重新连接服务器套接字/再次初始化客户端套接字? 如果我们关闭输出流,它将关闭客户端套接字吗? 如
我正在尝试从客户端将结构写入带有套接字的服务器。 结构是: typedef struct R { int a; int b; double c; double d; double result[4];
我想知道是否可以通过 Javascript 从/向 Azure Active Directory 广告读取/写入数据。我读到 Azure 上有 REST 服务,但主要问题是生成与之通信的 token
我希望有人能提供完整的工作代码,允许在 Haskell 中执行以下操作: Read a very large sequence (more than 1 billion elements) of 32
我有一个任务是制作考试模拟器。我的意思是,在老师输入某些科目的分数后,学生输入他的名字、姓氏和出生,然后他决定学生是否通过科目。所以,我有一个问题,如何用新行写入文件文本并通过重写该文件来读取(逐行读
我需要编写巨大的文件(超过 100 万行)并将文件发送到另一台机器,我需要使用 Java BufferedReader 一次读取一行。 我使用的是 indetned Json 格式,但结果不太方便,
我在 Android 应用程序中有一个读写操作。在 onCreate 上,将读取文件并将其显示为编辑文本并且可以进行编辑。当按下保存按钮时,数据将被写入 onCreate 上读取的同一文件中。但我得到
我正在编写一个程序,该程序从一个文件读取输入,然后该程序将格式化数据并将其写入另一个文件。 输入文件: Christopher kardaras,10 N Brainard,Naperville,IL
我有一个 SCALA(+ JAVA) 代码,它以一定的速率读写。分析可以告诉我代码中每个方法的执行时间。如何衡量我的程序是否达到了最大效率?为了使我的代码优化,以便它以给定配置可能的最大速度读取。我知
嗨,我想知道如何访问 java/maven 中项目文件夹中的文件,我考虑过使用 src/main/resources,但有人告诉我,写入此目录中的文件是一个坏主意,并且应该只在项目的配置中使用,所以我
我想读\写一个具有以下结构的二进制文件: 该文件由“RECORDS”组成。每个“RECORD”具有以下结构:我将以第一条记录为例 (红色)起始字节:0x5A(始终为 1 字节,固定值 0x5A) (绿
我想制作一个C程序,它将用一些参数来调用;每个参数将代表一个文件名,我想在每个参数中写一些东西。 FILE * h0; h0 = fopen(argv[0],"w"); char buff
我有一个包含团队详细信息的文件。我需要代码来读取文件,并将获胜百分比写入第二个文件。我还需要使用指示的搜索功能来搜索团队的具体信息。该代码未写入百分比文件。当菜单显示时,第一个文件的内容被打印,但代码
我正在使用 read() 和 write() 函数来处理我的类,并且我正在尝试使用一个函数来写入它所读取的内容以及我作为参数给出的前面的内容。 例如,我想给出 10 作为我的程序的参数 int mai
我是一名优秀的程序员,十分优秀!