假设我有一个数组:
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)
实现此目的的命令实质上是从非连续的一组存储器位置加载寄存器.我有一种痛苦的模糊记忆,看过这样一个命令的文档,但现在找不到它.它存在吗?在此先感谢您的帮助.
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向量.如果你在任何性能关键循环之外进行这种操作,例如作为循环之前的初始化的一部分,这很好,但在循环内它可能是性能杀手.