相关疑难解决方法(0)

浮点相等比较的SIMD指令(NaN == NaN)

哪些指令用于比较由4*32位浮点值组成的两个128位向量?

是否存在将双方的NaN值视为相等的指令?如果不是,提供反身性的解决方案(即NaN等于NaN)的性能影响有多大?

我听说,与IEEE语义相比,确保反身性会产生显着的性能影响,因为NaN不等于自己,我想知道这种影响是否会很大.

我知道您在处理浮点值时通常需要使用epsilon比较而不是精确的质量.但是这个问题是关于完全相等的比较,例如,您可以使用它来消除哈希集中的重复值.

要求

  • +0并且-0必须相等.
  • NaN 必须与自己相等.
  • NaN的不同表示应该相等,但如果性能影响太大,可能会牺牲该要求.
  • true如果两个向量中的所有四个float元素相同,则结果应为布尔值,如果至少一个元素不同,则结果为false.其中true由标量整数1falseby表示0.

测试用例

(NaN, 0, 0, 0) == (NaN, 0, 0, 0) // for all representations of NaN
(-0,  0, 0, 0) == (+0,  0, 0, 0) // equal despite different bitwise representations
(1,   0, 0, 0) == (1,   0, 0, 0)
(0,   0, 0, 0) != (1,   0, 0, 0) // at least one different element => not equal …
Run Code Online (Sandbox Code Playgroud)

floating-point x86 assembly x86-64 simd

11
推荐指数
2
解决办法
1971
查看次数

与 SSE 比较 16 字节字符串

我有 16 字节的“字符串”(它们可能更短,但您可能会假设它们在末尾用零填充),但您可能不会假设它们是 16 字节对齐的(至少不总是)。

如何编写一个例程将它们与 SSE 内在函数进行比较(是否相等)?我发现这个代码片段可能会有帮助,但我不确定它是否合适?

register __m128i xmm0, xmm1; 
register unsigned int eax; 

xmm0 = _mm_load_epi128((__m128i*)(a)); 
xmm1 = _mm_load_epi128((__m128i*)(b)); 

xmm0 = _mm_cmpeq_epi8(xmm0, xmm1); 

eax = _mm_movemask_epi8(xmm0); 

if(eax==0xffff) //equal 
else   //not equal 
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下或者写一个函数体吗?

它需要在 GCC/mingw 中工作(在 32 位 Windows 上)。

c x86 gcc sse simd

5
推荐指数
1
解决办法
4275
查看次数

标签 统计

simd ×2

x86 ×2

assembly ×1

c ×1

floating-point ×1

gcc ×1

sse ×1

x86-64 ×1