- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新:此问题已解决,您可以在此处找到更多详细信息:https://stackoverflow.com/a/64405505/1889253
similar question was asked previously ,但这个问题最初集中在使用多个命令缓冲区,并触发跨不同线程的提交以实现着色器的并行执行。大多数答案表明解决方案是使用多个队列。使用多个队列似乎也是各种博客文章和 Khronos 论坛答案的共识。我已经尝试了跨多个队列运行着色器执行的这些建议,但无法看到并行执行,所以我想问一下我可能做错了什么。正如所建议的,这个问题包括提交到多个队列的多个计算着色器的可运行代码,希望这对希望做同样事情的其他人有用(一旦解决)。
当前的实现是in this pull request / branch ,但是我将介绍 Vulkan 的主要特定点,以确保仅需要 Vulkan 知识来回答这个问题。还值得一提的是,当前的用例专门用于计算队列和计算着色器,而不是图形或传输队列(尽管在这些队列之间实现并行性的见解/经验仍然非常有用,并且很可能也会导致答案)。
更具体地说,我有以下几点:
最佳答案
您正在获得“异步执行”。你只是不期望它的行为方式。
在 CPU 上,如果您有一个事件线程,那么您使用的是一个 CPU 内核(或超线程)。该核心的所有执行和计算能力都单独提供给您的线程(忽略抢占)。但同时,如果有其他内核,您的一个线程将无法使用这些内核的任何计算资源。除非你创建另一个线程。
GPU 不是这样工作的。队列不像 CPU 线程。它并不具体涉及特定数量的计算资源。队列只是执行命令的接口(interface);底层硬件决定如何将命令分给 GPU 整体提供的各种计算资源。
当您执行命令时,通常会发生硬件尝试使用您的命令使可用着色器执行单元完全饱和的情况。如果可用的着色器单元多于您的操作所需的调用次数,则某些资源可立即用于下一个命令。但如果不是,那么整个 GPU 的计算资源将专用于执行第一个操作;第二个必须等待资源可用才能启动。
您将工作插入多少个计算队列并不重要;他们都将尝试使用尽可能多的计算资源。因此,它们将主要按某些特定顺序执行。
队列优先级系统存在,但这些系统主要帮助确定命令的执行顺序。也就是说,如果高优先级队列有一些命令需要执行,那么它们将在下次计算资源可用于新命令时优先。
因此,在 3 个单独的队列上提交 3 个调度批次不会比在包含 3 个调度操作的一个队列上提交 1 个批次完成得更快。
存在多个队列(同一家族)的主要原因是能够从多个线程提交工作,而无需让它们进行线程间同步(并提供一些可能的提交优先级)。
关于c++ - 如何在 Vulkan 中跨多个计算队列执行并行计算着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64384786/
我是一名优秀的程序员,十分优秀!