【发布时间】:2023-12-20 17:32:01
【问题描述】:
检查 AVX 内在 __m256(8 个向量 float)是否包含任何 inf 的最佳方法是什么?我试过了
__m256 X=_mm256_set1_ps(1.0f/0.0f);
_mm256_cmp_ps(X,X,_CMP_EQ_OQ);
但这与true 相比。请注意,此方法将找到 nan(与 false 相比)。所以一种方法是检查X!=nan && 0*X==nan:
__m256 Y=_mm256_mul_ps(X,_mm256_setzero_ps()); // 0*X=nan if X=inf
_mm256_andnot_ps(_mm256_cmp_ps(Y,Y,_CMP_EQ_OQ),
_mm256_cmp_ps(X,X,_CMP_EQ_OQ));
但是,这似乎有些冗长。有更快的方法吗?
【问题讨论】:
-
屏蔽符号位并直接与正无穷大进行比较。这是 2 条指令。
-
@Mysticial 3:我还得加载 +inf。
-
根据编译器的处理方式,可以将常量内联为内存访问。所以像这样:
vandnps ymm1, ymm0, YMMPTR[MASK]; vcmpps ymm1, ymm1, YMMPTR[INIFINITY], 0; -
如果它处于循环中,编译器可能会将两个常量都拉入寄存器。
-
@Mystical 你介意将你的评论“升级”为答案吗?
标签: c++ c sse intrinsics avx