>백엔드 개발 >C++ >0.1f를 0으로 바꾸면 내 코드의 성능이 10배 향상되는 이유는 무엇입니까?

0.1f를 0으로 바꾸면 내 코드의 성능이 10배 향상되는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-19 18:13:15240검색

Why Does Replacing 0.1f with 0 Result in a 10x Performance Increase in My Code?

비정규 부동 소수점 숫자가 성능에 미치는 영향

제공된 코드 조각에서 사소해 보이는 사소한 변경 사항이 성능에 큰 영향을 미쳤습니다. 0.1f를 0으로 설정하면 속도가 10배 느려졌습니다. 이러한 성능 차이는 비정규(비정규화된) 부동 소수점 숫자를 처리할 때 발생합니다.

비정규 숫자는 0의 근사치이며 표현할 수 있는 가장 작은 일반 부동 소수점 숫자보다 작습니다. 이는 매우 작은 값을 생성하는 작업으로 인해 발생하는 경우가 많습니다. 비정규 숫자에 대한 연산은 정규화된 부동 소수점 숫자에 대한 연산에 비해 속도가 매우 느립니다. 이는 많은 프로세서가 비정규 수를 직접 처리하는 능력이 부족하고 대신 느린 마이크로코드 루틴에 의존해야 하기 때문입니다.

수치 시험

두 개의 코드 스니펫(하나는 0.1을 사용함) f와 다른 하나는 0을 사용하여 반복된 반복 후에 다른 출력을 생성합니다. 0.1f를 사용하면 값이 0에 가까운 0이 아닌 값으로 수렴됩니다. 그러나 0을 사용하면 값 자체가 0으로 수렴됩니다. 이러한 수치적 동작의 차이는 성능 차이를 설명합니다.

비정규 플러시

비정규 숫자가 성능 차이의 원인인지 확인하려면 다음을 추가하여 0으로 플러시할 수 있습니다. 코드 시작 부분에 다음 줄을 추가합니다.

_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);

이는 프로세서가 모든 비정규 숫자를 0으로 처리하도록 지시합니다. 이 수정을 통해 0.1f를 사용하는 것과 0을 사용하는 것의 성능 차이는 무시할 수 있게 됩니다. 이는 비정규 숫자가 실제로 속도 저하의 원인임을 확인시켜 줍니다.

결론

이 시나리오에서는 0.1f를 0으로 대체하여 비정규 숫자 생성을 방지하면 성능이 크게 향상됩니다. 프로세서가 느린 비정규 숫자 처리 루틴에 참여하는 것을 방지하여 성능을 향상시킵니다. 이 최적화는 비정규화된 부동 소수점 숫자가 성능에 미치는 때로는 해로운 영향과 수치 계산에서 잠재적인 존재를 고려하는 것의 중요성을 상기시키는 역할을 합니다.

위 내용은 0.1f를 0으로 바꾸면 내 코드의 성능이 10배 향상되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.