__constant
内存按定义是由所有工作组共享的,因此我希望在任何合理的实现中,它只在计算设备上为每个内核分配一次。
另一方面,如果你有两个独立的内核,你正在背靠背排队,我想不出一个合理的方法来保证
__常量
内存在设备上共享或保留。如果您希望合理地确保将某个缓冲区复制到计算设备一次,以供两个子例程使用,那么这些子例程应该是同一内核的一部分。
一般来说,性能将取决于底层硬件&OpenCL实现,并且它不会在不同的设备之间进行移植。您应该看看是否有针对您正在使用的硬件的OpenCL性能指南。
至于
为什么?
__常量
内存可能比
__local
内存,这同样取决于硬件以及OpenCL实现如何将地址空间映射到硬件上的内存位置。你的错误是假设
__常量
内存将更快,因为它根据定义是一致的。
哪里
设备上的内存将决定其速度(即每个工作组缓冲区的速度快,而设备上所有工作组共享的缓冲区的速度慢),而OpenCL地址空间只是OpenCL实现如何/在何处分配内存的一个因素。(尺寸也很重要,可以想象
__常量
内存足够小,每个工作组的内存将“提升”到更快的速度,但这完全取决于实现。)
如果
__本地
正如您所说,内存更快,那么您可以考虑将您的工作拆分为工作组大小的块,并只将工作组所需的表部分传递给
__本地
缓冲区作为内核参数。