Bagikan melalui


Metode SSE dan SSE2 CompareGreaterThan menangani input NaN dengan benar

Metode dan System.Runtime.Intrinsics.X86.Sse2 berikut System.Runtime.Intrinsics.X86.Sse telah diperbaiki untuk menangani NaN input dengan benar dan mencocokkan perilaku perangkat keras dari metode yang setara di System.Runtime.Intrinsics.X86.Avx kelas :

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

Deskripsi perubahan

Sebelumnya, NaN input ke daftar Sse dan Sse2 metode mengembalikan hasil yang salah. Hasilnya juga berbeda dari hasil yang dihasilkan oleh metode yang sesuai di Avx kelas .

Mulai dari .NET 5, metode ini menangani NaN input dengan benar dan mengembalikan hasil yang sama dengan metode yang sesuai di Avx kelas .

Arsitektur standar industri (ISA) Ekstensi SIMD Streaming (SSE) dan Streaming SIMD Extensions 2 (SSE2) tidak menyediakan dukungan perangkat keras langsung untuk metode perbandingan ini, sehingga diimplementasikan dalam perangkat lunak. Sebelumnya, metode ini diimplementasikan secara tidak benar, dan salah menangani NaN input. Untuk kode yang di-port dari asli, perilaku yang salah dapat memperkenalkan bug. Untuk jalur kode 256-bit, metode juga dapat menghasilkan hasil yang berbeda dengan metode yang setara di Avx kelas .

Sebagai contoh bagaimana metode sebelumnya salah, Anda dapat menerapkan CompareNotGreaterThan(x,y) sebagai CompareLessThanOrEqual(x,y) untuk bilangan bulat reguler. Namun, untuk NaN input, logika tersebut menghitung hasil yang salah. Sebagai gantinya, menggunakan CompareNotLessThan(y,x) membandingkan angka dengan benar danNaN mempertimbangkan input.

Versi yang diperkenalkan

5.0

  • Jika perilaku sebelumnya adalah bug, tidak ada perubahan yang diperlukan.

  • Jika perilaku sebelumnya diinginkan, Anda dapat mempertahankan perilaku tersebut dengan mengubah pemanggilan yang relevan sebagai berikut:

    • 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 yang Terpengaruh