likely/unlikely 사용시 차이점

박량우 2011.07.11 11:20 조회 수 : 6839

likely/unlikely 사용시 차이점

 

compiler 정보 : gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)

http://www.codesourcery.com/sgpp/lite/arm/portal/release858

  

 

int abcdefg(int test1)
{
 if ( unlikely(test1 == 5 ) )
  test1++;
 else
  printk("--n");

 printk("%dn", test1);
 
 return 0;
}

 

--------------------------------------unlikely를 사용한 경우
0000001c <abcdefg>:
      1c:   e1a0c00d    mov ip, sp
      20:   e92dd830    push    {r4, r5, fp, ip, lr, pc}
      24:   e24cb004    sub fp, ip, #4  ; 0x4 
      28:   e3500005    cmp r0, #5  ; 0x5 
      2c:   e1a04000    mov r4, r0
      30:   03a04006    moveq   r4, #6  ; 0x6 
      34:   0a000002    beq 44 <abcdefg+0x28>
      38:   e3000000    movw    r0, #0  ; 0x0 
      3c:   e3400000    movt    r0, #0  ; 0x0 
      40:   ebfffffe    bl  0 <printk>
      44:   e1a01004    mov r1, r4
      48:   e3000000    movw    r0, #0  ; 0x0 
      4c:   e3400000    movt    r0, #0  ; 0x0 
      50:   ebfffffe    bl  0 <printk>
      54:   e3a00000    mov r0, #0  ; 0x0 
      58:   e89da830    ldm sp, {r4, r5, fp, sp, pc}

 

--------------------------------------unlikely부분에 likely or 둘다 없는 것
0000001c <abcdefg>:
      1c:   e1a0c00d    mov ip, sp
      20:   e92dd830    push    {r4, r5, fp, ip, lr, pc}
      24:   e24cb004    sub fp, ip, #4  ; 0x4 
      28:   e3500005    cmp r0, #5  ; 0x5 
      2c:   e1a04000    mov r4, r0
      30:   03a04006    moveq   r4, #6  ; 0x6 
      34:   1a000005    bne 50 <abcdefg+0x34>
      38:   e1a01004    mov r1, r4
      3c:   e3000000    movw    r0, #0  ; 0x0 
      40:   e3400000    movt    r0, #0  ; 0x0
      44:   ebfffffe    bl  0 <printk>
      48:   e3a00000    mov r0, #0  ; 0x0
      4c:   e89da830    ldm sp, {r4, r5, fp, sp, pc}
      50:   e3000000    movw    r0, #0  ; 0x0
      54:   e3400000    movt    r0, #0  ; 0x0
      58:   ebfffffe    bl  0 <printk>
      5c:   eafffff5    b   38 <abcdefg+0x1c>

 

 결론 : 분기문에서 확률이 적은 곳에 unlikely를 사용하면 이부분을 branch하여 수행하도록 만들어 줍니다.

            반대로 이야기 하면 확률이 높은 쪽은 branch하지 않고 연속하여 수행하도록 해줍니다.

            이것으로 인하여 branch에 의해 다른 곳으로 가게 되면 미리 가져왔던 것을 flushing 하고 다시 fetch하는 것을 줄여 줍니다.

 

 

------------------------------------------------------------------------------------------------- 

ps. branch가 필요없을 때에는 unlikely, likely 사용이 동일합니다.

예 : 아래 예제는 unlikely, likely, 둘다 없는 것으로 확인 시 모두 동일합니다.

int abcdefg(int test1)
{
 if ( unlikely(test1 == 5 ) )
  test1++;
 else
  test1--;

 printk("%dn", test1);
 
 return 0;
}


0000001c <abcdefg>:
      1c:   e1a0c00d    mov ip, sp
      20:   e92dd800    push    {fp, ip, lr, pc}
      24:   e24cb004    sub fp, ip, #4  ; 0x4 
      28:   e3500005    cmp r0, #5  ; 0x5 
      2c:   12401001    subne   r1, r0, #1  ; 0x1 
      30:   e3000000    movw    r0, #0  ; 0x0 
      34:   03a01006    moveq   r1, #6  ; 0x6 
      38:   e3400000    movt    r0, #0  ; 0x0 
      3c:   ebfffffe    bl  0 <printk>
      40:   e3a00000    mov r0, #0  ; 0x0 
      44:   e89da800    ldm sp, {fp, sp, pc}

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2201
1525 앞으로의 스터디 방향 [2] 서정민 2010.08.16 6879
1524 이번주 수고하셧습니다. ㅋㅋ [3] 강진성 2010.05.03 6861
1523 스터디 시간에 나왔던 ARM 어셈블러 시뮬레이션 방법을 한번 정리해보았습니다. [7] file 코로케 2013.07.02 6860
» likely/unlikely 사용시 차이점 [9] 박량우 2011.07.11 6839
1521 RCU 정리.. 박경태 2007.10.21 6824
1520 우분투 64bit에서 32bit 어셈블리 컴파일하기 신C 2013.06.28 6801
1519 10차 ARM-A팀 8/17 후기는 절 기다리지 마세요 [3] K 2013.08.17 6783
1518 쫑파티 합니다. ^^ [2] file 석헌영 2010.08.04 6770
1517 Clone flag- 스터디중에 어떤분이 질문했던 내용입니다. 황의순 2011.04.04 6763
1516 switch_to() 매크로 [2] 김병희 2008.08.27 6756
1515 SSE register 설명 및 Hammer Family(AMD 64bit 초기 processor) 관련 기사 [2] 최희욱 2007.11.18 6740
1514 저번주에 했던 커널정리PPT입니당 + 요번주 스터디참석여부! [4] file 조은지 2010.07.21 6733
1513 [ARM중] domain 과 AP 비트 필드를 이용한 메모리 접근 권한 제어 [3] file 홍문화 2011.10.10 6710
1512 arm 자료 올립니다 [2] file 지승화 2010.04.11 6700
1511 device mapper관련 문서 [1] file 오시리스 2011.07.25 6697
1510 Cortex™-A9 MPCore Technical Reference Manual [4] file 박대원 2010.04.05 6677
1509 ARM 아키텍쳐 관련 기초 쌓기(임베디드 레시피) [2] 차상우 2013.05.07 6672
1508 금일 스터디중 의문사항.. [7] 박은병 2007.11.11 6635
1507 리눅스 커널 내부구조 책 [5] file 어선택 2012.04.08 6609
1506 Setup.S 후반부 정리내용입니다. [2] file 박경태 2007.05.15 6608
XE Login