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

时间:2014-06-11 16:58:18

标签: opencl

我试图让某些事情发挥作用,但我没有想法,所以我想我会问这里。

我有一个全球规模很大的内核(通常是500万) 每个线程可能需要最多1Mb的全局内存(确切的大小事先未知)

所以我想......好吧,在我的典型目标GPU上,我有6Gb,我可以并行运行2880个线程,绰绰有余吧? 我的想法是创建一个大缓冲区(实际上是2,因为最大缓冲区大小限制...) 每个线程指向一个特定的全局内存区域(带有合并和东西,但你明白了......)

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

我可以选择 work_group_size = nb_compute_units / nb_cores ,并将偏移量设为 arm_get_core_id()* work_group_size + global_id()%work_group_size 但也许这个组大小不是最优的,并且可移植性问题仍然存在。

我还可以将全局大小为2880的内核调用排入队列,在那里我显然知道在哪里指向全局Id。 但由于5Million / 2880内核调用,这不会导致大量开销吗?此外,在其他工作组完成工作之前,任何在其他工作组完成之前完成的工作组将处于闲置状态。

非常欢迎任何正确做到这一点的想法!

1 个答案:

答案 0 :(得分:0)

嗯,你每个WI存储1MB用于时间计算(因为你没有保存它们,否则你的内存不会有。)

然后,为什么不简单地让它溢出到全球记忆?编译器是否抱怨?如果它确实抱怨,那么你需要其他方法:


一种可能性是创建一个空的队列(只是一个布尔数组),以供工作组使用。每次启动一个新工作组时,它都需要一个空槽并将布尔值设置为"使用"州。您可以使用atomic_cmpxchg()原子操作执行此操作。

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

您可以在此举例说明如何atomic_cmpxchg() LINK