Sdílet prostřednictvím


Metody SSE a SSE2 CompareGreaterThan správně zpracovávají vstupy NaN

Následující metody System.Runtime.Intrinsics.X86.Sse a System.Runtime.Intrinsics.X86.Sse2 byly opraveny, aby správně zpracovávaly vstupy NaN a odpovídaly hardwarovému chování ekvivalentních metod ve třídě System.Runtime.Intrinsics.X86.Avx:

  • CompareGreaterThan
  • CompareGreaterThanOrEqual
  • CompareNotGreaterThan
  • CompareNotGreaterThanOrEqual
  • CompareScalarGreaterThan
  • CompareScalarGreaterThanOrEqual
  • CompareScalarNotGreaterThan
  • CompareScalarNotGreaterThanOrEqual

Změnit popis

Dříve vstupy NaN do uvedených metod Sse a Sse2 vracely nesprávný výsledek. Výsledek se také liší od výsledku vygenerovaného odpovídající metodou ve třídě Avx.

Počínaje rozhraním .NET 5 tyto metody správně zpracovávají NaN vstupy a vrací stejné výsledky jako odpovídající metody ve třídě Avx.

Architektury sady instrukcí SSE (Streaming SIMD Extensions) a Streaming SIMD Extensions 2 (SSE2) neposkytují přímou podporu hardwaru pro tyto metody porovnání, takže jsou implementované v softwaru. Dříve byly metody nesprávně implementovány a nesprávně zpracovávaly NaN vstupy. Pro kód portovaný z nativního kódu může nesprávné chování představovat chyby. Pro 256 bitovou cestu kódu mohou metody také přinést jiné výsledky než ekvivalentní metody ve třídě Avx.

Jako příklad, jak byly metody dříve nesprávné, můžete implementovat CompareNotGreaterThan(x,y) jako CompareLessThanOrEqual(x,y) pro běžná celá čísla. U NaN vstupů ale tato logika vypočítá nesprávný výsledek. Místo toho se při použití CompareNotLessThan(y,x) čísla správně porovnávají a a berou v úvahu NaN vstupy.

Uváděná verze

5.0

  • Pokud došlo k chybě předchozího chování, nevyžaduje se žádná změna.

  • Pokud bylo předchozí chování žádoucí, můžete toto chování zachovat tak, že změníte příslušné vyvolání následujícím způsobem:

    • CompareGreaterThan(x,y) –>CompareNotLessThanOrEqual(x,y)
    • CompareGreaterThanOrEqual(x,y) –>CompareNotLessThan(x,y)
    • CompareNotGreaterThan(x,y) –>CompareLessThanOrEqual(x,y)
    • CompareNotGreaterThanOrEqual(x,y) –>CompareLessThan(x,y)
    • CompareScalarGreaterThan(x,y) –>CompareScalarNotLessThanOrEqual(x,y)
    • CompareScalarGreaterThanOrEqual(x,y) –>CompareScalarNotLessThan(x,y)
    • CompareScalarNotGreaterThan(x,y) –>CompareScalarLessThanOrEqual(x,y)
    • CompareScalarNotGreaterThanOrEqual(x,y) –>CompareScalarLessThan(x,y)

Ovlivněná rozhraní API