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]
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/120

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/120

트랙백 주소 :: http://www.cipher.pe.kr/tt/cipher/trackback/120

트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/trackback/120

트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/trackback/120

댓글을 달아 주세요

댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/120
댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/120
[로그인][오픈아이디란?]