Altivec:_mm_sad_epu8()的类似物
Altivec: analogue of _mm_sad_epu8()
我尝试移植一个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++中使用引用实现类似python的行为
- 使用Qt C++计算类似Git的SHA1哈希
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- C++合并类似物
- C# 通用比较方法 [C++模板的类似物]
- STD ::与指定线程的异步类似物
- QT有GSL :: Span的类似物吗?
- 用于嵌入式设备的轻巧SMBClient类似物
- C#扩展方法类似物在C 中
- Python方法的OpenCV C 类似物
- Pascal类型二进制文件的C++和Python类似物
- 整数输出格式.什么是 printf(%.3x) 的类似物
- C++中xmalloc的右类似物
- 除了函数之外,是否有对象的"this"的类似物?
- 不带GLkit的OpenGL ES.GLKMatrix和纯OpenGL ES中函数的类似物
- 与 Ruby's Rack 最接近C++类似物是什么?
- _mm_cvtsd_f64高阶浮点的类似物
- Altivec:_mm_sad_epu8()的类似物
- DirectX — 有没有类似 DirectDraw surface Flip() 的类似物
- c++中的strtok()类似物