일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Machine Learning
- probability
- No SQL
- Artificial Intelligence
- 김양재
- Big Data
- 빅 데이타
- 빅데이터
- 김양재 목사님
- 주일설교
- 딥러닝
- 우리들교회
- data science
- 통계
- 몽고디비
- 빅데이타
- 확률
- Deep learning
- 인공지능
- WebGL
- openCV
- nodeJS
- R
- Statistics
- 김양재 목사
- 빅 데이터
- c++
- 데이터 과학
- MongoDB
- node.js
- Today
- Total
Scientific Computing & Data Science
[Programming / NVIDIA CUDA] 1D 배열 인덱스 변환 본문
[Programming / NVIDIA CUDA] 1D 배열 인덱스 변환
cinema4dr12 2016. 6. 6. 15:33CUDA 프로그래밍을 하다보면 2차원 또는 3차원의 Grid, Block 메모리 구조를 1차원의 배열 인덱스로 변환해야 할 경우가 있다.
예를 들어 다음과 같이 block과 thread 메모리 공간을 할당할 수 있다.
blocks는 Grid 내의 block 메모리 공간의 차원을 정의하며, threads는 Block 내의 thread 메모리 공간의 차원을 정의한다.
두 개 모두 기본적으로는 3차원의 구조를 가지고 있으며, Z에 대한 차원이 정의되지 않은 경우 Z의 차원은 1로 정의된다.
즉, GrdiDimZ = 1, BlockDimZ = 1이다.
다음과 같이 kernel 함수를 정의한다고 하자.
my_kernel() 함수는 다음곽 같은 형식으로 호출될 것이다.
x, y는 각각 Grid, Block 구조에서 해당 thread의 전역 좌표이다.
예를 들어, blocks과 threads의 차원을 다음과 같이 설정해 보자.
이 경우, my_kernel() 함수에서 정해지는 각 dimension은 다음과 같이 할당된다 :
gridDim.x = 2
gridDim.y = 3
blockDim.x = 4
blockDim.y = 2
이 구조로 할당된 Grid 및 Block Dimension은 다음 그림과 같은 구조를 갖는다.
위의 그림에서 각 셀(cell)은 thread를 의미한다. 주황색 셀은 Block(blockIdx.x = 1, blockIdx.y = 0) 내에 있는 (threadIdx.x = 0, threadIdx.y = 1) 인덱스의 thread 이며, thread의 전역 인덱스 (x, y) 는 (4, 3)이다.
전역 인덱스 (x, y)는 다음과 같이 계산된 것이다 :
x = threadIdx.x + blockIdx.x * blockDim.x = 0 + 1 * 4 = 4
y = threadIdx.y + blockIdx.y * blockDim.y = 1 + 1 * 2 = 3
그러면 offset은 어떻게 계산되는가?
전체 thread를 아래 그림과 같이 일렬로 배치한다고 생각해 보자.
일렬로 배치되었을 때 주황색 셀에 해당하는 thread는 다음과 같이 계산된다 :
offset = x + y * blockDim.x * gridDim.x = 4 + 3 * 4 * 2 = 4 + 24 = 28
즉, 해당 thread는 1D 배열로 늘어뜨릴 경우 28번째에 위치하게 된다.
이 공식들을 이용하여 3D 메모리 구조에 대해서도 유사한 방식으로 적용할 수 있다.
offset은
과 같이 계산된다.
'Scientific Computing > NVIDIA CUDA' 카테고리의 다른 글
[CUDA] Simulating Heat Transfer (1) | 2015.08.04 |
---|---|
[CUDA] Vector Add 예제 2. (0) | 2015.01.02 |
[CUDA] 자신의 GPU 카드의 Device 정보 출력하기 (0) | 2014.12.22 |
[CUDA] Tip / Visual Studio V11 (2012)에서 Platform Toolset 에러 발생 시 대처법 (0) | 2014.06.11 |
[GPU 기술] CUDA를 활용한 실시간 유체 시뮬레이션 구현 (0) | 2014.04.06 |