tgool
Tgool
tgool
전체 방문자
오늘
어제
  • 분류 전체보기
    • Data Science
      • AI
      • Data Mining
      • ML(Machine Learning)
    • Computer Science
      • 자료구조
      • 알고리즘
      • 시스템 프로그래밍
      • 운영체제
      • 컴퓨터 구조
      • 컴퓨터 네트워크
      • 데이터 베이스
      • 파이썬
      • 자바
      • 아두이노
    • Math
      • 통계학
      • 확률론
      • 선형대수학
      • 수리통계학
      • 회귀분석
    • TOFEL
    • Git
    • Plan
    • Book
    • Working out
      • 영양과 생활
      • 운동 정보
      • 운동 기록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
tgool

Tgool

[CSAPP] 5.2 Expressing Program Performance(프로그램 성능의 표현)
Computer Science/컴퓨터 구조

[CSAPP] 5.2 Expressing Program Performance(프로그램 성능의 표현)

2023. 1. 29. 20:26

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이 발생하기 때문에 오버헤드가 추가로 발생하게 된다.
  • 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
    'Computer Science/컴퓨터 구조' 카테고리의 다른 글
    • [CSAPP] 5.4 Eliminating Loop Inefficiencies(루프 비효율성 제거하기)
    • [CSAPP] 5.3 Program Example(프로그램 예제)
    • [CSAPP] 5.1 Capabilities and Limitations of Optimizing Compilers(컴파일러 최적화의 능력과 한계)
    • [CSAPP] Chapter 05. Optimizing Program Performance(프로그램 성능 최적화 하기)
    tgool
    tgool

    티스토리툴바