- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Vulkan 规范 (1.0.27) 说(在 6.5. 管道障碍 部分):
Each element of the pMemoryBarriers, pBufferMemoryBarriers and pImageMemoryBarriers arrays specifies two halves of a memory dependency, as defined above. [...]
If vkCmdPipelineBarrier is called outside a render pass instance, then the first set of commands is all prior commands submitted to the queue and recorded in the command buffer and the second set of commands is all subsequent commands recorded in the command buffer and submitted to the queue.
(措辞很有趣;如果按字面意思解释,它似乎是说屏障只在一个命令缓冲区内命令命令,而“提交到队列”部分可能是多余的;但如果解释得更模糊一点,它似乎是目的是说屏障在其命令缓冲区和队列中命令命令。其他 Stack Overflow 页面将我指向以下内容,这似乎证实了后一种解释:https://github.com/KhronosGroup/Vulkan-Docs/issues/300 )
那么我的问题。假设您有四个命令缓冲区,分两批提交,全部提交到一个 vkQueueSubmit
命令中:
VkSubmitInfo nextSubmitInfo;
nextSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
nextSubmitInfo.pNext = nullptr;
nextSubmitInfo.waitSemaphoreCount = 0;
nextSubmitInfo.pWaitDstStageMask = nullptr;
nextSubmitInfo.pWaitSemaphores = nullptr;
nextSubmitInfo.signalSemaphoreCount = 0;
nextSubmitInfo.pSignalSemaphores = nullptr;
std::vector<VkCommandBuffer> commandBuffersAB{commandBufferA, commandBufferB};
std::vector<VkCommandBuffer> commandBuffersCD{commandBufferC, commandBufferD};
std::vector<VkSubmitInfo> submitInfo;
nextSubmitInfo.commandBufferCount = commandBuffersAB.size();
nextSubmitInfo.pCommandBuffers = commandBuffersAB.data();
submitInfo.emplace_back(nextSubmitInfo);
nextSubmitInfo.commandBufferCount = commandBuffersCD.size();
nextSubmitInfo.pCommandBuffers = commandBuffersCD.data();
submitInfo.emplace_back(nextSubmitInfo);
df.vkQueueSubmit(queue, submitInfo.size(), submitInfo.data(), VK_NULL_HANDLE);
假设四个命令缓冲区中的每一个都包含一个屏障和一些 Action 命令(根据规范,这些命令是“执行 Action 的命令(例如绘制/调度)”)。那么,我倾向于天真地期望障碍会认为命令缓冲区是按字母顺序提交的,因此它们的第一和第二“一半”将包括(可能除其他外)以下内容:
| barrier | first half | second half ||---------------------|----------------------------|----------------------------|| barrier in buffer A | A0 | A1, B0, B1, C0, C1, D0, D1 || barrier in buffer B | A0, A1, B0 | B1, C0, C1, D0, D1 || barrier in buffer C | A0, A1, B0, B1, C0 | C1, D0, D1 || barrier in buffer D | A0, A1, B0, B1, C0, C1, D0 | D1 |
其中对于缓冲区X,X0是屏障之前X中记录的 Action 命令集合,X1是屏障之后记录的集合;因此,命令集将按如下方式运行:
A0; thenA1 and B0; thenB1 and C0; thenC1 and D0; thenD1
--该表每一行中的所有命令都没有按特定顺序执行,除非它们自己的特殊功能可能需要它。
是这样吗?或者这是否仅适用于在四个不同的 vkQueueSubmit
命令中提交命令缓冲区 A-D 时? (或者它甚至不适用?)
最佳答案
根据 Vulkan 规范的 1.0.35 版,命令缓冲区边界对操作之间的顺序没有任何影响:
Command buffer boundaries, both between primary command buffers of the same or different batches or submissions as well as between primary and secondary command buffers, do not introduce any implicit ordering constraints. In other words, submitting the set of command buffers (which can include executing secondary command buffers) between any semaphore or fence operations execute the recorded commands as if they had all been recorded into a single primary command buffer, except that the current state is reset on each boundary. Explicit ordering constraints can be expressed with events and pipeline barriers.
因此,无论 CB 是主要/次要的,在相同/不同的批处理中,还是在相同/不同的提交命令中,都没有关系。它们都表现得好像是一个非常大的主命令缓冲区。
因此,同步在所有这些边界之间起作用。
vkQueueSubmit
告诉我们:
Batches begin execution in the order they appear in pSubmits, but may complete out of order.
VkSubmitInfo
表示,在一个批处理中:
The command buffers submitted in a batch begin execution in the order they appear in
pCommandBuffers
, but may complete out of order.
添加了强调。
鉴于所有这些,我们知道您如何提交这些批处理并不重要。无论您是在 1 个 vkQueueSubmit
还是 4 个中执行。无论您是在 1 批 4 个 CB 还是 4 批,每批 1 个 CB 中执行。唯一重要的是这些 CB 的呈现顺序。
这就是为什么您应该使用尽可能少的 vkQueueSubmit
调用。因为它不会对您的程序的执行产生任何影响,但它可能会对性能产生重大影响。
关于synchronization - 出于障碍的目的,在单个 vkQueueSubmit 调用中,命令缓冲区是如何排序的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39559330/
在 java 中不使用“同步”关键字的情况下,是否有其他方法可以同步类或方法? 谢谢, 马利卡琼·科卡塔努尔 最佳答案 您可能想查看并发包中引入的对 JDK 5 的更改。 http://java.su
第 1 部分: 假设下面这段代码 void method1(){ synchronized (lockObject){ method2(); System.ou
我有一个 REST 服务器和一个在移动设备上运行的客户端应用程序。客户端有一些数据并希望从服务器获取数据更新。如何以 RESTful 方式在单个事务中执行此操作? 假设客户有以下元素: widge
我有一个多线程 Java 应用程序。在一种方法中,需要同步一个 ArrayList。由于 arrayList 不是线程安全的,所以我必须使用同步。问题是 ArrayList 类型的对象不是对象的成员变
我正在阅读 Android 示例中的 BluetoothChatService.java 文件,有一件事特别让我感到困惑。 方法在多个位置访问静态成员,并且定义为同步。 在另一部分中,正在访问同一个静
我知道为了实现线程安全和同步,我们使用同步块(synchronized block)或方法。 但我无法理解声明- “Java 中的同步块(synchronized block)在某些对象上同步 ” 任
在 Scala 中使用 JDBC 的示例中,有以下代码: this.synchronized { if (!driverLoaded) loadDriver() } 为什么this.synchro
abstract class A { protected abstract int isRunning(); public void concreteMethod() { synchr
有谁可以分享一下他们的经验吗?“我们什么时候在同步方法和同步块(synchronized block)之间进行调用”有任何性能问题吗? 最佳答案 When do we make a call to u
这是我之前问题的后续问题,Is this variable being safely accessed by using synchronization? 对于下面的程序, Class SubClas
我目前正在为 N 体问题实现多线程版本的 Barnes-Hut 算法。虽然该算法有效,但它不是很优化,我正在尝试减少我的程序的运行时间。 我已经确保有多个线程可以准确地找到我正在使用的空间的边界,并意
我有这门课: public class MyClass { public MyClass(){} public void actionA(){ synchronized
又是一个关于ArrayList和synchronize的问题。 我只想知道这段代码到底做了什么: ArrayList list = ....; synchronized (list) { if
我可以在另一个同步块(synchronized block)中包含同步块(synchronized block)以同步另一个对象吗? 例子: synchronized(myObjetc1){
public class ObjectCounter { private static long numOfInstances = 0; public ObjectCounter(){
我在某处读到,对于 various reasons 应该避免 synchronized(this) .然而,我遇到的一些值得尊敬的代码在构造函数中使用了以下内容: public SomeClass(C
Java 为同步代码的关键部分提供了一种非常方便的习惯用法: synchronized(someObject) { // do something really important all b
我有一个 WeakReference 的 Collections.synchronizedList,_components; 我写了类似下面的内容,希望编译者会提示: public boolean a
使用下面两个版本的Singleton Classes有什么区别 首先我使用的是synchronized(Singleton.class) 在第二个我使用同步(Obj)//第一种类型 公共(public
我正在查看 DatagramSocket 的源代码,我发现了这个: public void disconnect() { synchronized (this) { if (i
我是一名优秀的程序员,十分优秀!