使用向量作为数组索引?

时间:2014-07-14 21:23:52

标签: opencl

在OpenCL下,是否有使用向量作为索引访问数组的方法?

例如,我想完成这样的事情:

__constant uint data[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};

uchar4 keys = (uchar4)(5, 0, 2, 6);
uint4 results = data[keys]; 
// results = (uint4)(0x55, 0x00, 0x22, 0x66);

更一般地说:

// Array of scalar type T
T data[] = {value_0, value_1, ...};

// n-item vector of type V
Vn keys = (Vn)(index_0, index_1, ...); 

// n-item vector of type T
Tn result = data[keys]; 

目前,我能够完成这样的事情的唯一方法是手动完成,但它感觉不到“矢量-y”:

__constant uint data[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};

uchar4 keys = (uchar4)(5, 0, 2, 6);
uint4 results = (uint4)(data[keys.s0], data[keys.s1], data[keys.s2], data[keys.s3]);
// results = (uint4)(0x55, 0x00, 0x22, 0x66);

所以我想这是一个两部分问题:

  1. 有没有办法使用向量作为索引来访问数组?
  2. 如果没有,是否有比我上面展示的更有效的方式?

1 个答案:

答案 0 :(得分:0)

OpenCL C基于C99标准,它不允许数组索引为向量。 您的代码的最后一个样本几乎是您可以得到的。此外,考虑到使用向量元素作为数组索引会导致较差的内存访问模式,这会显着降低IO性能。