- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在学习 vulkan,现在我只是拆开每个命令并检查结构以尝试理解它们的含义。
现在我正在分析 QueueFamilies,为此我有以下代码:
vector<vk::QueueFamilyProperties> queue_families = device.getQueueFamilyProperties();
for(auto &q_family : queue_families)
{
cout << "Queue number: " + to_string(q_family.queueCount) << endl;
cout << "Queue flags: " + to_string(q_family.queueFlags) << endl;
}
这会产生这个输出:
Queue number: 16
Queue flags: {Graphics | Compute | Transfer | SparseBinding}
Queue number: 1
Queue flags: {Transfer}
Queue number: 8
Queue flags: {Compute}
所以,天真地我是这样理解的:
有3个Queue family,一个queue family有16个queue,都可以进行图形、计算、传输和稀疏绑定(bind)操作(不知道最后两个是什么)
另一个有 1 个队列,只能传输(不管是什么)
最后一个有 8 个能够进行计算操作的队列。
每个队列系列是什么?我知道这是我们发送执行命令(如绘制和交换缓冲区)的地方,但这是一个有点宽泛的解释,我想要一个更详细的答案。
这两个额外的标志是什么?转移和稀疏出价?
最后,为什么我们有/需要多个命令队列?
最佳答案
要了解队列系列,您首先必须了解队列。
队列是您向其提交命令缓冲区的对象,提交至队列的命令缓冲区相对于彼此按顺序[*1] 执行。提交到不同队列的命令缓冲区相对于彼此是无序的,除非您明确地将它们与 VkSemaphore
同步。您一次只能从一个线程向一个队列提交工作,但不同的线程可以同时向不同的队列提交工作。
每个队列只能执行某些类型的操作。图形队列可以运行由 vkCmdDraw*
命令启动的图形管道。计算队列可以运行由 vkCmdDispatch*
启动的计算管道。传输队列可以从 vkCmdCopy*
执行传输(复制)操作。稀疏绑定(bind)队列可以使用 vkQueueBindSparse
更改稀疏资源与内存的绑定(bind)(请注意,这是直接提交给队列的操作,而不是命令缓冲区中的命令)。一些队列可以执行多种操作。在规范中,每个可以提交到队列的命令都有一个“命令属性”表,其中列出了哪些队列类型可以执行该命令。
队列族只是描述了一组具有相同属性的队列。所以在你的例子中,设备支持三种队列:
一种可以进行图形、计算、传输和稀疏绑定(bind)操作,您最多可以创建 16 个该类型的队列。
另一种只能做传输操作,你只能创建一个这种队列。通常这是为了在离散 GPU 上的主机和设备内存之间异步 DMAing 数据,因此传输可以与独立的图形/计算操作同时完成。
最后,您最多可以创建 8 个只能进行计算操作的队列。
一些队列可能只对应于主机端调度器中的单独队列,其他队列可能对应于硬件中实际的独立队列。例如,许多 GPU 只有一个硬件图形队列,因此即使您从具有图形功能的队列系列中创建两个 VkQueue,提交到这些队列的命令缓冲区将独立地通过内核驱动程序的命令缓冲区调度程序进行处理,但会以一些串行方式执行在 GPU 上排序。但是一些 GPU 具有多个仅计算硬件队列,因此用于仅计算队列系列的两个 VkQueue 实际上可能会独立并并发地贯穿 GPU。 Vulkan 不会公开这一点。
最重要的是,根据您的并发量来决定您可以使用多少队列。对于许多应用程序,它们只需要一个“通用”队列。更高级的可能有一个图形+计算队列,一个用于异步计算工作的单独的仅计算队列,以及一个用于异步 DMA 的传输队列。然后将您想要的映射到可用的;您可能需要自己进行多路复用,例如在没有纯计算队列系列的设备上,您可以创建多个图形+计算队列,或者自己将异步计算作业序列化到单个图形+计算队列。
[*1] 有点过分简化了。他们按顺序开始,但之后可以独立进行并无序完成。但是不能保证不同队列的独立进程。对于这个问题,我就此打住。
关于c++ - Vulkan 中的 Queue 族实际上是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272626/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!