c - 使用 SSE 索引到数组中

标签 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]

实现此目的的命令本质上是从一组不连续的内存位置加载寄存器。我对曾经看过此类命令的文档的内存非常模糊,但现在找不到了。它存在吗?预先感谢您的帮助。

最佳答案

SIMD 架构中的这种功能称为加载/存储分散/聚集。不幸的是,SSE 没有它。 Intel future 的 SIMD 架构可能会有这种情况——命运多舛的 Larrabee 处理器就是一个很好的例子。不过现在您只需要以不需要这种功能的方式设计您的数据结构。

请注意,您可以使用例如_mm_set_epi8:

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

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

关于c - 使用 SSE 索引到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26464323/

相关文章:

gcc 选项同时使用 i87、AVX 但不使用 SSE

assembly - 在 SSE2 上进行无符号 64 位比较的最有效方法是什么?

c - 一个代码中的 SSE 错误

c++ - SIMD:翻转四个压缩整数的符号

c - 中止陷阱 : 6 error with arrays in c

c - 如何隐藏Linux静态库的本地符号

在 C 中将 char 从 big endian 转换为 little endian

c++ - SSE 的条件语句

algorithm - 光线与一束 SIMD 打包三角形相交(光线追踪)

将整数数组转换为字符数组,每个整数每 3 位