gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:36:36 26 4
gpt4 key购买 nike

我尝试移植一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com