분류 전체보기

    [CSAPP] 5.6 Eliminating Unneeded Memory References(불필요한 메모리 참조 제거)

    5.6 Eliminating Unneeded Memory References(불필요한 메모리 참조 제거) 아래 코드는 combine3 함수에서 *dest 연산 결과를 축적하는 과정을 어셈블리 코드로 변환한 결과이다. data_t *get_vec_start(vec_ptr v) { return v->data; } /* Direct access to vector data */ void combine3(vec_ptr v, data_t *dest) { long i; long length = vec_length(v); data_t *data = get_vec_start(v); *dest = IDENT; for (i = 0; i < length; i++) { *dest = *dest OP data[i]; } } //..

    [CSAPP] 5.5 Reducing Procedure Calls(프로시저 호출 줄이기)

    5.5 Reducing Procedure Calls(프로시저 호출 줄이기) 함수 호출은 최적화를 방해하고 오버헤드를 증가시킨다. 아래 예시에서 combine2는 get_vec_element 함수를 경계 검사(bound check)를 위해 반복 수행한다. 그러나 length라는 범위 내에서는 명백한 인덱스이기 때문에 경계 검사(bound check)는 불필요하다. 임의의 접근을 할 때는 경계 검사(bound check)가 필요하지만 명백한 인덱스를 알고 있을 때는 경계 검사(bound check)가 불필요하다. /* Move call to vec_length out of loop */ void combine2(vec_ptr v, data_t *dest) { long i; long length = vec_l..

    [CSAPP] 5.4 Eliminating Loop Inefficiencies(루프 비효율성 제거하기)

    5.4 Eliminating Loop Inefficiencies(루프 비효율성 제거하기) 아래 combine 함수를 source code 레벨(프로그래머가 작성하는 코드)에서 최적화하는 과정 중 루프 비효율성을 제거하는 방법을 제시하겠다. /* Implementation with maximum use of data abstraction */ void combine1(vec_ptr v, data_t *dest) { long i; *dest = IDENT; for (i = 0; i < vec_length(v); i++) { data_t val; get_vec_element(v, i, &val); *dest = *dest OP val; } } 루프의 매 실행마다 test condition이 평가된다. 위 코드..

    [CSAPP] 5.3 Program Example(프로그램 예제)

    5.3 Program Example(프로그램 예제) 해당 절은 향후 나올 절에 나올 예시들을 설명하기 위한 절이다. 코드를 최적화하는 과정을 보여주기 위해 Vector 데이터 구조체를 예시로 이용하겠다. 벡터 데이터 구조체는 다음과 같이 코드와 그림으로 표현된다. data_t는 데이터 유형이다. typedef long data_t; 와 같이 벡터로 이루어진 데이터의 유형(int, long, double 등)을 설정한다. /* Create abstract data type for vector */ typedef struct { long len; data_t *data; } vec_rec, *vec_ptr; 아래 코드는 벡터를 생성하고, 벡터 요소에 접근하고, 벡터의 길이를 결정하기 위한 과정이다. 벡터 엑..

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

    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)로 표현하는 이유는, 프로그래머 ..