使用SSE索引到数组

Tra*_*vis 12 c sse simd

假设我有一个数组:

uint8_t arr[256];
Run Code Online (Sandbox Code Playgroud)

和一个元素

__m128i x
Run Code Online (Sandbox Code Playgroud)

包含16个字节,

x_1, x_2, ... x_16
Run Code Online (Sandbox Code Playgroud)

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

__m128i y
Run Code Online (Sandbox Code Playgroud)

使用arr取决于值的值x,以便:

y_1  = arr[x_1]
y_2  = arr[x_2]
   .
   .
   .
y_16 = arr[x_16]
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*l R 7

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

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

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]);
Run Code Online (Sandbox Code Playgroud)

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