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
Tindakan yang direkomendasikan
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
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>)
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk