Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSE Intrinsics:测试所有0或1的最快方法?_C_Windows_Optimization_Sse_Intrinsics - Fatal编程技术网

SSE Intrinsics:测试所有0或1的最快方法?

SSE Intrinsics:测试所有0或1的最快方法?,c,windows,optimization,sse,intrinsics,C,Windows,Optimization,Sse,Intrinsics,我为Windows开发了一个Mandelbrot生成器,我刚刚将其转换为使用SSE内部函数。为了检测迭代的结束,在普通的算术中,我做了一个大于比较的分解。在SSE中执行此操作时,我可以使用_mm_cmpgt_pd/_mm_cmpgt_ps对整个向量进行比较,但是这将为我关心的情况编写一个包含所有1的新128位向量 我的问题是,有没有比检查2个压缩的64个整数更有效的方法来检测所有1?或者,如果检测所有0的效率更高,那么我可以比较不到。以下是我目前拥有的: _m128d CompareResult

我为Windows开发了一个Mandelbrot生成器,我刚刚将其转换为使用SSE内部函数。为了检测迭代的结束,在普通的算术中,我做了一个大于比较的分解。在SSE中执行此操作时,我可以使用_mm_cmpgt_pd/_mm_cmpgt_ps对整个向量进行比较,但是这将为我关心的情况编写一个包含所有1的新128位向量

我的问题是,有没有比检查2个压缩的64个整数更有效的方法来检测所有1?或者,如果检测所有0的效率更高,那么我可以比较不到。以下是我目前拥有的:

_m128d CompareResult = Magnitude > EarlyOut;
const __m128i Tmp = *reinterpret_cast< __m128i* >( &CompareResult );
if ( Tmp.m128i_u64[ 0 ] == Tmp.m128i_u64[ 1 ] == -1 )
{
    break;
}
\u m128d比较结果=幅值>提前;
常量m128i Tmp=*重新解释强制转换<\uuuu m128i*>(&CompareResult);
如果(Tmp.m128i_u64[0]==Tmp.m128i_u64[1]=-1)
{
打破
}
我之所以想找到更好的方法,是因为我不喜欢演员阵容,但根据vTune的说法,我的迭代时间有30%以上都花在了最后一行上。我知道分支本身会有很多问题,但我想我可以通过更好地检测0或1来减少这些问题


谢谢

假设您正在测试比较结果,那么您只需将每个字节的MS位提取为16位int并进行测试,例如

int mask = _mm_movemask_epi8((__m128i)CompareResult);
if (mask == 0xffff)
{
    // compare results are all "true"
}
注意,这是SSE中SIMD谓词更通用技术的一个示例,即

mask == 0xffff // all "true"
mask == 0x0000 // all "false"
mask != 0xffff // any "false"
mask != 0x0000 // any "true"

我认为这也是最有效的解决方案。当使用128位数据时,可能需要0xFFFF代替0xFF。感谢回复。我把这个放进去,它比我原来的版本稍微慢一点。此外,我仍然需要难看的转换,因为我的SSE变量类型是_m128d,尽管我将其转换为const引用,这也节省了一些时间。请注意,不同CPU和不同编译器的性能可能会有所不同,也就是说,在某些情况下,您可能会获得胜利,但在其他情况下则不会,因此,如果这是通用发行版的代码,那么如果可以的话,您可能希望使用其他CPU进行基准测试。如果您有SSE4(
PTEST
),请参阅上面链接的问题。@FrankH:
PTEST
适用于检查所有零,但我不确定它是否有助于所有一的情况。请参阅: