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 |
