>백엔드 개발 >C++ >8192 요소를 반복하는 것이 8191 또는 8193보다 훨씬 느린 이유는 무엇입니까?

8192 요소를 반복하는 것이 8191 또는 8193보다 훨씬 느린 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-11 08:56:10817검색

Why is Looping Over 8192 Elements So Much Slower Than 8191 or 8193?

8192개 요소를 반복할 때 성능에 미치는 영향

특정 행렬 연산은 행렬 크기, 특히 행 수가 다음과 같을 때 성능 이상을 나타냅니다. 2048의 배수(예: 8192) 수퍼 정렬이라고 하는 이 현상은 최신 CPU의 특정 메모리 관리 방식으로 인해 발생합니다.

제공된 코드 조각은 행렬 res[][]가 행렬 img[에서 계산되는 이 문제를 보여줍니다. ][]. 다양한 행렬 크기, 특히 8191, 8192 및 8193에 대한 성능은 행렬 크기가 8192일 때 상당한 속도 저하를 나타냅니다.

수퍼 정렬 효과

성능 변형은 행렬에서 열 방향으로 반복되는 중첩 루프로 인해 발생하는 메모리에 대한 불균일한 액세스에서 비롯됩니다. img[][]. 이러한 비순차적 액세스 패턴은 순차 메모리 액세스를 통해 더욱 효율적으로 작동하는 최신 CPU의 성능 저하를 초래합니다.

해결 방법: 외부 루프 교환

해결책은 다음에 있습니다. 중첩 루프를 다시 정렬하고 열 단위 반복보다 행 단위 반복을 우선시합니다. 이렇게 하면 메모리 액세스가 순차적이 되어 성능이 크게 향상됩니다.

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        // Code to compute res[j][i]
    }
}

성능 결과

다음 성능 결과는 외부 루프를 교환하여 얻은 향상을 보여줍니다.

Matrix Size Original Code (s) Interchanged Loops (s)
8191 1.499 0.376
8192 2.122 0.357
8193 1.582 0.351

이 최적화는 차원의 배수인 행렬의 성능 격차를 크게 줄입니다. 2048로 인해 다양한 매트릭스 크기에 걸쳐 일관된 성능을 발휘합니다.

위 내용은 8192 요소를 반복하는 것이 8191 또는 8193보다 훨씬 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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