我的理解是,每个工作组都在 GPU 上执行,然后执行下一个工作组。
不幸的是,我的观察得出的结论是这是不正确的。 在我的实现中,所有工作组共享一个大的全局内存缓冲区。 所有工作组都对该缓冲区上的各个位置执行读写操作。
如果内核直接操作它,不会产生冲突。 如果工作组将 block 加载到本地内存中,执行一些计算并将结果复制回来,则全局内存会被其他工作组损坏。
那么我怎样才能避免这种行为呢?
我可以以某种方式告诉 OpenCL 一次只执行一个工作组或重新安排执行顺序,这样我就不会发生冲突吗?
最佳答案
答案是视情况而定。整个工作组必须在设备上同时执行(尽管不一定并行),至少在存在障碍时如此,因为工作组必须能够同步和通信。没有规则规定工作组必须并发,但也没有规则规定不能并发。通常硬件会将单个工作组放置在单个计算核心上。大多数硬件都有多个核心,每个核心都会有一个工作组,并且为了弥补延迟,如果有可用的容量,许多硬件还会在单个核心上放置多个工作组。
您无法控制工作组的执行顺序。如果您希望它们序列化,最好只启动一个工作组并在内部编写一个循环来序列化同一工作组中的一系列工作 block 。即使对于多个工作组,这通常也是一个很好的策略。
如果您真的一次只需要一个工作组,那么您可能只会使用硬件的一小部分。大多数硬件无法在整个设备上分布单个工作组 - 因此,如果您坚持使用 32 核 GPU 上的一个核心,您就无法充分利用该设备。
关于image - OpenCL 工作组是否同时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074943/