假设在OpenCL内核中,每个工作组输出未知数量的数据。有没有有效的方法将输出对齐到全局内存中,以便它没有空洞?
答案 0 :(得分:2)
一旦您知道工作组需要多大的块,一种方法可能是使用atomic_add()来获取数组的索引。在OpenCL 1.0中,此类操作需要扩展(cl_khr_global_int32_base_atomics)。这些操作可能非常慢,可能会锁定整个全局内存总线(我们倾向于像瘟疫那样避免延迟),因此您可能不希望在每个项目的基础上使用它。此方案的缺点是您不知道结果的存储顺序,因为工作组可以(并且将会)不按顺序执行。
另一种方法是不是连续存储数据,而是为每个工作组分配足够的数据。完成后,您可以运行第二批工作来根据需要重新排列数据(最有可能进入第二个缓冲区,因为类似memmove的技巧不容易并行化)。如果您将数据传递回CPU,请在等待它们完成之前,在一个批处理中运行所有clEnqueueReadBuffer调用。具有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE的命令队列可能有所帮助;您可以使用cl_event参数指定发生时的依赖项。