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 个值将填充 xyztemp1temp2w 部分,只留下 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.