2.4.4. 조건부 실행 사용 예제

이 예제에서는 최대 공약수 (gcd) 알고리즘 (Euclid) 의 두 가지 구현을 사용합니다. 이 예제에서는 조건부 실행을 사용하여 코드 밀도와 실행 속도를 향상시키는 방법을 보여 줍니다. 실행 속도에 대한 자세한 분석은 ARM7™ 프로세서에만 적용되고 코드 밀도 계산은 모든 ARM 프로세서에 적용됩니다.

C에서는 이 알고리즘을 다음과 같이 표시할 수 있습니다.

int gcd (int a, int b) 
{
    while (a != b) 
      {
        if (a > b) 
            a = a - b;
        else
            b = b - a;
      }
    return a;
}

조건부 분기 실행만 포함된 gcd 함수는 다음과 같은 방법으로 구현할 수 있습니다.

gcd     CMP      r0, r1
        BEQ      end
        BLT      less
        SUBS     r0, r0, r1  ; could be SUB r0, r0, r1 for ARM
        B        gcd
less
        SUBS     r1, r1, r0  ; could be SUB r1, r1, r0 for ARM
        B        gcd
end

분기 수 때문에 코드 길이는 명령어 일곱 개입니다. 분기가 생성될 때마다 프로세서는 파이프라인을 다시 채우고 새 위치에서 계속 실행되어야 합니다. 다른 명령어와 실행되지 않은 분기는 각각 단일 주기를 사용합니다.

ARM 명령어 세트의 조건부 실행 기능을 사용하면 다음과 같이 네 개의 명령어만으로 gcd 함수를 구현할 수 있습니다.

gcd
        CMP      r0, r1
        SUBGT    r0, r0, r1
        SUBLE    r1, r1, r0
        BNE      gcd

코드 크기를 향상시킬 뿐 아니라 대부분의 경우 이 코드가 빠르게 실행됩니다. Table 2.3Table 2.4에서는 r0이 1이고 r1이 2인 경우 각 구현에서 사용하는 사이클 수를 보여 줍니다. 이 경우 분기를 모든 명령어의 조건부 실행으로 바꾸면 3사이클이 절약됩니다.

코드의 조건부 버전은 r0이 r1과 같은 경우 동일한 주기 수로 실행됩니다. 다른 모든 경우 코드의 조건부 버전은 더 적은 주기 수로 실행됩니다.

Table 2.3. 주기 수 (조건부 분기에만 해당)

r0: ar1: b명령어주기 (ARM7)
12CMP r0, r11
12BEQ end1 (실행되지 않음)
12BLT less3
12SUB r1, r1, r01
12B gcd3
11CMP r0, r11
11BEQ end3
   총 13개

Table 2.4. 주기 수 (모든 조건부 명령어에 해당)

r0: ar1: b명령어주기 (ARM7)
12CMP r0, r11
12SUBGT r0,r0,r11 (실행되지 않음)
11SUBLT r1,r1,r01
11BNE gcd3
11CMP r0,r11
11SUBGT r0,r0,r11 (실행되지 않음)
11SUBLT r1,r1,r01 (실행되지 않음)
11BNE gcd1 (실행되지 않음)
   총 10개

gcd의 Thumb-2 이전 Thumb 버전

B는 조건부로 실행될 수 있는 유일한 Thumb-2 이전 Thumb 명령어이므로 gcd 알고리즘은 조건부 분기로 작성되어야 합니다.

ARM 조건부 분기 구현과 같이 Thumb-2 이전 Thumb 코드에는 일곱 개의 명령어가 필요합니다. 이 경우 전체 코드 크기는 16바이트의 ARM 구현에 비해 작은 14바이트입니다.

또한 16비트 메모리를 사용하는 시스템에서 각 16비트 Thumb 명령어에는 하나의 메모리 액세스만 필요하지만 각 ARM 32비트 명령어에는 두 개의 페치가 필요하므로 Thumb 버전이 두 번째 ARM 구현보다 빠르게 실행됩니다.

gcd의 Thumb-2 버전

다음과 같이 IT 명령어를 사용하여 SUB 명령어를 조건부 명령어로 만들어 이 코드의 ARM 버전을 Thumb-2 코드로 변환할 수 있습니다.

gcd
        CMP     r0, r1
        ITE     GT 
        SUBGT   r0, r0, r1
        SUBLE   r1, r1, r0
        BNE     gcd

이 명령어는 ARM 또는 Thumb-2 코드로 똑같이 잘 어셈블됩니다. 어셈블러에서는 IT 명령어를 확인하지만 ARM 코드로 어셈블할 때는 IT 명령어를 생략합니다. IT 명령어를 생략할 수 있습니다. 어셈블러에서 Thumb-2 코드로 어셈블할 때 자동으로 IT 명령어를 삽입합니다.

명령어가 하나 더 필요한 코드는 ARM 코드가 아니라 Thumb-2 코드이지만 전체 코드 크기가 Thumb-2 코드는 10바이트지만 ARM 코드는 16바이트입니다.

실행 속도

실행 속도를 최적화하려면 명령어 타이밍, 분기 예상 논리 및 타겟 시스템의 캐시 동작을 자세히 알고 있어야 합니다. 개별 프로세서에 대한 자세한 내용은 ARM 아키텍처 참조 문서 및 기술 참조 설명서를 참조하십시오.

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential