c – 使用SSE的水平最小和最大值

我有一个使用SSE的功能来做很多事情,而分析器告诉我,我用来计算水平最小值和最大值的代码部分消耗大部分时间.

我一直在使用以下实现:

static inline int16_t hMin(__m128i buffer) {
    buffer = _mm_min_epi8(buffer,_mm_shuffle_epi8(buffer,m1));
    buffer = _mm_min_epi8(buffer,m2));
    buffer = _mm_min_epi8(buffer,m3));
    buffer = _mm_min_epi8(buffer,m4));
    return ((int8_t*) ((void *) &buffer))[0];
}

我需要计算16个1字节整数的最小值和最大值,如您所见.

任何好的建议高度赞赏:)

谢谢

解决方法

我建议两个变化:

用_mm_cvtsi128_si32替换((int8_t *)((void *)& buffer))[0].
用_mm_shuffle_epi32 / _mm_shufflelo_epi16替换_mm_shuffle_epi8,在最近的AMD处理器和Intel Atom上具有更低的延迟,并且可以节省内存加载操作:

static inline int16_t hMin(__m128i buffer)
{
    buffer = _mm_min_epi8(buffer,_mm_shuffle_epi32(buffer,_MM_SHUFFLE(3,2,3,2)));
    buffer = _mm_min_epi8(buffer,_MM_SHUFFLE(1,1,1)));
    buffer = _mm_min_epi8(buffer,_mm_shufflelo_epi16(buffer,_mm_srli_epi16(buffer,8));
    return (int8_t)_mm_cvtsi128_si32(buffer);
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...