没有指针的 OpenCL 内核参数

Posted

技术标签:

【中文标题】没有指针的 OpenCL 内核参数【英文标题】:OpenCL kernel parameter without pointer 【发布时间】:2015-01-16 00:10:19 【问题描述】:

假设我有这个内核:

__kernel void myKernel(
    __global uint* output, 
             uint count)

参数计数驻留在哪个内存区域?我可以把 __constant 或 __private 放在它前面吗?为了将它放在常量内存或寄存器中?

【问题讨论】:

【参考方案1】:

OpenCL 规范说所有函数参数(包括内核参数)都存储在private 地址空间中:

未使用地址空间限定符声明的内核函数内的变量、非内核函数内的所有变量以及所有函数参数都在 __private 或私有地址空间 .

【讨论】:

尽管它在 OpenCL 规范中是这样定义的,并且完全有意义,因为它会保留在一个常量寄存器中。我根据经验发现,在内核中声明的参数可以帮助解决内存瓶颈内核(即使只是一点点)。因此,这意味着这些变量作为参数位于__constant 内存空间中,并且它们确实使用带宽来检索它们,至少是第一次。此外,它们禁止编译器优化内部代码。

以上是关于没有指针的 OpenCL 内核参数的主要内容,如果未能解决你的问题,请参考以下文章

如何正确初始化此 C++ for openCL 内核的输入/输出参数?

使用 OpenCL 内核的最近邻插值代码

OpenCL中不允许使用可变长度数组声明 - 为什么?

如何调用具有双指针作为参数的内核?

如何在 OpenCL 内核中更新 OpenCL-OpenGL 共享缓冲区数据?

OpenCL 内核的定时执行