ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Accelerate는 왜 빠르고 효율적인가?
    Apple🍎/Accelerate 2025. 8. 13. 16:49

    다음은 Accelerate 프레임워크의 소개 페이지에 들어가보면 볼 수 있는 설명이다. 

     

    Accelerate 프레임워크는 CPU의 벡터 처리 기능???? 을 활용하여, CPU에서 에너지 효율적인 고성능 계산을 제공합니다. 

     

    CPU의 벡터  처리 기능을 활용한다는데 대체 그게 뭐길래, 고성능 계산을 제공할 수 있는 걸까??  이걸 알기 위해서는 일단 스칼라 연산과 백테 연산의 동작 차이를 먼저 이해해야한다. 

    일반적인 스칼라 연산 vs 벡터 연산

    보통 연산 (스칼라 연산)의 경우에는 한번에 하나의 값을 처리한다. 따라서 다음의 경우 순서대로 각각에 대한 연산이 이루어진다. 

    배열 [1, 2, 3, 4]에 각각 5를 더하는 경우:
    
    Step 1: 1 + 5 = 6
    Step 2: 2 + 5 = 7  
    Step 3: 3 + 5 = 8
    Step 4: 4 + 5 = 9
    
    총 4번의 개별 연산 필요
    

    이와 다르게 벡터 연산의 경우에는 값을 행렬 형태로 다룰 수 있기 때문에 같은 작업의 경우 동시에 실행을 할 수가 있다. 

    같은 작업을 벡터 연산으로:
    
    Step 1: [1, 2, 3, 4] + [5, 5, 5, 5] = [6, 7, 8, 9]
    
    단 1번의 연산으로 완료!
    

     이렇게 다르게 동작할 수 있는 이유는 하드 웨어 레벨에서부터 서로 다른 방법으로 계산을 지원하기 때문이다. 

    하드웨어 레벨에서의 차이

    스칼라 처리 방식

    일반적인 CPU 동작 방식으로 반복문으로 배열의 각 요소를 순차적으로 처리하는 것처럼 하나의 데이터(Single Data)에 대해 하나의 명령어(Single Instruction)를 처리하는 방식으로, SISD라고 부른다. 

     

    벡터 처리 방식

    특별한 벡터 레지스터와 명령어가 사용되어 여러 데이터(Multiple Data)에 대하여 하나의 명령어(Single Instruction)을 동시에 처리할 수 있는 방식으로, SIMD라고 부른다. 

    좀더 자세하게 살펴보면 일반 레지스터의 경우에는 아래와 같이 한 곳에 하나의 값만 저장할 수 있으며 

    ┌─────────────┐
    │    64bit    │  하나의 값만 저장
    │     42      │  
    └─────────────┘
    x0 레지스터 (ARM64)

    그 레지스터에서 값을 꺼내서 계산하는 ALU 유닛또한 한번에 하나의 값만 처리가 가능하다. 

    ┌─────────────┐
    │   ALU #1    │ ← 하나의 연산 유닛
    │  (64bit)    │
    └─────────────┘

     

    그에 비해 NEON(ARM에서 만든 SIMD기술이 적용된) 유닛의 경우 레지스터에는 한번에 여러 값을 저장할 수 있고,  

    ┌───┬───┬───┬───┬───┬───┬───┬───┐
    │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │  8개 값을 동시 저장
    └───┴───┴───┴───┴───┴───┴───┴───┘
           128bit v0 레지스터


    이 레지스터로부터 한번에 여러 연산 유닛이 값을 꺼내서 하나의 연산을 동시에 실행할 수 있다. 

    ┌───┬───┬───┬───┐
    │ALU│ALU│ALU│ALU│ ← 4개의 연산 유닛이 병렬 동작
    │#1 │#2 │#3 │#4 │
    └───┴───┴───┴───┘
        128bit 폭

    즉, CPU의 벡터 처리 기능이란 CPU의 여러 유닛 중에 벡터 연산, SIMD에 최적화된 유닛을 활용하여 연산을 수행하는 것을 의미하며,  행렬 연산으로 많은 양의 데이터를 적은 연산으로 수행하기 때문에 강력하고도 효율적인 연산을 제공할 수 있는 것이다. 

    ┌─────────────────────────────────┐
    │           ARM CPU               │
    ├─────────────────┬───────────────┤
    │   일반 코어       │  NEON 유닛     │
    │   (스칼라)       │   (벡터)       │
    │                │               │
    │ • 제어 로직     │ • 128bit 레지스터│
    │ • 64bit 레지스터│ • 벡터 ALU     │  
    │ • 스칼라 ALU    │ • SIMD 명령어  │
    └─────────────────┴───────────────┘

     

     

     

    댓글

Designed by Tistory.