OpenCL 内核的标量参数
scalar arguments of an OpenCL kernel
我有两个关于 OpenCL 内核参数的问题。如果我用来描述问题的上下文有误,请纠正我。
标量参数(例如,内核 foo (int a) )放置在私有地址 space 中(与所有内核参数一样,无论它们是否为标量)。不需要 __private 关键字;默认情况下,参数放在私有地址 space 中。
Q1:谁负责将标量放在 GPU 私有地址 space 中?标量不需要显式传输操作(从 CPU 到 GPU 地址 space)。这是为什么?
Q2:我可以将标量作为参数输出吗?在其他数组中,我想从内核计算中获取一个值。
问题 1:OpenCL 运行时会处理您的内核参数。
Q2:否。您必须写入缓冲区或图像。如果您想要从整个内核执行中获得单个值,请将其视为 reduction。您的内核可能会同时在一定数量的处理单元上 运行,并且这些实例可能不会以任何特定顺序执行。如果您的内核存储单个值,则内核的每个 实例 将 每个 存储一个值。每个实例都应该有自己的位置来存储值,这样一个实例就不会覆盖另一个实例。
我有两个关于 OpenCL 内核参数的问题。如果我用来描述问题的上下文有误,请纠正我。
标量参数(例如,内核 foo (int a) )放置在私有地址 space 中(与所有内核参数一样,无论它们是否为标量)。不需要 __private 关键字;默认情况下,参数放在私有地址 space 中。 Q1:谁负责将标量放在 GPU 私有地址 space 中?标量不需要显式传输操作(从 CPU 到 GPU 地址 space)。这是为什么? Q2:我可以将标量作为参数输出吗?在其他数组中,我想从内核计算中获取一个值。
问题 1:OpenCL 运行时会处理您的内核参数。
Q2:否。您必须写入缓冲区或图像。如果您想要从整个内核执行中获得单个值,请将其视为 reduction。您的内核可能会同时在一定数量的处理单元上 运行,并且这些实例可能不会以任何特定顺序执行。如果您的内核存储单个值,则内核的每个 实例 将 每个 存储一个值。每个实例都应该有自己的位置来存储值,这样一个实例就不会覆盖另一个实例。