Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
C++ 检查穿过_m128i向量的水平零?_C++_Intel_Vectorization_Sse_Avx - Fatal编程技术网

C++ 检查穿过_m128i向量的水平零?

C++ 检查穿过_m128i向量的水平零?,c++,intel,vectorization,sse,avx,C++,Intel,Vectorization,Sse,Avx,我有几个包含32位无符号整数的\uuu m128i向量,我想检查4个整数中是否有一个是零 我知道如何“聚合”多个\uuuum128i向量,但最终我还是会得到一个\uuuuum128i向量,然后需要水平检查 如何在最后一个向量上执行零的最终水平检查 编辑我使用的是Intel Intrinsic,而不是内联汇编不要这样做。尽可能避免水平操作;这对矢量码的性能是致命的 相反,将向量与零向量进行比较,然后使用PMOVMSKB在GPR中获得掩码。如果该遮罩为非零,则向量的至少一条车道为零: __m128i

我有几个包含32位无符号整数的
\uuu m128i
向量,我想检查4个整数中是否有一个是零

我知道如何“聚合”多个
\uuuum128i
向量,但最终我还是会得到一个
\uuuuum128i
向量,然后需要水平检查

如何在最后一个向量上执行零的最终水平检查


编辑我使用的是Intel Intrinsic,而不是内联汇编

不要这样做。尽可能避免水平操作;这对矢量码的性能是致命的

相反,将向量与零向量进行比较,然后使用PMOVMSKB在GPR中获得掩码。如果该遮罩为非零,则向量的至少一条车道为零:

__m128i yourVector;
__m128i zeroVector = _mm_set1_epi32(0);

if (_mm_movemask_epi8(_mm_cmpeq_epi32(yourVector,zeroVector))) {
    // at least one lane of your vector is zero.
}
如果您想采用SSE4.1,也可以使用PTEST



从表面上看,如果你真的需要做一个水平测试,出于某种原因,应该是movhlps+andps+shufps+andps。但是不要那样做。

不要这样做。尽可能避免水平操作;这对矢量码的性能是致命的

相反,将向量与零向量进行比较,然后使用PMOVMSKB在GPR中获得掩码。如果该遮罩为非零,则向量的至少一条车道为零:

__m128i yourVector;
__m128i zeroVector = _mm_set1_epi32(0);

if (_mm_movemask_epi8(_mm_cmpeq_epi32(yourVector,zeroVector))) {
    // at least one lane of your vector is zero.
}
如果您想采用SSE4.1,也可以使用PTEST



从表面上看,如果你真的需要做一个水平测试,出于某种原因,应该是movhlps+andps+shufps+andps。但是不要这样做。

您尝试过使用测试内部函数吗?Compare+test可能会执行您想要的操作。您是否尝试过使用test Intrinsic?比较+测试可能会做你想做的。@RaymondChen,但这很容易被颠倒。@RaymondChen:作为神秘的注释,任何零车道都是一样的!(所有车道非零),PTEST可以这样做。@user997112否。求和需要实际相加。在AVX512之前,不会有用于加法的水平缩减指令。@stephennon这听起来像是一个更大向量的缩减。最后,你仍然需要在一个向量上减少。但在这种情况下,它可能不是性能关键,因为它是O(N)操作的O(1)。@StephenCanon如果我写水平向量代码,它总是在循环之后,一旦所有并行处理完成,我需要聚合结果。@RaymondChen,但这很容易颠倒。@RaymondChen:作为神秘的注释,任何零车道都与相同!(所有车道非零),PTEST可以这样做。@user997112否。求和需要实际相加。在AVX512之前,不会有用于加法的水平缩减指令。@stephennon这听起来像是一个更大向量的缩减。最后,你仍然需要在一个向量上减少。但在这种情况下,它可能不是性能关键,因为它是O(N)操作的O(1)@StephenCanon如果我写水平向量代码,它总是在循环之后,一旦所有并行处理完成,我需要聚合结果。