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

问题描述 投票:0回答:1

所以,我试图在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 vectorization gpgpu opencl-c
1个回答
1
投票

在OpenCL中,float3只是float4的别名,因此您的9个值将填充xyzwtemp1temp2分量, temp3.x仅剩下一个值。您可能需要使用vload3指令。

有关更多信息,请参见OpenCL规范的6.1.5. Alignment of Types部分:

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

© www.soinside.com 2019 - 2024. All rights reserved.