所以,我试图在OpenCL内核中执行一些操作。我有一个名为filter的缓冲区,它是一个3x3矩阵,其初始值为1。
我将此作为参数从主机端传递给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
,w
,temp1
和temp2
分量, temp3.x
仅剩下一个值。您可能需要使用vload3指令。
有关更多信息,请参见OpenCL规范的6.1.5. Alignment of Types部分:
对于3分量矢量数据类型,数据类型的大小为
4 * sizeof(component)
。这意味着3分量矢量数据类型将与4 * sizeof(component)
边界对齐。内置函数vload3和vstore3可以分别用于从打包标量数据类型的数组中读取和写入3分量矢量数据类型。