OpenCL:访问 float2*/float4*/… 元素的偏移量

OpenCL: offset for accessing float2*/float4*/... elements

我的内核代码中目前有这样的内容:

1
2
3
4
func(__global float2 *array, __global float *buffer) {
    float *vector[2];
    vector[0] = array.s0;
    vector[1] = array.s1;

所以我可以稍后在代码中做这样的事情:

1
vector[vec_off][index] = buffer[i];

基本上,我希望能够根据计算出的索引访问代码中 float2 的元素。关键是以后能够轻松地将其扩展为 float4/float16 向量。

目前,当我尝试执行 vector[0] = array.x; 时,我得到一个(-11)错误(CL_BUILD_PROGRAM_FAILURE)我猜这意味着我不允许在 OpenCL 中编写它(像那样?)。
如果这不仅仅是语法错误,我应该能够通过使用偏移量访问数组的每个元素来做到这一点,所以我会有:

1
2
3
4
array.s0 = array
array.s1 = array + offset
...
array.sf = array + 15 * offset

我不知道浮点数是如何存储在内存中的。 .s1 部分是否存储在 .s0 之后?是这样的话,那么offset就是array.s0的大小,对吧?

谢谢。


为了能够使用计算索引来访问 float2 元素,您可以使用 union 或直接转换为 float*:

1。使用 union

定义以下 union:

1
2
3
4
5
union float_type
{
    float2 data2;
    float data[2];
};

然后动态转换 float2 数组并使用计算的索引访问元素:

1
2
3
func(__global float2 *array, __global float *buffer) {
     float foo = ((__global union float_type*)array)[1].data[1];
}

2。转换为 float*

1
2
3
func(__global float2 *array, __global float *buffer) {
     float foo = ((__global float*)&array[1])[1];
}