OpenCL(1.2) 内核中向量的不规则行为
Irregular behaviour of vectors in OpenCL(1.2) kernels
所以,我正在尝试在 OpenCL 内核中执行一些操作。我有一个名为 filter 的缓冲区,它是一个用值 1 初始化的 3x3 矩阵。
我将其作为参数从主机端传递给 OpenCL 内核。问题是当我尝试在设备端将此缓冲区作为 float3 向量获取时。对于前 -
__kernel void(constant float3* restrict filter)
{
float3 temp1 = filter[0];
float3 temp2 = filter[1];
float3 temp3 = filter[2];
}
前两个临时变量的行为符合预期,所有值都为 1。但是,第三个临时变量 (temp3) 只有 x 分量为 1,其余的 y 和 z 分量为 0。当我仅将缓冲区作为浮点向量获取,一切都按预期运行。难道我做错了什么?我不想使用 vload 指令,因为它们会产生开销。
在 OpenCL 中,float3
只是 float4
的别名,因此您的 9 个值将填充 x
、y
、z
和temp1
和 temp2
的 w
部分,只留下 temp3.x
的一个值。您可能需要使用 vload3 指令。
有关详细信息,请参阅 OpenCL 规范的 6.1.5. Alignment of Types 部分:
For 3-component vector data types, the size of the data type is 4 * sizeof(component)
. This means that a 3-component vector data type will be aligned to a 4 * sizeof(component)
boundary. The vload3 and vstore3 built-in functions can be used to read and write, respectively, 3-component vector data types from an array of packed scalar data type.
所以,我正在尝试在 OpenCL 内核中执行一些操作。我有一个名为 filter 的缓冲区,它是一个用值 1 初始化的 3x3 矩阵。
我将其作为参数从主机端传递给 OpenCL 内核。问题是当我尝试在设备端将此缓冲区作为 float3 向量获取时。对于前 -
__kernel void(constant float3* restrict filter)
{
float3 temp1 = filter[0];
float3 temp2 = filter[1];
float3 temp3 = filter[2];
}
前两个临时变量的行为符合预期,所有值都为 1。但是,第三个临时变量 (temp3) 只有 x 分量为 1,其余的 y 和 z 分量为 0。当我仅将缓冲区作为浮点向量获取,一切都按预期运行。难道我做错了什么?我不想使用 vload 指令,因为它们会产生开销。
在 OpenCL 中,float3
只是 float4
的别名,因此您的 9 个值将填充 x
、y
、z
和temp1
和 temp2
的 w
部分,只留下 temp3.x
的一个值。您可能需要使用 vload3 指令。
有关详细信息,请参阅 OpenCL 规范的 6.1.5. Alignment of Types 部分:
For 3-component vector data types, the size of the data type is
4 * sizeof(component)
. This means that a 3-component vector data type will be aligned to a4 * sizeof(component)
boundary. The vload3 and vstore3 built-in functions can be used to read and write, respectively, 3-component vector data types from an array of packed scalar data type.