헤테로지니어스 컴퓨팅?
- 한 가지 이상의 프로세서를 내장한 시스템
- CPU와 GPU를 같이 사용하는 프로그래밍
GPGPU?
- GPU를 CPU가 맡았던 App의 계산에 사용하는 기술
- CUDA(HLSL) / OpenCL(GLSL)이 있음
GPU 프로그래밍 기초
- MultiThreading
CPU가 루프돌면서 처리하던 것을 병렬로 처리
한번에 수십개의 유닛이 같은 명령을 동시에 처리
void func()
{
for (uint i =0; i<count; ++i)
c[i] = a[i] + b[i];
}
[numthreads(groupWidth, groupHeight, 1)]
void func(uint i : SV_DispatchThreadID)
{
c[i] = a[i] + b[i];
}
- Shared Memory
쓰레드간에 공유하는 작은 크기의 메모리
쓰레드간 주고 받을 정보나 중복 데이터 저장
Single Instruction Multi Thread
- 32/64 쓰레드가 같은 명령어를 실행한다.
명령어 유닛 1개가 여러 쓰레드를 제어
SIMD와 흡사하나 코드 자유도가 높다
Thread Group, Warp, WaveFront로 불린다
- 분기 발생시 양쪽 조건을 모두 실행한다.
모든 쓰레드가 if/for/while에 못들어가면 다른 쓰레드는 멈춘다
Group이 다양한 분기를 탈 경우 매우 느려진다
모두 실패할 경우 빠르게 Context switching 된다
Shared Memory 임시 버퍼로 쓰기
- Cache 용도로 메모리 접근 최적화
순차 복사 후 랜덤하게 Shared Memory 접근
- Shared Memory로 Register 사용을 줄인다
각종 자료구조 구현해 사용
쓰레드간 Shared Memory 공유하기
- 다른 쓰레드가 계산한 결과를 저장한다
쓰레드간 데이터 교환에 유용하다
- 쓰레드들을 Thread Pool같이 써보자
쓰레드가 32가 넘을 경우 GroupSync() 해야한다
CPU에서 GPU로 작업을 옮겨보자
1. 임시 메모리 사용량이 적다
2. 순서가 바뀌거나 랜덤도 잘 돌아간다
3. 루프를 많이 돌고있다. case by case
CPU도 GPU도 BandWidth에 민감하다
- 최적화 할 수록 메모리 퍼포먼스가 중요
AoS와 SoA를 잘 골라쓰자
- SoA가 더 빠르다고 하지만 다수의 스트림을 다룰때는 AoS가 더 빠를 때도 있다
- BandWidth/Bank가 적을수록 AoS를 선호한다
- AoS?
메모리에 struct 단위로 저장
- SoA?
메모리에 같은 항목별로 저장
GPU의 약점
- 까다로운 GPU 메모리 접근
대역폭은 넓지만 랜덤 접근에 강하지 않다
Shared Memory도 최악의 경우 16배까지 느려짐
- 생각보다 느린 Thread당 연산 속도
클럭이 CPU의 20~25% 수준
- CPU와 데이터, 결과를 주고 받아야 한다
복사 비용은 비싸다 => 최대한 재사용
주고 받는 데이터 크기도 최소화 하자 (uint16)
출처: 엔씨소프트
http://ndcreplay.nexon.com/NDC2014/sessions/NDC2014_0053.html
'NDC > ETC' 카테고리의 다른 글
[NDC 2015] Key-Value Store를 사용한 대용량 게임 통계 (0) | 2023.01.03 |
---|