OpenCL:用于访问float2 * / float4 * / ...元素的偏移量

时间:2015-08-09 20:37:11

标签: opencl

我目前在我的内核代码中有这样的东西:

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

所以我稍后可以在代码中执行类似的操作:

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

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

目前,当我尝试执行vector [0] = array.x时,我得到(-11)错误(CL_BUILD_PROGRAM_FAILURE);我想这意味着我不允许在OpenCL中写它(就像那样?)。

如果它不仅仅是语法错误,我应该能够通过使用偏移访问数组的每个元素来实现这一点,所以我会:

array.s0 = array
array.s1 = array + offset
...
array.sf = array + 15 * offset

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

<强> 1。使用union

定义以下union

union float_type
{
    float2 data2;
    float data[2];
};

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

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

<强> 2。转为float*

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