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的大小,对吧?
谢谢。
为了能够使用计算索引来访问
1。使用
定义以下
1 2 3 4 5 | union float_type { float2 data2; float data[2]; }; |
然后动态转换
1 2 3 | func(__global float2 *array, __global float *buffer) { float foo = ((__global union float_type*)array)[1].data[1]; } |
2。转换为
1 2 3 | func(__global float2 *array, __global float *buffer) { float foo = ((__global float*)&array[1])[1]; } |