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 클래스의 해당 메서드와 동일한 결과를 반환합니다.
SSE(스트리밍 SIMD 확장) 및 SSE2(스트리밍 SIMD 확장 2) ISA(명령 집합 아키텍처)는 이러한 비교 방법에 대한 직접적인 하드웨어 지원을 제공하지 않으므로 소프트웨어에서 구현됩니다. 이전에는 메서드가 잘못 구현되었고 NaN
입력을 잘못 처리했습니다. 네이티브에서 이식된 코드의 경우 잘못된 동작으로 인해 버그가 발생할 수 있습니다. 256비트 코드 경로의 경우 메서드는 Avx 클래스의 해당 메서드와 다른 결과를 생성할 수도 있습니다.
이전 메서드가 잘못된 방법으로 사용된 예시로, 정규 정수에 대해 CompareNotGreaterThan(x,y)
을 CompareLessThanOrEqual(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