I metodi SSE e SSE2 CompareGreaterThan gestiscono correttamente gli input non un numero
I metodi System.Runtime.Intrinsics.X86.Sse e System.Runtime.Intrinsics.X86.Sse2 seguenti sono stati corretti per gestire correttamente gli input NaN
e abbinare il comportamento hardware dei metodi equivalenti nella classe System.Runtime.Intrinsics.X86.Avx:
CompareGreaterThan
CompareGreaterThanOrEqual
CompareNotGreaterThan
CompareNotGreaterThanOrEqual
CompareScalarGreaterThan
CompareScalarGreaterThanOrEqual
CompareScalarNotGreaterThan
CompareScalarNotGreaterThanOrEqual
Descrizione delle modifiche
In precedenza, gli input NaN
per i metodi Sse e Sse2 elencati restituivano un risultato non corretto. Il risultato differiva anche dal risultato generato dal metodo corrispondente nella classe Avx.
A partire da .NET 5, questi metodi gestiscono correttamente gli input NaN
e restituiscono gli stessi risultati dei metodi corrispondenti nella classe Avx.
Le architetture standard del settore SSE (Streaming SIMD Extensions) e SSE2 (Streaming SIMD Extensions 2) non forniscono supporto hardware diretto per questi metodi di confronto, quindi vengono implementati nel software. In precedenza, i metodi non erano implementati nel modo appropriato e non gestivano gli input NaN
correttamente. Per il codice trasferito da un'implementazione nativa, il comportamento non corretto può introdurre bug. Per un percorso del codice a 256 bit, i metodi possono anche generare risultati diversi per i metodi equivalenti nella classe Avx.
Come esempio dei metodi precedentemente errati, è possibile implementare CompareNotGreaterThan(x,y)
come CompareLessThanOrEqual(x,y)
per gli interi normali. Tuttavia, per gli input NaN
, tale logica calcola il risultato errato. L'uso di CompareNotLessThan(y,x)
confronta invece correttamente i numeri e tiene conto degli input NaN
.
Versione introdotta
5.0
Azione consigliata
Se il comportamento precedente era un bug, non è necessaria alcuna modifica.
Se il comportamento precedente era desiderato, è possibile mantenere tale comportamento modificando la chiamata pertinente come indicato di seguito:
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)
API interessate
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>)
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per