>백엔드 개발 >C++ >부동 배열에 0.1f를 추가하는 것이 0을 추가하는 것보다 훨씬 느린 이유는 무엇이며, 이 성능 문제를 어떻게 해결할 수 있습니까?

부동 배열에 0.1f를 추가하는 것이 0을 추가하는 것보다 훨씬 느린 이유는 무엇이며, 이 성능 문제를 어떻게 해결할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-19 13:10:10504검색

Why is adding 0.1f to a float array significantly slower than adding 0, and how can this performance issue be addressed?

Float 배열에 0.1f를 추가하면 0을 추가하는 것과 비교하여 성능이 10배 느려지는 이유는 무엇입니까?

성능 차이는 처리에서 발생합니다. 프로세서에 의한 비정규(또는 비정규) 부동 소수점 숫자. 비정규 숫자는 0에 매우 가까운 값을 나타내며 이는 성능에 큰 영향을 미칠 수 있습니다.

부동 소수점 배열에 0.1f를 추가하면 원래 값은 아니더라도 결과는 비정규 숫자가 될 수 있습니다. 이는 부동 소수점 표현의 정밀도가 제한되어 있기 때문입니다. 비정규 숫자에 대한 연산은 많은 프로세서가 이를 직접 처리할 수 없고 마이크로코드를 사용하여 이를 해결해야 하기 때문에 일반적으로 정규화된 숫자에 대한 연산보다 훨씬 느립니다.

반대로, 부동 소수점 배열에 0을 추가해도 비정규 숫자가 생성되지 않습니다. 0은 이미 정규화된 숫자이기 때문입니다. 따라서 0과 관련된 연산을 훨씬 더 효율적으로 수행할 수 있습니다.

비정규 숫자가 성능에 미치는 영향을 확인하려면 다음 코드를 고려하세요.

const float x[16] = {  1.1,   1.2,   1.3,     1.4,   1.5,   1.6,   1.7,   1.8,
                       1.9,   2.0,   2.1,     2.2,   2.3,   2.4,   2.5,   2.6};
const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812,
                     1.923, 2.034, 2.145,   2.256, 2.367, 2.478, 2.589, 2.690};
float y[16];
for (int i = 0; i < 16; i++)
{
    y[i] = x[i];
}

for (int j = 0; j < 9000000; j++)
{
    for (int i = 0; i < 16; i++)
    {
        y[i] *= x[i];
        y[i] /= z[i];
        y[i] = y[i] + 0.1f; // <--
        y[i] = y[i] - 0.1f; // <--
    }
}

여기서 부동 소수점 배열에 0.1f를 추가합니다. 결과 값이 비정규 숫자로 변환되기 때문에 상당한 속도 저하가 발생합니다.

비정규 숫자가 성능에 미치는 영향을 방지하려면 다음을 사용할 수 있습니다. _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); 비정규를 0으로 플러시하는 내장 기능입니다. 이는 비정규 값이 대신 0으로 반올림됨을 의미합니다. 이 내장 기능을 사용하면 부동 소수점 배열로 작업할 때 코드 성능을 크게 향상시킬 수 있습니다.

위 내용은 부동 배열에 0.1f를 추가하는 것이 0을 추가하는 것보다 훨씬 느린 이유는 무엇이며, 이 성능 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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