OpenCL中参数_local和内核内参数_local之间的差异

OpenCL中参数_local和内核内参数_local之间的差异,local,opencl,Local,Opencl,有时openCL内核的参数中包含 kernel someName (some globalparameters, __local int* myArray) { 而其他脚本则在内核中的某个地方 __local int myArray[length]; 这两者有什么区别?我原以为它们只是语法上的差异,但现在我在一个官方AMD样本中看到了RadixSort的评论 __local KV_TYPE localDataArray[TPG*4*2]; // Faster than using it as

有时openCL内核的参数中包含

kernel someName (some globalparameters, __local int* myArray) {
而其他脚本则在内核中的某个地方

__local int myArray[length];
这两者有什么区别?我原以为它们只是语法上的差异,但现在我在一个官方AMD样本中看到了RadixSort的评论

__local KV_TYPE localDataArray[TPG*4*2]; // Faster than using it as a parameter !!!

显然我错了。有效地,当我在脚本中尝试它时,它运行得更快。为什么要买?这两个指针不都应该只是数组指针吗?

我不确定性能问题,但主要区别不仅仅是语法。通过将本地缓冲区作为参数传递,可以在运行时确定大小。在内核中定义缓冲区本身需要在编译时知道大小。

是的,这确实是硬编码的缺点。编译器确实有一些额外的信息。但我的问题是,编译器是如何利用这一点的,哪怕是它使我的代码速度提高了12%。也许通过查看编译器生成的代码可以得到一些线索。当然,我看到了很多不同之处,但如果我说我了解发生了什么,我会撒谎。我希望有人能从理论上对大局做出合理的解释,因为我主要是想理解背后的原理。