Sdílet prostřednictvím


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

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

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

Změna popisu

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

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 Avx třídě.

Standardní architektury standardu 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 256bitovou cestu kódu mohou metody také vytvořit různé výsledky ekvivalentní metody ve Avx třídě.

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. Pro NaN vstupy ale tato logika vypočítá nesprávný výsledek. Místo toho použijete CompareNotLessThan(y,x) správné porovnání čísel a bere NaN v úvahu vstupy.

Zavedená 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