我有一个使用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); }
原文地址:https://www.jb51.cc/c/113655.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。