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