2016-07-12 1 views
5

2 중 어느 쪽이 더 빠릅니까? (C++)? 나는이 말이 여부를 알 수 없도록메모리 액세스 비교

for(i=0; i<n; i++) 
{ 
    sum_a = sum_a + a[i]; 
    sum_b = sum_b + b[i]; 
} 

또는

for(i=0; i<n; i++) 
{ 
    sum_a = sum_a + a[i]; 
} 
for(i=0; i<n; i++) 
{ 
    sum_b = sum_b + b[i]; 
} 

나는 초보자,하지만 첫 번째 버전, 배열 'A'에 액세스 한 후 'B'에서 이는 수도 배열 'a'와 'b'가 서로 다른 메모리 위치에 있기 때문에 많은 메모리 전환이 발생합니다. 하지만 두 번째 버전에서는 배열 'a'전체가 먼저 액세스 된 다음 배열 'b'전체가 사용됩니다. 즉, 연속 된 메모리 위치가 두 배열을 번갈아 사용하는 대신 액세스됩니다.

두 버전의 실행 시간간에 차이가 있습니까? (무시해도 될 정도로)?

+0

테스트하여 알아낼 수 있습니다. 간단한 수학은 두 번째 예제에서 반복 횟수가 두 배임을 나타냅니다. – NathanOliver

+0

하지만 그는 캐시 히트/미스에 대한 요점을 가지고 있습니다. – ABuckau

+1

다른 아키텍처로 인해 올바른 대답이 없다고 생각합니다. – MaciekGrynda

답변

4

나는이 질문에 정답이 있다고 생각하지 않는다. 일반적으로 두 번째 버전은 반복 (CPU 실행 오버 헤드)이 두 배가되지만 메모리 액세스 (메모리 액세스 오버 헤드)는 악화됩니다. 이제 PC에서이 코드를 실행하면 시계가 느리지 만 미친 듯이 좋은 캐시가 있다고 상상해보십시오. 메모리 오버 헤드는 줄어들지 만 시계가 느리므로 같은 루프를 두 번 실행하면 실행 시간이 훨씬 길어집니다. 다른 방법 : 빠른 시계, 나쁜 메모리 - 두 개의 루프를 실행하는 것은 문제가 아니므로 메모리 액세스를 최적화하는 것이 좋습니다. 2의 Link

3

어느 하나가 (C++) 빠른 : 여기

당신이 당신의 응용 프로그램을 프로파일 링 할 수있는 방법에 멋진 예입니까?

어느 쪽이든. 그것은

  • 에 (인접 여부) (가 과부하 경우) operator+operator[]의 구현 메모리에 배열의
  • 위치 배열의
  • 크기를 의존하는 CPU의
  • 크기 캐시
  • 메모리 속도 관련
  • 캐시 속도
  • 아마도 다른 요인의
  • 연관성을 캐시

Revolver_Ocelot이 a comment에서 관찰 한 바에 따르면 일부 컴파일러는 작성된 루프를 다른 형식으로 변환 할 수도 있습니다.

두 버전의 실행 시간간에 차이가 있습니까 (매우 무시할 수 있음)?

차이가있을 수 있습니다. 차이는 중요하거나 무시할 수 있습니다.

당신의 분석은 건전합니다. 일반적으로 메모리 액세스는 캐시보다 훨씬 느리며 두 메모리 위치간에 점프하면 캐시 쓰 래싱이 발생할 수 있습니다. . 기본적으로 분리 된 방식을 사용하는 것이 좋을 것입니다. 타겟 CPU에서 더 빨리 측정 한 경우에만 루프를 결합하십시오.

마찬가지로 MSalters points out 스 래싱은 최신 데스크탑 프로세서 (~ x86에서와 같이 현대적)로 문제가되어서는 안됩니다.

+0

두 개의 배열을 사용하는 캐시 스 래싱은 양방향 연관 캐시 (또는 그 이상)에 의해 방지됩니다. 직접 매핑 된 캐시의 경우에만 문제입니다. 두 개의 물리적으로 다른 메모리 위치에 동시에 액세스하는 것은 메모리 아키텍처에 따라 메모리 대역폭을 두 배로 늘릴 수 있습니다. – MSalters

+0

@MSalters OK, 그렇게 나쁘지 않아야합니다. 하지만 여전히 N/2 크기의 배열 두 개를 캐쉬에 넣을 수있는 N 크기의 단일 배열과 비교할 수 있습니다. 아마 내 추론은 꺼져있을거야. 나는 이보다 더 높은 수준에서 대부분의 최적화를 수행한다. – user2079303

+0

@ user2079303 메모리 프리 페처는이 선형 방식으로 메모리에 액세스하고 있음을 쉽게 알 수 있습니다. 프리 페칭 (pre-fetcher)은 캐시만큼 빠르지는 않지만 메모리 액세스를위한 전체 시간을 기다리는 것보다 훨씬 빠릅니다. – SirGuy