【问题标题】:reduce register pressure by passing fixed values as kernel args通过将固定值作为内核参数传递来减少寄存器压力
【发布时间】:2015-11-13 11:41:36
【问题描述】:

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

【问题讨论】:

  • “我在某处读到内核参数得到特殊处理”在哪里?我很感兴趣。
  • 通常,内核参数在常量内存中(如果它们不是指针/缓冲区),这样可以提供额外的速度。但是您应该将它们声明为常量以确保这一点,否则它是特定于实现的。显然它们最终会驻留在寄存器中(就像任何其他数据一样),但至少获取速度会更快。
  • 谢谢,伙计们。 @DarkZeros,请将此评论移至答案部分,以便我将其标记为正确。

标签: opencl


【解决方案1】:

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

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

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

【讨论】:

  • 那么,内核参数应该用'const'关键字标记吗?还是 __constant 关键字?
  • 你不需要声明它们__constant,因为内核参数已经在那个空间中(如果编译器足够聪明的话)。无论如何,如果您声明它们__constant,它应该可以正常工作。如果它们是只读的,你应该声明它们const,或者你打算稍后再写它们。您可以在khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/constant.htmlkhronos.org/registry/cl/sdk/1.0/docs/man/xhtml/… 中找到更多信息
  • 感谢您的编辑。好吧,我错了。你的答案更好。
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2013-05-21
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多