c++ - 如何使用 SSE 将 16 位整数除以 255?

标签 c++ image-processing sse simd sse2

我负责图像处理。 我需要将 16 位整数 SSE vector 除以 255。

我不能使用像 _mm_srli_epi16() 这样的移位运算符,因为 255 不是 2 的倍数。

我当然知道可以将整数转换为 float ,执行除法,然后再转换回整数。

但也许有人知道另一种解决方案......

最佳答案

有一个除以 255 的整数近似值:

inline int DivideBy255(int value)
{
    return (value + 1 + (value >> 8)) >> 8;
}

因此使用 SSE2 时它看起来像:

inline __m128i DivideI16By255(__m128i value)
{
    return _mm_srli_epi16(_mm_add_epi16(
        _mm_add_epi16(value, _mm_set1_epi16(1)), _mm_srli_epi16(value, 8)), 8);
}

对于 AVX2:

inline __m256i DivideI16By255(__m256i value)
{
    return _mm256_srli_epi16(_mm256_add_epi16(
        _mm256_add_epi16(value, _mm256_set1_epi16(1)), _mm256_srli_epi16(value, 8)), 8);
}

对于 Altivec(电源):

typedef __vector int16_t v128_s16;
const v128_s16 K16_0001 = {1, 1, 1, 1, 1, 1, 1, 1};
const v128_s16 K16_0008 = {8, 8, 8, 8, 8, 8, 8, 8};

inline v128_s16 DivideBy255(v128_s16 value)
{
    return vec_sr(vec_add(vec_add(value, K16_0001), vec_sr(value, K16_0008)), K16_0008);
}

对于 NEON (ARM):

inline int16x8_t DivideI16By255(int16x8_t value)
{
    return vshrq_n_s16(vaddq_s16(
        vaddq_s16(value, vdupq_n_s16(1)), vshrq_n_s16(value, 8)), 8);
}

关于c++ - 如何使用 SSE 将 16 位整数除以 255?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35285324/

相关文章:

c++ - 从字符串中删除 N 个第一个字符

c++ - 在 openCV C++ 中拍摄一个总是旋转的 pipe 的图像

matlab - 边界超像素和邻接矩阵

x86 - 如何使用 _mm_mul_ps 指定对齐方式

c - 在只有 3 个颜色分量的浮点像素上使用 SSE

c++ - 使用 std::accumulate 算法和 lambda 表达式对元素进行计数

c++ - 在构造函数中初始化,最佳实践?

c++ - 使用 C++ 通过文件存储和检索链表

android - 从android中捕获的图像中提取信息

c++ - kcachegrind 显示我的 memcpy 未对齐