Solution to Problem 5.9

This is another demonstration that a slight change in coding style can make it much easier for the compiler to detect opportunities to use conditional moves:

이 예제는 코딩 스타일을 조금만 바꿔도, 컴파일러가 조건부 이동(conditional move) 을 사용할 수 있는 기회를 훨씬 쉽게 찾아낼 수 있음을 다시 한 번 보여준다.

while (i1 < n && i2 < n) {
    long v1 = src1[i1];
    long v2 = src2[i2];
    long take1 = v1 < v2;
    // 비교 분기가 아닌 값(0 또는 1)으로 저장
    // take1 = 1 >> v1이 작다
    // take1 = 0 >> v2가 작다
    dest[id++] = take1 ? v1 : v2;
    i1 += take1;
    i2 += (1 - take1);
}

 

We measured a CPE of around 12.0 for this version of the code, a modest improvement over the original CPE of 15.0.

이 버전의 코드에서 CPE는 약 12.0으로 측정되었으며, 이는 기존 코드의 CPE 15.0보다 소폭 개선된 결과이다.

 

Figure 5.39의 의미 : 의존성과 분기를 줄이면 임계 경로가 짧아지고 성능이 좋아진다.

위 코드의 의미 : 분기를 값으로 바꾸면 임계 경로와 파이프라인 중단이 줄어든다.

>> 둘다 CPU가 순서대로 강제되는 일을 줄여준다.

 

문제 5.9는 기존의 while문에서 if문을 제거한 상태로 기존 코드와 똑같이 동작하는 코드를 작성하라는 문제였다. 기존의 코드는 다음과 같다.

void merge(long src1[], long src2[], long dest[], long n) {
	long i1 = 0;
    long i2 = 0;
    long id = 0;
    while (i1 < n && i2 < n) {
    	if(src1[i1] < src2[i2])
        	dest[id++] = src1[i1++];
        else
        	dest[id++] = src2[i2++];
    }
    while (i1 < n)
    	dest[id++] = src1[i1++];
    while (i2 < n)
    	dest[id++] = src2[i2++];
}



'컴퓨터과학(CS) > CS문제 풀이' 카테고리의 다른 글

Solution to Problem 5.11  (0) 2026.01.18
Solution to Problem 5.10  (0) 2026.01.18
Solution to Problem 5.8  (0) 2026.01.18
Solution to Problem 5.7  (0) 2026.01.18
Solution to Problem 4.39 ~ 4.44  (1) 2026.01.08