我目前在我的内核代码中有这样的东西:
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的大小,对吧?
谢谢。
答案 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];
}