c/c++语言开发共享测试两个__m128i变量之间的相等性

如果我想在两个__m128i变量之间进行逐__m128i测试,我是否需要使用SSE指令或者我可以使用== ? 如果没有,我应该使用哪条SSE指令?

    虽然使用_mm_movemask_epi8是一种解决方案,但如果你有一个带SSE4.1的处理器,我认为更好的解决方案是使用一条指令来设置FLAGS寄存器中的零或进位标志。 这样可以保存testcmp指令 。

    要做到这一点,你可以这样做:

     if(_mm_test_all_ones(_mm_cmpeq_epi8(v1,v2))) { //v0 == v1 } 

    编辑:正如Paul R指出_mm_test_all_ones生成两条指令: pcmpeqdptest 。 使用_mm_cmpeq_epi8 ,总共有三条指令。 这是一个更好的解决方案,总共只使用两条指令:

     __m128i neq = _mm_xor_si128(v1,v2); if(_mm_test_all_zeros(neq,neq)) { //v0 == v1 } 

    这会产生

     pxor %xmm1, %xmm0 ptest %xmm0, %xmm0 

    您可以使用比较,然后从比较结果中提取掩码:

     __m128i vcmp = _mm_cmpeq_epi8(v0, v1); // PCMPEQB uint16_t vmask = _mm_movemask_epi8(vcmp); // PMOVMSKB if (vmask == 0xffff) { // v0 == v1 } 

    这适用于SSE2及更高版本。

    正如@Zboson所指出的那样,如果你有SSE 4.1那么你可以这样做,这可能会稍微高效一点,因为它是两个SSE指令,然后是对标志(ZF)的测试:

     __m128i vcmp = _mm_xor_si128(v0, v1); // PXOR if (_mm_testz_si128(vcmp, vcmp)) // PTEST (requires SSE 4.1) { // v0 == v1 } 

    我只是在Haswell Core i7上对这两个实现进行了基准测试,使用clang来编译测试工具并且时序结果非常相似 – SSE4实现似乎非常快,但很难衡量差异。

    考虑使用SSE4.1指令ptest

     if(_mm_testc_si128(v0, v1)) {if equal} else {if not} 

    ptest计算a和掩码中128位(表示整数数据)的按位AND,如果结果为零则返回1,否则返回0。

    需要了解更多c/c++开发分享测试两个__m128i变量之间的相等性,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享测试两个__m128i变量之间的相等性相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979254.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐