[SIMD 프로그래밍-0] colum base DB와 Row base DB차이는 ?
이전 글에서 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에 저장하기 때문
- 첫 번째 반복에서:
- 데이터가 메인 메모리에서 CPU 캐시로 처음 로드됨
- SIMD는 한 번에 여러 데이터를 병렬로 처리하므로 큰 성능 이점을 보임
- 이후 반복에서:
- 데이터가 이미 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초 |
이상이디
'DBMS' 카테고리의 다른 글
[SIMD 프로그래밍-0] Column base DB와 Row base DB차이는 ? (0) | 2024.10.28 |
---|---|
[PostgreSQL] pg_stat_statement 보는 법 (ft. analyze table) (0) | 2024.07.16 |
[PostgreSQL] pg_stat_statements 설정하기 (0) | 2024.07.15 |
[PostgreSQL] 기본 명령어 (schema,USER 생성 및 확인하는 방법) (0) | 2024.07.15 |
[AWS] AWSOME DAY - Computing 종류 (Ec2 ,Lambda ,ECS비교) (0) | 2024.07.12 |