opencl命令队列是如何工作的,我可以对它提出什么要求
How does the opencl command queue work, and what can I ask of it
我正在研究一种算法,它可以多次执行几乎相同的操作。由于操作包括一些线性代数(BLAS),我想我会尝试使用GPU。
我已经编写了我的内核,并开始在命令队列上推送内核。因为我不想在每次调用后等待,我想我可以尝试将调用与事件链接起来,然后开始将这些事件推送到队列中。
call kernel1(return event1)
call kernel2(wait for event 1, return event 2)
...
call kernel1000000(vait for event 999999)
现在我的问题是,所有这些都被推送到图形芯片,驱动程序存储队列吗?如果我可以使用的事件数量有限制,或者命令队列的长度有限制,我已经环顾四周,但我没有找到这个。
我正在使用atMonitor来检查我的gpu的利用率,并且很难将其推到20%以上,这可能仅仅是因为我无法将调用推到那里足够快吗?我的数据已经存储在GPU上,所有我传递出去的都是实际的调用。
首先,您不应该等待来自上一个内核的事件,除非下一个内核对上一个内核有数据依赖。设备利用率(通常)取决于队列中总是有一些准备就绪的东西。只在需要等待事件时才等待事件。
实现定义的"是否所有这些都被推送到图形芯片或驱动程序是否存储队列?"
。记住,OpenCL不仅仅适用于gpu !就cuda风格的设备/主机二分法而言,您可能应该考虑在"主机"上执行命令队列操作(对于大多数实现)。"
尝试在多个内核调用之间不等待地排队。此外,确保你正在使用一个最佳的工作小组规模。如果你做到了这两件事,你应该能够最大限度地发挥你的设备。
不幸的是,我不知道你所有问题的答案,你现在也让我想知道同样的事情,但我可以说,我怀疑OpenCL队列将永远变得完整,因为你的GPU应该在至少20个命令提交之前完成执行最后排队的命令。这只有在你的GPU有一个"看门狗"的情况下才是正确的,因为这会阻止长得离谱的内核(我认为是5秒或更长)的执行。
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 我可以使用什么来停止循环而不是"返回 0"?
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 我可以做些什么来改进指针向量中的此搜索?
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 我可以为这些特定函数使用什么C++标头?Linux
- 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?
- 我可以做些什么来提高内存搜索速度?
- 我可以对"int 文件 = open(path, flag);"做点什么吗?
- 我可以用什么代替strstream::freeze?
- 有人可以向我解释什么[](int i){返回i%2 == 0;} 方法
- 我可以使用什么方法或方式将用户输入的字符串转换为 C++ 中的整数
- 我可以在 C 中使用什么而不是"string" C++
- 我得到了一个使用 SDL 的 OOP 项目。我没有使用继承。我可以给我的评估员什么理由
- 什么是clang 选项,以便在GDB中我可以使用std :: cout作为函数参数
- 试图在每次输出后使用一个函数摆脱'0',但不确定我可以返回什么
- 我可以使用什么开源C 库在专有的封闭源应用程序中显示PDF文件
- 在较旧的C 标准中,我可以使用什么代替std :: string :: pop_back
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么