1. 메모리 계층 구조
GPU 에는 여러 유형의 메모리가 존재, 각 메모리는 접근 속도가 다르다. 병렬 프로그래밍에서는 메모리 접근 패턴을 최적화하여 성능을 극대화해야 한다.
메모리 유형
- 전역 메모리 Global Memory : GPU 에서 사용할 수 있는 가장 큰 메모리 공간, 접근 속도가 느리며, 성능을 높이기 위해서는 가능한 이 메모리 접근을 최소화해야 한다.
- 공유 메모리 Shared Memory : 같은 블록 내의 스레드들이 공유하는 고속 메모리, 잘 활용하여 전역 메모리에 접근할 필요 없이 빠르게 데이터를 처리할 수 있다.
- 레지스터 Register : 각 스레드가 연산에 사용할 수 있는 가장 빠른 메모리,
- 상수 메모리 Constant Memory : 읽기 전용 메모리, 일정한 값을 여러 스레드가 사용할 때 유용하다.
최적화 전략
- 메모리 공동화 coalescing : 전역 메모리 접근 시, 스레드들이 연속된 메모리 주소 에 접근하면 병합된 접근을 통해 성능을 높일 수 있다.
- 공유 메모리 활용 : 전역 메모리에서 데이터를 읽은 후, 공유 메모리에 저장하여 블록 내 스레드 간에 데이터를 재사용할 수 있다.
2. 스레드 계층 구조 및 배치
CUDA 에서는 스레드가 블록 단위로 그룹화되며, 여러 블록들이 그리드 형태로 구성된다.
- 블록 크기 : 각 블록에서 처리할 수 있는 스레드의 수는 하드웨어에 의해 제한,
- 스레드 차원 : 스레드는 1,2,3 차원으로 구성할 수 있다. 데이터의 구조에 따라 차원 수를 적절히 선택하는 것이 중요하다.
최적화 전략
- 적절한 블록 크기 선택
- 스레드 다차원 사용
3. 로드 밸런싱 및 병렬 작업 분할
로드 밸런싱은 작업을 각 스레드에 균등하게 배분하는 것,
- 균등한 작업 분할
- 동적 작업 분할 : 작업을 실시간으로 재분배하여 성능 최적화
4. 동기화 및 경합 Synchronization and Contention
스레드 간의 동기화는 병렬 프로그래밍에서 필수적인 작업이지만, 자주 사용하면 성능이 저하될 수 있다.
- 스레드 동기화 Synchronization
- __syncthreads() 를 사용하여 같은 블록 내의 스레드들이 특정 지점에서 모두 작업을 완료한 후에 다음 단계로 넘어가도록 할 수 있다. 과도한 동기화는 성능 저하
- 경합 Contension
- 여러 스레드가 동일한 리소스에 접근할 때 경합이 발생할 수 있다. 경합은 병목현상을 일으키므로, 리소스를 분리하거나 원자적 연산을 사용하는 것이 좋다.
5. 워프 다이버전스 (Warp Divergence)
CUDA 에서 워프는 32개의 스레드가 하나의 명령어를 동시에 실행하는 그룹이다.
워프 다이버전스는 워프 내에서 서로 다른 실행 경로가 발생할 때 발생한다. 예를 들어 if-else 문에서 조건에 따라 일부 스레드는 if 블록을 실행하고, 다른 스레드는 else 블록을 실행하는 경우
워프 내에서 실행 경로가 다르면 성능이 저하된다. 워프 내의 모든 스레드가 같은 실행 경로를 따를 수 있도록 코드를 작성하는 것이 중요하다.
최적화 전략
- 분기문 최소화 : 가능한 한 스레드 간의 분기문을 최소화하여 워프 다이버전스를 피한다.
- 코드 재구성 : 분기 조건을 미리 계산하여 워프 내에서 동일한 명령어가 실행되도록 코드를 재구성할 수 있다.
6. CUDA 스트림 (CUDA Streams)
CUDA 에서 스트림은 비동기 작업을 관리하는 데 사용된다. 여러 작업을 서로 다른 스트림에서 실행하면 GPU 에서 비동기적으로 실행되며, CPU, GPU 간의 작업도 병렬로 처리할 수 있다.
7. 프로파일링 및 성능 분석
병렬 프로그래밍에서는 코드가 의도한 대로 동작하는지, 성능이 최적화되어 있는지 확인하는 것이 중요,
8. 비동기 메모리 전송
메모리 전송 병목이 될 수 있기에 이를 위해 비동기 메모리 전송을 활용할 수 있다.
'dev_AI_framework' 카테고리의 다른 글
Layer 쌓기에 이어서 operation 쌓기 (0) | 2024.10.23 |
---|---|
.cu 파일을 컴파일하고 실행하는 전체 과정, cu 파일 실행 완료~ (0) | 2024.10.23 |
C++ 실행 환경 설정, GPU 상태 확인하기 (0) | 2024.10.22 |
CUDA 를 사용하기 위해... (GPU 정보 확인) (0) | 2024.10.22 |
예제 코드로 확인하는 CUDA 의 각 함수 설명 (0) | 2024.10.22 |