Condividi tramite


I metodi SSE e SSE2 CompareGreaterThan gestiscono correttamente gli input NaN

I metodi System.Runtime.Intrinsics.X86.Sse e System.Runtime.Intrinsics.X86.Sse2 seguenti sono stati corretti per gestire correttamente gli input NaN e corrispondere al comportamento hardware dei metodi equivalenti nella classe System.Runtime.Intrinsics.X86.Avx:

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

Modificare la descrizione

In precedenza, NaN input per i metodi elencati Sse e Sse2 restituivano un risultato non corretto. Il risultato differisce 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 Streaming SIMD Extensions (SSE) e le Streaming SIMD Extensions 2 (SSE2) Architetture del Set di Istruzioni (ISAs) non forniscono supporto hardware diretto per questi metodi di confronto, quindi vengono implementati tramite software. In precedenza, i metodi venivano implementati in modo errato e gestivano in maniera scorretta gli input NaN. Per il codice convertito da nativo, il comportamento non corretto può introdurre bug. Per un percorso di codice a 256 bit, i metodi possono anche produrre risultati diversi per i metodi equivalenti nella classe Avx.

Come esempio di come i metodi erano precedentemente errati, è possibile implementare CompareNotGreaterThan(x,y) come CompareLessThanOrEqual(x,y) per i normali interi. Tuttavia, per gli input NaN, tale logica calcola il risultato errato. Utilizzando CompareNotLessThan(y,x) invece confronta correttamente i numeri e e prende in considerazione gli input NaN.

Versione introdotta

5.0

  • Se il comportamento precedente era un bug, non è necessaria alcuna modifica.

  • Se il comportamento precedente è stato 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