我已经开始研究 OpenCl,并且对 WorkGroups 和内核的工作原理有了一些基本的了解。假设我有一个大小为 1024 的向量,而我的 GPU 的 WorkGroupSize 是 256。所以我的 WorkGroupSize 是我的 VectorSize 的倍数,这作为一个例子非常有效。但在现实世界的场景中,VectorSize 不能完全被 WorkGroupSize 整除。那么如何处理此类问题呢?有没有办法传递空值以使 VectorSize 完全可以被 WorkgroupSize 整除?
问问题
479 次
2 回答
2
绝对可以将输入缓冲区填充为您为内核选择的工作组大小的四舍五入倍数。但是,这通常是不切实际的,因为您需要一种算法来自然地处理未初始化或额外的无效数据而不会出错。
一个更简单的解决方案是将输入缓冲区长度作为参数传递,然后将计算代码包含在基于线程索引的 if 语句中,例如:
__kernel void kernel(....., unsigned int N)
{
unsigned int tid = get_global_id(0);
if (tid < N) {
/* kernel buffer access goes here */
}
}
这不会导致显着的性能损失,因为条件语句将在除一个之外的每个工作组中统一评估。然后将启动的工作组数加一,以确保处理整个输入缓冲区。
于 2019-11-29T07:40:30.700 回答
1
您不需要填写工作组:为小于每个工作组的最大工作项的内核排队是可以的。
因此,例如,如果您有 1100 个项目,您可以按以下组工作:[256、256、256、256、76],这将与 5 个 256 组(1280 个项目)的运行速度一样快。
显然,如果您运行 6 个较小的组 [200, 200, 200, 200, 200, 100],它会更慢。
于 2019-11-29T14:38:09.213 回答