Fetch -> Decode -> Execute -> Fetch -> Decode -> ... pipe line을 이용하여 CPU 효율 극대화
jmp를 사용할 경우 pipe line의 성능을 저하시킨다.
jmp 다음에 실행될것이 어떤것인지는 Execute를 해봐야 하므로 미리 Fetch, Decode 가 된 다음 명령어는 무용지물이 되면서 jmp로 점프하면서 다시 pipe line을 시작하게 된다.
[code type=c]#include <stdio.h>
int main(void)
{
int data[1000];
int i;
int result = 0;
for ( i = 0; i < 1000; i++ )
{
data[i] = i % 10;
}
for ( i = 0; i < 1000; i++ )
{
result += data[i];
}
printf("result = %d\n", result);
return 0;
}[/code]
위의 소스 코드에서는 각 for문이 1000번씩 반복된다. 이런 반복문은 어셈블리로 보면 조건문과 jmp문으로 이루어져 있다. 때문에 pipe line 성능에 큰 영향을 미친다. 따라서 이러한 영양을 최소화 하기 위해서는 반복하는 횟수를 최소화 하는 것이다.
즉
[code type=c]#include <stdio.h>
int main(void)
{
int data[1000];
int i;
int result = 0;
for ( i = 0; i < 1000; i++ )
{
data[i] = i % 10;
}
for ( i = 0; i < 1000; i += 4 )
{
result += data[i];
result += data[i+1];
result += data[i+2];
result += data[i+3];
}
printf("result = %d\n", result);
return 0;
}[/code]
와 같이 하면 두번째 반복문은 250번만 반복하므로 pipe line에 영향도 1/4로 줄어 들게 된다.
하지만 이와 같은 경우 만약 반복이 1002가 되면 짜투리인
result += data[i];
result += data[i+1];
을 따로 적어 줘야 한다.
이런 경우 프로그래머는 잊어 버리고 안 쓸수도 있으므로 아래와 같은 방법을 사용하면 간단하게 해결된다.
[code type=c]#define MAX_NUM 1003
int main(void)
{
int data[1000];
int i, count;
int result = 0;
for ( i = 0; i < 1000; i++ )
{
data[i] = i % 10;
}
i = 0;
count = (MAX_NUM + 3)/4; // 여기서의 3은 4가 쓰였기 때문, 만약 5이면 4로 변경...
switch ( MAX_NUM % 4 )
{
case 0:
do
{
result += data[i++];
case 3:
result += data[i++];
case 2:
result += data[i++];
case 1:
result += data[i++];
} while ( --count > 0 );
}
printf("result=%d\n", result);
return 0;
}[/code]
받은 트랙백이 없고,
댓글이 없습니다.



글
댓글을 달아 주세요
댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/120댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/120