c++ - sse 快速加载数组的前半部分

标签 c++ sse

假设我有一个大小为 8 的数组,其中填充了 unsigned int。

unsigned int t[8]

现在我想将每个元素的前 16 位加载到 128 位寄存器中:

__m128i to_fill

有没有快速的方法来做到这一点?而不是使用循环并屏蔽掉用于 每个元素?

最佳答案

您需要加载两个 4 x 32 位整数 vector ,屏蔽掉每个元素的高 16 位,然后将它们打包到一个 8 x 16 位整数 vector 中。

__m128i v_lo = _mm_loadu_si128((__m128i *)&t[0]);
__m128i v_hi = _mm_loadu_si128((__m128i *)&t[4]);
v_lo = _mm_and_si128(v_lo, _mm_set1_epi32(0xffff));
v_hi = _mm_and_si128(v_hi, _mm_set1_epi32(0xffff));
__m128i v = _mm_packs_epi32(v_lo, v_hi);

关于c++ - sse 快速加载数组的前半部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18620298/

相关文章:

c++ - 在 Windows 10 中构建 OpenCV 时出现 Qt 和 cvv 的链接错误

c++ - 检查 C/C++ 中的开放端口

c++ - 在 OpenCV C++ 接口(interface)中更改 Mat 类实例的数据类型

c++ - 严格的别名,-ffast-math 和 SSE

performance - 为什么不将AVX寄存器用作超快速缓存?

c++ - Qt 中的智能指针

c++ - std::vector 的奇怪行为

assembly - 使用 ymm 寄存器作为 "memory-like"存储位置

c - 矩阵乘法的自动向量化

c - 上交所指令