C++ 获取_m256变量中第一个非零元素的索引
如果C++ 获取_m256变量中第一个非零元素的索引,c++,c,sse,simd,avx,C++,C,Sse,Simd,Avx,如果dst是[0,0,0,-nan,0,0,0,-nan] 我希望能够知道第一个-nan索引,在本例中是3,而无需使用8迭代执行for循环。 这是可能的吗?我会计算比较的结果,然后做一个比较 使用intrinsic(这适用于gcc/clang,请参阅): 请注意,如果未设置位,bsf的结果未指定。要解决此问题,例如,如果未设置其他位,则可以编写此代码以获取8: int pos = __builtin_ctz(_mm256_movemask_ps(dst)); 将比较结果视为整数或掩码,即使它位
dst
是[0,0,0,-nan,0,0,0,-nan]代码>
我希望能够知道第一个-nan
索引,在本例中是3
,而无需使用8
迭代执行for循环。
这是可能的吗?我会计算比较的结果,然后做一个比较
使用intrinsic(这适用于gcc/clang,请参阅):
请注意,如果未设置位,bsf
的结果未指定。要解决此问题,例如,如果未设置其他位,则可以编写此代码以获取8
:
int pos = __builtin_ctz(_mm256_movemask_ps(dst));
将比较结果视为整数或掩码,即使它位于\uuuum256
中。它是0或全1,这是2的补码-1=无符号0xFFFFFF。我的意思是,如果解释为IEEE binary32,它们是0或-NaN的位模式,但这很少是您想要使用它们的方式。请注意,在较新的CPU上,例如Intel Haswell或更新的CPU上,您可以使用\u tzcnt\u u32()
而不是\u builtin\u ctz()
。内在的\u tzcnt\u u32()
可用于所有主要编译器(gcc、icc、clang、MSVC)。它映射到tzcnt
指令,这也是为零输入定义的。
int pos = __builtin_ctz(_mm256_movemask_ps(dst));
int pos = __builtin_ctz(_mm256_movemask_ps(dst) | 0x100);