Thursday, April 7, 2011

CPU cache 의 효과

캐시의 종류
CPU cache는 크게 세가지로,
  1. 명령을 미리 로드하기 위한 instruction cache,
  2. 데이터를 가져오기 위한 data cache, 
  3. 버추얼주소를 physical 주소로 변환하기 위한 translation lookaside buffer (TLB) 
이상의 세가지가 있다.

데이터 캐시는 보통 L1, L2 등의 hierarchy 로 구성되는데
흔히 CPU 캐시 하면 바로 이 데이터 캐시를 의미한다.

캐시가 퍼포먼스에 미치는 영향
Cache 라는 것이 얼마나 중요한 것인지는 실제 사례로 확인하지 않으면 실감하기 힘들다.
캐시의 효과는 다음 링크에서 잘 실험되어 있다.
http://igoro.com/archive/gallery-of-processor-cache-effects/
캐시가 퍼포먼스에 어떤 영향을 주는가는 개략적으로 다음과 같이 설명할 수 있다.

1. Parallelism (병렬처리)
다음 두개의 루프를 비교해보면 Loop 2 가 Loop 1 보다 두배는 빠르다.
Loop 1 내부의 연산은 순차적으로 실행가능한 반면
Loop 2 내부의 연산은 병렬처리가 가능하기 때문이다.
// Loop 1
for (int i=0; i < steps; i++) { a[0]++ ; a[0]++ ; }

// Loop 2
for (int i=0; i < steps; i++) { a[0]++ ; a[1]++ ; }
2. 데이터 캐시의 크기
루프 안의 계산이 단순하다고 가정할 때, 오늘날의 CPU 에서는 다음 두 operation 의
속도가 같다. 왜냐하면 퍼포먼스가 메모리에서 array 데이터를 가져오는 것에 좌우되기
때문이다.
for (i = 0; i < arr.Length; i++) {...}
for (int i = 0; i < arr.Length; i += 16) {...}
3. Multi-level caches 각각의 크기
또한 똑같은 loop 작업이라도 array 를 순차적으로 액세스하는 것보다
L1 캐시 사이즈만큼 뛰면서 액세스하기 시작하면 퍼포먼스가 급락하고
L2 캐시 사이즈만큼 뛰면서 액세스 하기 시작하면 퍼포먼스가 몇 배는 떨어진다.
자세한 건 레퍼런스의 그래프를 참조.

퍼포먼스의 결과는 소스코드만 보면 비직관적으로 느껴질 수 있는데 이것은
소스코드는 순차모델을 갖고 있는데 반해 실제 CPU에서의 실행은 데이터와
코드를 캐시 단위로 가져오고 가져온 단위에 대해서는 병렬처리를 하기 때문이다.

요는, 캐시에 한꺼번에 가져오는 단위에 의해 퍼포먼스가 좌우된다는 것이다.
L1, L2 등 캐시의 성능과 용량이 얼마나 중요한지 알 수 있다.

프로세서 구조 설계의 관건은 cost, 속도, 용량의 tradeoff 라고 볼 수 있는데
레지스트리 - L1 캐시 - L2 캐시 - L3 캐시 - 메모리
와 같은 메모리의 hierarchy 는 바로 그러한 트레이드오프 때문에 만들어진 것으로
오늘날의 CPU 구조에서 매우 중요한 개념이다.

레퍼런스 :
Gallery of Processor Cache Effects (Igor Ostrovsky Blogging)
http://igoro.com/archive/gallery-of-processor-cache-effects/
http://en.wikipedia.org/wiki/CPU_cache

미러 : CPU 캐시의 효과, L1, L2, Gallery of Processor Cache Effects

No comments:

Post a Comment