c – 使用SSE的水平最小和最大值
发布时间:2020-12-16 05:49:23 所属栏目:百科 来源:网络整理
导读:我有一个使用SSE的功能来做很多事情,而分析器告诉我,我用来计算水平最小值和最大值的代码部分消耗大部分时间. 我一直在使用以下实现: static inline int16_t hMin(__m128i buffer) { buffer = _mm_min_epi8(buffer,_mm_shuffle_epi8(buffer,m1)); buffer =
我有一个使用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]. 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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |