c - 对用 C 编码的 4 个整数大小的数组进行 SSE 操作

标签 c x86 sse simd

对于之前的非描述性问题,我们深表歉意。请允许我再次重新表述一下问题:

设置:

我需要使用SSE同时对4个数组中的4个32位值进行ADD和一些按位操作,这4个数组中的所有元素都是整数大小(32位)。结果存入第 5 个数组。

所以我的问题是:

  1. 我需要包含哪些头文件和编译器标志才能使用 C 运行 SSE?
  2. Paul stills 提供的示例代码有效吗?

另一个问题,如果我需要读取整数 A 的最后一位和整数 B 的第一位,并用我刚刚读取的值替换整数 C 的最后一位和第一位,我可以在这里使用 SSE 吗?或者有什么快速的方法可以做到吗?而不是正常情况下的 3 次访问?

再次对之前的帖子表示歉意,并感谢您的任何意见...^_^

最佳答案

假设:

  • 您想要添加 4 个输入数组中相应的整数,并将总和存储在第五个(输出)数组中
  • 整数是 32 位
  • 数组大小 (N) 是 4 的倍数
  • 所有数组均按 16 字节对齐

那么这应该可以做到:

#include <stdint.h>
#include <emmintrin.h>

const size_t N = 4096;  // size of input/output arrays

int32_t array0[N];      // 4 x input arrays
int32_t array1[N];
int32_t array2[N];
int32_t array3[N];
int32_t array_sum[N];   // output array

for (size_t i = 0; i < N; i += 4)
{
    __m128i v0 = _mm_load_si128(&array0[i]); // load 4 x vectors of 4 x int
    __m128i v1 = _mm_load_si128(&array1[i]);
    __m128i v2 = _mm_load_si128(&array2[i]);
    __m128i v3 = _mm_load_si128(&array3[i]);
    __m128i vsum = _mm_add_epi32(v0, v1);    // sum vectors
    __m128i vsum = _mm_add_epi32(vsum, v2);
    __m128i vsum = _mm_add_epi32(vsum, v3);
    _mm_store_si128(&array_out[i], vsum);    // store sum
}

关于c - 对用 C 编码的 4 个整数大小的数组进行 SSE 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528791/

相关文章:

assembly - 具有列优先布局的 int8 x uint8 矩阵向量乘积

C# 指针与 C++ 指针

c - 当我已经返回一个值时,从函数返回错误的最佳方法是什么?

c - 从 Windows 上的蓝牙 COM 端口获取 FILE*

assembly - rbp 不允许作为 SIB 基础?

c - ROP 缓冲区溢出练习问题

c - 将 2 个 32 位数字相乘并使用 AVX2 取前 32 位

assembly - 从 XMM 迁移到 YMM

c++ - VC++ SSE 内在优化怪异

c - 为什么这么多示例链表将 next 指针放在每个节点的末尾而不是开头?