You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用向量化类型实现逐元素数组查找的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:52:36