Opencl 通过将固定值作为内核参数传递来减少寄存器压力

Opencl 通过将固定值作为内核参数传递来减少寄存器压力,opencl,Opencl,我试图减少内核中的寄存器压力。我目前正在计算某些固定值,例如我正在处理的图像的尺寸;将这些维度作为内核参数传入有意义吗?对于所有工作组,它们都是固定的。我在某个地方读到,内核参数得到特殊处理,并且没有分配给寄存器。OpenCL规范要求内核参数位于\uuu private地址空间,因此理论上内核参数可以存储在寄存器、常量内存、专用寄存器文件或其他任何地方。在实践中,实现通常会将内核参数放在常量内存中(常量内存,而不是\u constant地址空间)。恒定内存是一种只读小型内存,GPU用于广播一般数

我试图减少内核中的寄存器压力。我目前正在计算某些固定值,例如我正在处理的图像的尺寸;将这些维度作为内核参数传入有意义吗?对于所有工作组,它们都是固定的。我在某个地方读到,内核参数得到特殊处理,并且没有分配给寄存器。

OpenCL规范要求内核参数位于
\uuu private
地址空间,因此理论上内核参数可以存储在寄存器、常量内存、专用寄存器文件或其他任何地方。在实践中,实现通常会将内核参数放在常量内存中(常量内存,而不是
\u constant
地址空间)。恒定内存是一种只读小型内存,GPU用于广播一般数据(如相机矩阵)。它们非常快,比全局内存快得多。与本地内存的速度相似

如果您将一个值传递给内核,那么它将驻留在常量内存中。将不会获取到全局


但是,该数据最终将驻留在寄存器中(与任何其他数据一样),以便对其进行操作。您将不会保存任何寄存器。但至少它会让你的内核运行得更快

“我在某个地方读到内核参数得到特殊处理”在哪里?我很感兴趣。一般来说,内核参数都在常量内存中(如果它们不是指针/缓冲区的话),这样可以提供额外的速度。但您应该将它们声明为常量,以确保它是特定于实现的。很明显,它们最终将驻留在寄存器中(与任何其他数据一样),但至少提取速度会更快。谢谢大家@暗零,请将此注释移动到“答案”部分,以便我可以将其标记为正确。那么,内核参数应该标记为“const”关键字吗?或者_constant关键字?您不需要声明它们
\u_constant
,因为内核参数已经在该空间中(如果编译器足够聪明的话)。无论如何,如果您将它们声明为常量,它应该可以正常工作。如果它们是只读的,或者您计划稍后对其进行写入,则应该声明它们
const
。您可以在中找到更多信息,并感谢您的编辑。嗯,我错了。你的答案更好。