OpenCL(1.2)内核中向量的不规则行为

OpenCL(1.2)内核中向量的不规则行为,opencl,vectorization,gpgpu,opencl-c,Opencl,Vectorization,Gpgpu,Opencl C,所以,我试图在OpenCL内核中执行一些操作。我有一个名为filter的缓冲区,它是一个用值1初始化的3x3矩阵 我将此作为参数从主机端传递给OpenCL内核。问题是当我试图在设备端获取这个缓冲区作为float3向量时。前- __kernel void(constant float3* restrict filter) { float3 temp1 = filter[0]; float3 temp2 = filter[1]; float3 temp

所以,我试图在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。但是,第三个temp变量(temp3)只有x分量为1,其余y和z分量为0。当我仅以浮点向量的形式获取缓冲区时,一切都按预期进行。我做错什么了吗?我不想使用vload指令,因为它们会产生开销。

在OpenCL中,
float3
只是
float4
的别名,因此您的9个值将填充
x
y
z
w
组件
temp1
temp2
,这只为
temp3.x
留下一个值。您可能需要使用说明

有关更多信息,请参阅OpenCL规范的一节:

对于三分量矢量数据类型,数据类型的大小为
4*sizeof(component)
。这意味着3分量向量数据类型将与
4*sizeof(分量)
边界对齐。vload3vstore3内置函数可分别用于从压缩标量数据类型数组中读取和写入三分量矢量数据类型