OpenCL:正在使用的物理核心的Id

OpenCL:正在使用的物理核心的Id,opencl,Opencl,我正试着做点什么,但我没有主意了,所以我想我应该在这里问一下 我有一个内核,它的全局大小很大,通常是500万 每个线程可能需要高达1Mb的全局内存,具体大小事先未知 所以我想。。。好的,在我典型的目标GPU上,我有6Gb,我可以并行运行2880个线程,足够了吧? 我的想法是创建一个大的缓冲区,实际上是2,因为最大缓冲区大小的限制。。。 每一个线程都指向一个特定的全局内存区域,包含合并和其他内容,但您得到了这个想法 我的问题是,如何知道内核代码中当前运行的线程指向正确的内存区域? 我确实找到了cl

我正试着做点什么,但我没有主意了,所以我想我应该在这里问一下

我有一个内核,它的全局大小很大,通常是500万 每个线程可能需要高达1Mb的全局内存,具体大小事先未知

所以我想。。。好的,在我典型的目标GPU上,我有6Gb,我可以并行运行2880个线程,足够了吧? 我的想法是创建一个大的缓冲区,实际上是2,因为最大缓冲区大小的限制。。。 每一个线程都指向一个特定的全局内存区域,包含合并和其他内容,但您得到了这个想法

我的问题是,如何知道内核代码中当前运行的线程指向正确的内存区域? 我确实找到了cl_arm_get_core_id扩展,但这只给了我工作组,而不是正在使用的acutal线程,而且这似乎并不适用于所有GPU,因为它是一个扩展

我可以选择工作组大小=nb计算单位/nb核心,偏移量为arm获取核心id*工作组大小+全局id%工作组大小 但是,可能这个组的大小不是最优的,而且可移植性问题仍然存在

我还可以将许多全局大小为2880的内核调用排队,在那里我显然知道使用全局Id指向何处。 但这不会因为500万/2880内核调用而导致大量开销吗?另外,任何在其他工作组之前完成的工作组都将处于空闲状态,直到此调用的所有工作组完成其工作为止


非常欢迎有任何正确的想法

好吧,您正在为时态计算存储1MB/WI,因为您没有保存它们,否则您的内存就没有了

那么,为什么不干脆让它溢出到全局内存中呢?编译器会抱怨吗?如果它确实抱怨,那么您需要其他方法:

一种可能是创建一个队列,它只是一个布尔数组,内存区域为空,供工作组使用。每次启动新工作组时,它都会占用一个空槽,并将布尔值设置为已使用状态。您可以通过原子操作来实现这一点

启动每个工作组可能会带来少量开销,但如果每个WI都需要1MB的全局内存,则开销可能可以忽略不计

这里有一个小例子,说明如何进行原子_cmpxchg