5.2 Expressing Program Performance(프로그램 성능의 표현)
- CPE(Cycle per element): 요소당 측정 사이클.
- CPE는 반복적인 프로그램의 루프 성능을 측정하는데 도움이 된다.
- 프로세서에 의한 활동 순서는 클럭에 의해 제어되고, 일반적으로 초당 수십억 사이클의 일정한 주파수 신호 gigahertz(GHz)로 표현한다.
- 예를 들어 4GHz 프로세서는 프로세서 클럭이 초당 4.0 * 10 ^ 9 사이클로 실행되는 것을 의미.
- 이러한 클럭 사이클은 보통 nanosecond(10 ^ -9 seconds)로 표현된다.
- 따라서 4GHz 클럭은 0.25 nanoseconds로 표현 가능하다.
- nanosecond 표기법이 아닌 클럭 사이클(GHz)로 표현하는 이유는, 프로그래머 입장에서 클럭이 얼마나 빨리 실행되는 지 보다 실행 중인 명령(instruction)의 수를 파악하는 것에 중점을 두기 때문이다.
- 아래는 위 벡터를 함수로 표현한 코드이고 그 아래는 CPE 활용 그래프이다. psum1의 성능 보다 psum2의 성능이 더 우수하다.
- psum1은 한 loop 당 1개의 element를 계산하고, psum2은 한 loop 당 2개의 element를 계산한다.
- psum2는 루프 언롤링 기법(loop unrolling)을 사용해서 더 적은 반복을 사용할 수 있었는데, 루프 언롤링 기법(loop unrolling)에 대해서는 향후 이 챕터의 뒷 부분 절(5.8)에서 소개하겠다.
- 루프 언롤링 기법(loop unrolling): loop의 횟수를 줄임으로써, 루프의 오버헤드를 줄이는 기술
- loop에서는 loop condition을 검사하고 jump를 하는 instruction이 발생하기 때문에 오버헤드가 추가로 발생하게 된다.
- 루프 언롤링 기법(loop unrolling): loop의 횟수를 줄임으로써, 루프의 오버헤드를 줄이는 기술
- psum1은 클럭 주기가 368+9.0n, psum2는 클럭 주기가 368 + 6.0n 방정식으로 근사한다. 369은 사이클의 오버헤드를 의미한다.
- n은 요소의 수이고 반복 당 유효 주기 수 보다 요소 당 유효 주기 수로 나타낸다.
- 계산을할 때, 요소의 수는 일정해도 반복의 수는 루프 언롤링 기법(loop unrolling) 등으로 인해 다를 수 있기 때문이다.
- 따라서 우리는 CPE를 최소화하는 데에 중점을 둔다.
- psum1은 CPE가 9.0이고 psum2는 CPE가 6.0이다. 그러므로 psum2의 성능이 더 빠르다는 걸 직관적으로 알 수 있다.
/* Compute prefix sum of vector a */
2 void psum1(float a[], float p[], long n)
{
long i;
p[0] = a[0];
for (i = 1; i < n; i++)
p[i] = p[i-1] + a[i];
}
void psum2(float a[], float p[], long n)
{
long i;
p[0] = a[0];
for (i = 1; i < n-1; i+=2) {
float mid_val = p[i-1] + a[i];
p[i] = mid_val;
p[i+1] = mid_val + a[i+1];
}
/* For even n, finish remaining element */
if (i < n)
p[i] = p[i-1] + a[i];
}
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 5.4 Eliminating Loop Inefficiencies(루프 비효율성 제거하기) (0) | 2023.01.30 |
---|---|
[CSAPP] 5.3 Program Example(프로그램 예제) (0) | 2023.01.30 |
[CSAPP] 5.1 Capabilities and Limitations of Optimizing Compilers(컴파일러 최적화의 능력과 한계) (0) | 2023.01.29 |
[CSAPP] Chapter 05. Optimizing Program Performance(프로그램 성능 최적화 하기) (0) | 2023.01.29 |
[CSAPP] 3.11 Floating-Point Code(부동소수점 코드) (0) | 2023.01.24 |