[SIMD 프로그래밍-0] colum base DB와 Row base DB차이는 ?

 

[SIMD 프로그래밍-0] colum base DB와 Row base DB차이는 ?

일반적인 RDBMS는 row base이다 create T1 (c1 int, c2 int , c3 int) 로 생성했다면 데이터 저장은 아래처럼 될거다 (= row 단위로 묶여서 1번 row는 c1 옆에 c2 옆에 c3) select * from t1 where c1 = 1 이면 1,10,100 모두

sua-tech.tistory.com

이전 글에서 column base를 쓰는 경우는 OLAP에서 주로 쓴다고 했다. 분석용..

사실 SIMD 테스트를 포스팅 하기 위한 글

 

SIMD란 Single Instruction Multiple Data

즉 하나의 명령으로 여러 값을 동시에 처리, 계산 하는 프로세서이다

병렬로 처리를 하다보니 굉장히 빠르다

 

얼마나 빠른지 테스트를 해보았다 

 

1. a[i] 와 b[i] 를 +더해서 = C에 넣을거다 (a[i]+b[i]=c[i])

    float a[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
    float b[SIZE] = {8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0};
    float c[SIZE] = {0};

 

2. 일반적인 for문은 배열크기(8번) 만큼 돌아야한다

void add_arrays(float *a, float *b, float *c, int n) {
    for (int i = 0; i < n; i++) {
        c[i] = a[i] + b[i];
    }
}

 

3. SIMD를 쓰면 한번에 4개씩 처리가 가능하다

void add_arrays_simd(float *a, float *b, float *c, int n) {
    int i;
    for (i = 0; i <= n - 4; i += 4) {
        // 4개의 float를 한 번에 불러옵니다.
        __m128 va = _mm_loadu_ps(&a[i]);
        __m128 vb = _mm_loadu_ps(&b[i]);
        __m128 vc = _mm_add_ps(va, vb);
        _mm_storeu_ps(&c[i], vc); // 결과를 저장합니다.
    }

    // 남은 요소 처리
    for (; i < n; i++) {
        c[i] = a[i] + b[i];
    }
}

 

 

코드는 대략 이러하다.

 

성능차이는 어떻게 될까?

size 8인 배열은 성능차이가 당연히 없기에 size를 1,000,000 으로 늘려서 성능 측정을 했다 

 

확실히 빠르다 

 

Cpu  core를 더 잡는 개념은 아니다 

CPU가 놀고 있다면 SIMD로 코드를 짜는게 아닌 멀티쓰레드로 돌려야한다 

 

 


반복수행하니 성능차이가 없어졌다 

 

0.002초 로는 성에 안차서 repeat을 넣어서 더 오래 걸리게 하였다 

1. BEFORE. repeat없음

add_arrays(a, b, c, SIZE);
add_arrays_simd(a, b, c, SIZE);

2. AFTER . repeat추가

   for (i = 0; i < REPEAT; i++) {
       add_arrays(a, b, c, SIZE);
   }
   
   ...
   
   for (i = 0; i < REPEAT; i++) {
        add_arrays_simd(a, b, c, SIZE);
    }

 

 

배열 사이즈 : 1,000,000 (백만)

REPEAT 수 : 1000 (만 번)

 

예상 성능차 : 10초 vs 2초 (5배 차이) 

결과 :

 

차이가 없다 

 

원인 : cache에 저장하기 때문 

  1. 첫 번째 반복에서:
  • 데이터가 메인 메모리에서 CPU 캐시로 처음 로드됨
  • SIMD는 한 번에 여러 데이터를 병렬로 처리하므로 큰 성능 이점을 보임
  1. 이후 반복에서:
  • 데이터가 이미 CPU 캐시에 있음 (캐시 히트)
  • 메모리 접근 지연시간이 크게 감소
  • 일반 처리 방식도 캐시의 혜택을 받아 빨라짐

즉 일반이 빨라지는 것이다 

REPEAT 일반처리 SIMD 처리
1 5.883396초 3.602916초
2 3.346273초 1.992230초
3 1.320294초 1.497517초
4 1.663750초 1.308854초
5 1.513779초 1.428787초

 

 

이상이디