> 백엔드 개발 > C++ > 부동 소수점 연산에서 0.1f를 더하고 빼는 것보다 0.1f를 더하고 빼는 것이 훨씬 느린 이유는 무엇입니까?

부동 소수점 연산에서 0.1f를 더하고 빼는 것보다 0.1f를 더하고 빼는 것이 훨씬 느린 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-20 19:11:11
원래의
532명이 탐색했습니다.

Why is adding and subtracting 0.1f so much slower than adding and subtracting 0 in floating-point operations?

비정규화된 숫자가 성능에 미치는 영향 이해

소개

부동 소수점 연산은 전체 성능에 큰 영향을 미칠 수 있습니다. 코드 효율성을 최적화하려면 잠재적인 성능 병목 현상을 이해하는 것이 중요합니다. 이 기사에서는 겉보기에는 동일해 보이는 두 코드 조각 사이의 성능 차이와 이러한 차이에서 비정규화된 숫자의 역할을 조사합니다.

문제의 코드 조각

문제의 두 코드 조각 다음과 같습니다:

스니펫 1:

y[i] = y[i] + 0.1f;
y[i] = y[i] - 0.1f;
로그인 후 복사

스니펫 2:

y[i] = y[i] + 0;
y[i] = y[i] - 0;
로그인 후 복사

성능 차이

스니펫 1, 이는 부동 소수점 값 0.1을 더하고 뺍니다. 0의 정수 값으로 동일한 작업을 수행하는 Snippet 2보다 10배 느립니다.

비정규화된 숫자

비정규(또는 비정규) 부동 소수점 숫자는 0에 가까운 매우 작은 숫자를 나타내는 특수 클래스의 값입니다. 표현이 일반적인 부동 소수점 값과 다르기 때문에 처리가 더 복잡해지고 잠재적으로 느려질 수 있습니다.

비정규화된 숫자의 영향

성능의 차이는 다음과 같은 사실에서 비롯됩니다. 비정규화된 부동 소수점 숫자에 대한 연산은 일반 부동 소수점 숫자에 대한 연산보다 상당히 느릴 수 있습니다. 이는 많은 프로세서가 비정규화된 숫자를 효율적으로 처리하지 못하고 마이크로코드를 사용하여 이를 트랩하고 해결해야 하기 때문입니다.

코드의 비정규화된 숫자

스니펫 1에서 추가 및 0.1f를 빼면 비정규화된 부동 소수점 숫자가 생성됩니다. 반대로 Snippet 2에서는 0의 덧셈과 뺄셈이 일반적인 부동 소수점 연산으로 처리됩니다.

성능 비교

Snippet 1의 성능이 느린 이유는 다음과 같습니다. 비정규화된 숫자를 자주 생성하고 처리하는 것입니다. 루프가 수백만 번 반복됨에 따라 이러한 비정규화된 작업이 누적되면 상당한 성능 저하가 발생합니다.

비정규화된 숫자 플러시

비정규화된 숫자의 역할을 추가로 보여주기 위해 , SSE 명령어를 사용하여 0으로 플러시하면 Snippet 1의 성능이 크게 향상됩니다. 비정규화된 숫자를 0으로 효과적으로 반올림하면 처리 속도에 부정적인 영향을 미칩니다. 탈락했습니다.

결론

이 분석에서는 비정규화된 숫자가 성능에 미치는 영향을 고려하는 것이 중요하다는 점을 강조합니다. 작업 빈도와 대상 프로세서에 따라 비정규화된 숫자로 인해 상당한 오버헤드가 발생할 수 있습니다. 최신 프로세서의 모든 기능을 활용하는 효율적인 코드를 작성하려면 해당 특성과 잠재적인 성능 영향을 이해하는 것이 필수적입니다.

위 내용은 부동 소수점 연산에서 0.1f를 더하고 빼는 것보다 0.1f를 더하고 빼는 것이 훨씬 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿