c - SIMD以下代码

标签 c x86 sse simd

如何在 C 中对以下代码进行 SIMIDize(当然是使用 SIMD 内在函数)?我在理解 SIMD 内在函数时遇到问题,这会有很大帮助:

int sum_naive( int n, int *a )
{
    int sum = 0;
    for( int i = 0; i < n; i++ )
        sum += a[i];
    return sum;
}

最佳答案

这是一个相当简单的实现(警告:未经测试的代码):

int32_t sum_array(const int32_t a[], const int n)
{
    __m128i vsum = _mm_set1_epi32(0);       // initialise vector of four partial 32 bit sums
    int32_t sum;
    int i;

    for (i = 0; i < n; i += 4)
    {
        __m128i v = _mm_load_si128(&a[i]);  // load vector of 4 x 32 bit values
        vsum = _mm_add_epi32(vsum, v);      // accumulate to 32 bit partial sum vector
    }
    // horizontal add of four 32 bit partial sums and return result
    vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
    vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4));
    sum = _mm_cvtsi128_si32(vsum);
    return sum;
}

请注意,输入数组 a[] 需要 16 字节对齐,并且 n 应该是 4 的倍数。

关于c - SIMD以下代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11872952/

相关文章:

C - 如何初始化未知大小的二维数组

c - 如何知道 HTTP header 部分何时结束?

assembly - 所有数据都是有效的 x86 16 位机器代码吗?

c - SIMD 2D矩阵英特尔指令集

C++ CodeBlocks 反汇编;代码太多了?

x86 - 如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数

c++ - 如何将鼠标移动的模拟操作发送到 UE4 应用程序

c - 如何在C中记录经过的墙时间?

assembly - 如何将(最多)16 个单字节移动到 XMM 寄存器中?

c - gcc 内联 simd 汇编错误 : short type movdqu instruction