首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIMD下面的代码

SIMD下面的代码
EN

Stack Overflow用户
提问于 2012-08-09 04:50:23
回答 1查看 7.9K关注 0票数 14

我如何用C语言SIMIDize下面的代码(当然是使用SIMD的内部函数)?我在理解SIMD内部函数时遇到了困难,这将会有很大帮助:

代码语言:javascript
复制
int sum_naive( int n, int *a )
{
    int sum = 0;
    for( int i = 0; i < n; i++ )
        sum += a[i];
    return sum;
}
EN

回答 1

Stack Overflow用户

发布于 2012-08-09 14:23:51

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

代码语言:javascript
复制
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的倍数。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11872952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档