c++ - Altivec:_mm_sad_epu8() 的类似物

标签 c++ image-processing simd powerpc altivec

我尝试移植一个 SSE 函数,该函数获取两个 8 位无符号整数数组的绝对差。 它看起来像:

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 有类似物吗?

最佳答案

不幸的是,Altivec 没有内部函数 _mm_sad_epu8 的直接类似物。 但有可能模仿它:

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);
} 

关于c++ - Altivec:_mm_sad_epu8() 的类似物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35357134/

相关文章:

c++ - 为什么这个简单的线程 C++ 程序在退出时崩溃,除非我调用 thread.join()?

python - 在程序继续运行时保持进程运行 C++

c++ - 链接公共(public)变量和私有(private)变量(具有对私有(private)变量的写访问权限)

python - 使用 Open CV 用鼠标裁剪 ROI 时出现问题

c - 声明与 SIMD 类型的 union 是否有害?

c++ - std::copy 的限制是否比 std::memcpy 更宽松?

java - 来自堆栈的Java中的假彩色图像

python - opencv morphologyEx 删除特定颜色

c++ - 使用混合(浮点、 double )输入 vector 执行 AVX 内积运算的最快方法

c++ - SIMD 代码?