【发布时间】:2016-03-13 08:58:03
【问题描述】:
我需要检查所有向量元素是否非零。到目前为止,我找到了以下解决方案。有一个更好的方法吗?我在 Linux/x86_64 上使用 gcc 4.8.2,指令最高 SSE4.2。
typedef char ChrVect __attribute__((vector_size(16), aligned(16)));
inline bool testNonzero(ChrVect vect)
{
const ChrVect vzero = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
return (0 == (__int128_t)(vzero == vect));
}
更新:上面的代码被编译为以下汇编代码(当编译为非内联函数时):
movdqa %xmm0, -24(%rsp)
pxor %xmm0, %xmm0
pcmpeqb -24(%rsp), %xmm0
movdqa %xmm0, -24(%rsp)
movq -24(%rsp), %rax
orq -16(%rsp), %rax
sete %al
ret
【问题讨论】:
-
您对哪种架构感兴趣? x86?力量?手臂? ...?
-
x86_64,指令最高 SSE4.2
-
@i486: 这只是一种编码风格,当你把常量放在首位时编译器会在你错误地使用 = 而不是 == 时报错。
-
您的代码与您的问题不符。您的问题想知道是否所有元素都非零。但是您的代码会检查 any 元素是否非零。
-
@RaymondChen:这里有两个比较。首先比较输入向量和零向量,结果创建具有单个元素比较结果的新向量。当它们都非零时,结果向量将是零向量。将其转换为 __int128_t 后,值也将为零,并且将返回 true。
标签: c++ c gcc vectorization simd