_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?

Posted

技术标签:

【中文标题】_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?【英文标题】:What are _mm256_testc_pd, _mm256_testz_pd, _mm256_testnzc_pd for?_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干什么用的? 【发布时间】:2018-11-21 11:04:46 【问题描述】:

我正在尝试理解 _mm256_testc_pd_mm256_testz_pd_mm256_testnzc_pd 内在函数,但我很难理解它们。

为了分析_mm256_testc_pd,我确定了以下情况(a是第一个,b是第二个__mm256d参数`):

如果b 中的所有 压缩双精度均> 0,则ZF=1CF=1 除外: 如果每个ab 中的一个 包装双相互,那么ZF=0 如果每个!ab 中的一个 包装双相互,那么CF=0

换句话说,ZF=1 的值告诉我,要么 a) b 完全是正数,要么 b) 对于 b 中非正数的双精度数,@987654341 中存在匹配双精度数@ 那是负面的。 CF=1 的值告诉我 c) b 完全是正数,或者 d) 对于 b 中的非正数双精度数,!a 中的匹配双数数是负数。

我是否理解正确?我对此有点困惑。这个检查有什么意义?我会用这些内在函数做什么?

【问题讨论】:

最常见的用例是测试比较操作的结果,其中结果元素要么全为 1,要么全为 0(因此测试符号位就足够了)——这使您能够实现谓词,例如使用testz 内在函数作为“全部相等”或“任何大于”等。 (我从未发现任何其他变体的用途)。 @PaulR:不妨将其移至答案。 @JasonR:是的,你是对的 - 我被最初只是简短的评论所迷惑。 ;-) 通常您使用vptestvtestpd,其中一个操作数是一个常量掩码,而不是两个变量。例如检查任何元素是否为负(设置其符号位)。相关:Can PTEST be used to test if two registers are both zero or some other condition?. 【参考方案1】:

最常见的用例是测试比较操作的结果,其中比较的结果元素要么全为 1,要么全为 0(因此测试符号位就足够了)——这使您能够实现诸如“都等于”或“任何大于”等,使用 _mm*_testz_p* 内在函数。

我从未发现任何其他变体的用途。

【讨论】:

以上是关于_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?的主要内容,如果未能解决你的问题,请参考以下文章

AVX指令使用

VC2012哪里找_mm256_pow_pd?

_mm256_movemask_epi8 到 uint64_t

带有 __256i 向量的意外 _mm256_shuffle_epi

试图理解 _mm256_permute2x128_si256 的英特尔内在指南解释

正确使用 _mm256_maskload_ps 将少于 8 个浮点数加载到 __m256