获取 __m256 变量中第一个非零元素的索引
Get index of first element that is not zero in a __m256 variable
__m256 dst = _mm256_cmp_ps(value1, value2, _CMP_LE_OQ);
如果 dst
是 [0,0,0,-nan, 0,0,0,-nan];
我希望能够知道第一个 -nan
索引,在本例中为 3
而无需使用 8
迭代进行 for 循环。
这可能吗?
我会movmskps
the result of the comparison and then do a bitscan forward。
使用内在函数(这适用于 gcc/clang,参见 here for alternatives):
int pos = __builtin_ctz(_mm256_movemask_ps(dst));
请注意,如果未设置任何位,bsf
的结果是不确定的。要解决此问题,例如,如果没有设置其他位,您可以编写此代码以获取 8
:
int pos = __builtin_ctz(_mm256_movemask_ps(dst) | 0x100);
__m256 dst = _mm256_cmp_ps(value1, value2, _CMP_LE_OQ);
如果 dst
是 [0,0,0,-nan, 0,0,0,-nan];
我希望能够知道第一个 -nan
索引,在本例中为 3
而无需使用 8
迭代进行 for 循环。
这可能吗?
我会movmskps
the result of the comparison and then do a bitscan forward。
使用内在函数(这适用于 gcc/clang,参见 here for alternatives):
int pos = __builtin_ctz(_mm256_movemask_ps(dst));
请注意,如果未设置任何位,bsf
的结果是不确定的。要解决此问题,例如,如果没有设置其他位,您可以编写此代码以获取 8
:
int pos = __builtin_ctz(_mm256_movemask_ps(dst) | 0x100);