Share via


SSE 및 SSE2 CompareGreaterThan 메서드가 NaN 입력을 올바르게 처리함

다음 System.Runtime.Intrinsics.X86.SseSystem.Runtime.Intrinsics.X86.Sse2 메서드는 NaN 입력을 올바르게 처리하고 System.Runtime.Intrinsics.X86.Avx 클래스에서 동등한 메서드의 하드웨어 동작과 일치하도록 수정되었습니다.

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

변경 내용 설명

이전에는 나열된 SseSse2 메서드에 대한 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