我是OpenCL的初学者。我正在AMD 8670M(GCN架构)设备上实现一个算法。我使用OpenCL 本地内存来存储经常访问的全局数据。 根据设备的具体情况,有:
a) 5 compute units each having 64 KB of local memory.So device as a whole has 320 KB.
b) Maximum 2560 work-items on a compute unit.
我启动了一个包含8个工作组的内核,每个工作组有256个工作项。每个工作组使用16 KB的本地内存。 所以内核使用:
a) 2048 work-items
b) 128 KB local memory
2048个工作项适用于单个计算单元,但计算单元仅提供64 KB本地内存。因此,需要两个计算单元来提供所需的本地内存。
根据我的理解,现在可以有两种内核启动方式
1) Work-groups are distributed to two compute units to provide required local memory.
2) Work-groups are assigned to only one compute unit and excess local memory is spilled out to global memory.
上述哪种情况可能发生? 有没有办法检查每个计算单元上的活动波前数量? 任何建议都表示赞赏。谢谢。
答案 0 :(得分:2)
工作组不必是并发的。它们也不必在一个计算单元上。由于您只能在一个计算单元上安装4个工作组,因此您可以保证不会同时在同一计算单元上安装所有工作组(不会有任何溢出,这会破坏本地内存的用途)。
现在系统仍可以自由地在5个CU上启动8个WG,甚至可以在单个CU上启动,但是一个接一个地启动。唯一的调度保证是每个256捆的工作项将一起安排。由系统来选择最有效的东西。
这里有踢球者。您在一个可以同时运行多达12k个工作项的系统上运行。您只提供2k个工作项。因此,系统可能不会非常有效地工作,因为您远离充满机器。特别是,您通常需要每个CU多个WG来帮助隐藏启动和停止它们的延迟。