获取__m256变量中第一个不为零的元素的索引

hid*_*yat 14 c c++ sse simd avx

__m256  dst = _mm256_cmp_ps(value1, value2, _CMP_LE_OQ);
Run Code Online (Sandbox Code Playgroud)

如果dst是,[0,0,0,-nan, 0,0,0,-nan]; 我希望能够知道第一个-nan索引,在这种情况下,3无需进行for循环8迭代。这可能吗?

cht*_*htz 8

我将movmskps比较的结果,然后进行位扫描

使用内在函数(与gcc / clang一起使用,请参见此处的替代方法):

int pos = __builtin_ctz(_mm256_movemask_ps(dst));
Run Code Online (Sandbox Code Playgroud)

请注意,bsf如果未设置任何位,则未指定的结果。要解决此问题,例如8,如果未设置其他位,则可以将其编写为get :

int pos = __builtin_ctz(_mm256_movemask_ps(dst) | 0x100);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在较新的 CPU 上,例如 Intel Haswell 或更新版本,您可以使用 `_tzcnt_u32()` 而不是 `__builtin_ctz()`。内在的 `_tzcnt_u32()` 可用于所有主要编译器(gcc、icc、clang、MSVC)。它映射到 `tzcnt` 指令,该指令也针对零输入进行了很好的定义。 (2认同)