12

假设我有一个数组:

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]

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

4

1 回答 1

7

SIMD 架构中的这种能力称为加载/存储分散/收集。不幸的是,SSE 没有。英特尔未来的 SIMD 架构可能会有这种情况——命运多舛的 Larrabee 处理器就是一个很好的例子。虽然现在你只需要以不需要这种功能的方式设计你的数据结构。

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

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

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

于 2010-12-19T18:10:24.543 回答