首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Altivec:_mm_sad_epu8()的模拟

Altivec:_mm_sad_epu8()的模拟
EN

Stack Overflow用户
提问于 2016-02-12 07:35:52
回答 1查看 309关注 0票数 2

我尝试移植一个SSE函数,得到两个8位无符号整数数组的绝对差。看上去:

代码语言:javascript
复制
uint64_t AbsDiffSum(const uint8_t * a, const uint8_t * b, size_t size) 
{
    assert(size%16 == 0);
     __m128i _sum = _mm_setzero_si128();
    for(size_t i = 0; i < size; i += 16)
    {
        const __m128i _a = _mm_loadu_si128((__m128i*)(a + i));
        const __m128i _b = _mm_loadu_si128((__m128i*)(b + i));
        _sum = _mm_add_epi64(_sum, _mm_sad_epu8(_a, _b));
    }
    return _mm_cvtsi128_si64(_mm_add_epi64(_sum, _mm_srli_si128(_sum, 8)));
}

主要工作由本征函数_mm_sad_epu8()执行。

有类似于Altivec的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-12 07:46:32

不幸的是,对于Altivec来说,本征函数_mm_sad_epu8没有直接的类似物。但也有可能仿效这种做法:

代码语言:javascript
复制
typedef __vector uint8_t uint8x16_t;
typedef __vector uint32_t uint32x4_t;
const uint8_t K8_01 = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

uint64_t AbsDiffSum(const uint8_t * a, const uint8_t * b, size_t size) 
{
    uint32x4_t _sum = {0, 0, 0, 0};
    for(size_t i = 0; i < size; i += 16)
    {
        // Aligned loading of 128-bit vector
        uint8x16_t _a = vec_ld(a + i);
        // Aligned loading of 128-bit vector
        uint8x16_t _b = vec_ld(b + i); 
        // Find absolute difference of two 8-bit unsigned
        uint8x16_t absDifference = vec_sub(vec_max(a, b), vec_min(a, b));
        // Sum result with using of vec_msum
        _sum = vec_msum(absDifference, K8_01, _sum);
    }
    return vec_extract(_sum, 0) + vec_extract(_sum, 1) + 
           vec_extract(_sum, 2) + vec_extract(_sum, 3);
} 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35357134

复制
相关文章

相似问题

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