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
Doporučená akce
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
System.Runtime.Intrinsics.X86.Sse.CompareGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareGreaterThanOrEqual(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareNotGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareNotGreaterThanOrEqual(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareScalarGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareScalarNotGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse2.CompareGreaterThan(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareGreaterThanOrEqual(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareNotGreaterThan(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareScalarGreaterThan(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareScalarNotGreaterThan(Vector128<Double>, Vector128<Double>)