使用SSE索引到数组

时间:2010-12-19 16:20:38

标签: c sse simd

假设我有一个数组:

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]

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

1 个答案:

答案 0 :(得分: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]);

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