使用SSE索引到数组

假设我有一个数组:

uint8_t arr[256]; 

和一个元素

 __m128i x 

包含16个字节,

 x_1, x_2, ... x_16 

我想有效地填充一个新的__m128i元素

 __m128i y 

使用arr中的值取决于x的值,这样:

 y_1 = arr[x_1] y_2 = arr[x_2] . . . y_16 = arr[x_16] 

实现此目的的命令实质上是从非连续的一组存储器位置加载寄存器。 我看到这样一个命令的文档有一个痛苦的模糊记忆,但现在找不到它。 它存在吗? 在此先感谢您的帮助。

SIMD架构中的这种function称为加载/存储分散/聚集。 不幸的是,SSE没有它。 英特尔未来的SIMD架构可能就是这样 – 命运多Lar的Larrabee处理器就是其中的一个例子。 目前,您只需要设计数据结构,这样就不需要这种function。

请注意,您可以使用例如_mm_set_epi8来实现等效的效果:

 y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]); 

虽然当然这只会生成一堆标量代码来加载你的y向量。 如果你在任何性能关键循环之外进行这种操作,例如作为循环之前初始化的一部分,这很好,但在循环内它可能是性能杀手。