SSE および SSE2 の CompareGreaterThan メソッドで NaN 入力が正しく処理される
次の System.Runtime.Intrinsics.X86.Sse メソッドと System.Runtime.Intrinsics.X86.Sse2 メソッドが修正され、NaN
入力を適切に処理するようになり、System.Runtime.Intrinsics.X86.Avx クラスで同等のメソッドのハードウェア動作に一致するようになりました。
CompareGreaterThan
CompareGreaterThanOrEqual
CompareNotGreaterThan
CompareNotGreaterThanOrEqual
CompareScalarGreaterThan
CompareScalarGreaterThanOrEqual
CompareScalarNotGreaterThan
CompareScalarNotGreaterThanOrEqual
変更の説明
以前は、一覧にある Sse メソッドと Sse2 メソッドに NaN
を入力すると、間違った結果が返されました。 また、この結果は、Avx クラスでこれに相当するメソッドで生成される結果とは違っていました。
.NET 5 より、これらのメソッドで NaN
入力が正しく処理され、Avx クラスでこれに相当するメソッドと同じ結果が返されるようになりました。
Streaming SIMD Extensions (SSE) および Streaming SIMD Extensions 2 (SSE2) の業界標準アーキテクチャ (ISA) には、これらの比較メソッドの直接的なハードウェア サポートがありません。そのため、ソフトウェアで実装されます。 以前は、メソッドは不適切に実装され、NaN
入力が間違って処理されていました。 ネイティブから移植されたコードについては、間違った動作からバグが発生することがあります。 256 ビット コード パスの場合、これらのメソッドから、Avx クラスでの同等のメソッドとは異なる結果が生成されることもあります。
通常の整数に対して CompareLessThanOrEqual(x,y)
として CompareNotGreaterThan(x,y)
を実装できるのは、以前、メソッドがいかに間違っていたか示す例です。 しかしながら、NaN
入力の場合、そのロジックでは間違った結果が計算されます。 代わりに、CompareNotLessThan(y,x)
を使用すると数値が正しく比較され、"かつ"、NaN
入力が考慮されます。
導入されたバージョン
5.0
推奨アクション
以前の動作がバグだった場合、変更は必要ありません。
以前の動作が望まれたものであれば、関連呼び出しを次のように変更し、この動作を維持できます。
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
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>)
.NET
フィードバック
https://aka.ms/ContentUserFeedback。
近日公開予定: 2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub イシューを段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、以下を参照してください:フィードバックの送信と表示