使用向量化类型实现逐元素数组查找的OpenCL惯用写法是什么?
OpenCL向量逐元素数组查找的简洁写法
1. OpenCL 2.0及以上版本(推荐)
直接使用内置的gather函数,这是OpenCL专为分散内存收集操作设计的原生接口,既能完全避免重复代码,还能借助硬件原生支持提升性能。
示例代码:
float* tbl = get_data(); int4 offsets = get_offsets(); float4 my_elements; gather(my_elements, tbl, offsets, 0);
参数说明:
- 第一个参数:输出向量,用于存储收集到的结果
- 第二个参数:源数组指针
- 第三个参数:索引向量,每个元素对应要查找的数组下标
- 第四个参数:偏移量(设为0表示直接使用索引值,无需额外偏移)
该写法完全通用,适配任意数据类型和向量维度,比如8维ushort向量的场景:
ushort* tbl = get_data(); ulong8 offsets = get_offsets(); ushort8 my_elements; gather(my_elements, tbl, offsets, 0);
2. OpenCL 1.x版本(兼容旧平台)
由于1.x没有内置gather函数,可通过宏定义减少重复代码,适配不同向量大小:
通用宏示例
// 4维向量查找宏 #define VEC4_LOOKUP(DST_VEC_TYPE, SRC_ARRAY, IDX_VEC) \ (DST_VEC_TYPE)( \ SRC_ARRAY[IDX_VEC.s0], \ SRC_ARRAY[IDX_VEC.s1], \ SRC_ARRAY[IDX_VEC.s2], \ SRC_ARRAY[IDX_VEC.s3] \ ) // 8维向量查找宏 #define VEC8_LOOKUP(DST_VEC_TYPE, SRC_ARRAY, IDX_VEC) \ (DST_VEC_TYPE)( \ SRC_ARRAY[IDX_VEC.s0], SRC_ARRAY[IDX_VEC.s1], \ SRC_ARRAY[IDX_VEC.s2], SRC_ARRAY[IDX_VEC.s3], \ SRC_ARRAY[IDX_VEC.s4], SRC_ARRAY[IDX_VEC.s5], \ SRC_ARRAY[IDX_VEC.s6], SRC_ARRAY[IDX_VEC.s7] \ )
使用宏的代码示例:
float* tbl = get_data(); int4 offsets = get_offsets(); float4 my_elements = VEC4_LOOKUP(float4, tbl, offsets);
也可利用向量分量的swizzle语法(s0-s3替代x-y-z-w)让代码更紧凑:
float4 my_elements = (float4)(tbl[offsets.s0], tbl[offsets.s1], tbl[offsets.s2], tbl[offsets.s3]);
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

