6

据我所知,C++ 中的整数可以被视为布尔值,我们可以有这样的代码:

int a = 6, b = 10;
if (a && b) do something ---> true as both a and b are non-zero

现在,假设我们有:

__m256i a, b;

我需要对 __m256i 中的所有 4 个长变量应用logical_and (&&),如果一对非零则返回true。我的意思是:

(a[0] && b[0]) || (a[1] && b[1]) || ...

为此,我们在 AVX 或 AVX2 中有快速代码吗?

我找不到任何用于此目的的直接指令,而且绝对地,使用按位和 (&) 也不相同。任何帮助将不胜感激。

4

1 回答 1

8

您可以巧妙地将 avpcmpeqq与 a结合起来vptest

__m256i mask = _mm256_cmpeq_epi64(a, _mm256_set1_epi64x(0));
bool result = ! _mm256_testc_si256(mask, b);

result且仅当(~mask & b) != 0

((a[i]==0 ? 0 : -1) & b[i]) != 0 // for some i
// equivalent to
((a[i]==0 ? 0 : b[i])) != 0      // for some i
// equivalent to
a[i]!=0 && b[i]!=0               // for some i

这相当于你想要的。

Godbolt-link(玩弄aand b):https ://godbolt.org/z/aTjx7vMKd

ifresult是循环条件,编译器当然应该直接做jb/jnb指令而不是setnb.

于 2022-02-06T02:27:48.813 回答