我已经开发了一个用于Windows的Mandelbrot生成器,并将其转换为使用SSE指令集。在普通算术中,为了检测迭代的结束,我会进行大于比较并退出。在SSE中,我可以使用_mm_cmpgt_pd / _mm_cmpgt_ps对整个向量进行比较,然而,这将为我关心的情况写入一个新的128位向量,带有全部为1的值。
我的问题是,是否有更有效的方法来检测所有1而不是检查2个打包的64 INTs? 或者,如果检测所有0更有效,则可以进行小于比较。以下是我当前拥有的代码:
我的问题是,是否有更有效的方法来检测所有1而不是检查2个打包的64 INTs? 或者,如果检测所有0更有效,则可以进行小于比较。以下是我当前拥有的代码:
_m128d CompareResult = Magnitude > EarlyOut;
const __m128i Tmp = *reinterpret_cast< __m128i* >( &CompareResult );
if ( Tmp.m128i_u64[ 0 ] == Tmp.m128i_u64[ 1 ] == -1 )
{
break;
}
我希望找到更好的方法,因为我不喜欢这种强制类型转换,而且根据vTune分析,超过30%的迭代时间都花在了最后一行。我知道其中很大一部分是分支本身造成的,但我认为通过更好地检测0或1,可以减少这种情况。
谢谢