10개의 원소를 갖는 두 벡터 a, b의 합을 그림으로 보면 다음과 같다.
그림 - 벡터의 합
이것을 우리가 흔히 사용했던 C 코드로 작성을 하면 다음과 같을 것이다.
그림 - 벡터의 합 C 코드
그림 - 벡터의 합 결과
이것을 이제 CUDA를 이용하여 병렬 프로그래밍을 해보도록 하자.
그림 - CUDA를 이용한 벡터의 합 Main
이전 C코드에서 Main부분은 바뀐 부분이 GPU에서 사용되는 변수가 추가된 것과 add() 함수가 커널 함수로 바뀐 것 밖에 없다.
커널 함수 add<<<N, 1>>>의 첫 번째 인자를 통해 N개의 병렬 블록(Block)들이 실행되도록 지시하고 뒤에 1은 스레드가 1개가 돈다는 뜻이다. 즉 add<<<Block 개수, Thread 개수>>> 이다.
Block과 Thread는 다음 글에서 다시 설명하도록 하겠다.
이 블록(Block)이라는 것은 쉽게 말해 각각의 병렬 실행을 뜻한다. 즉 N개의 add()가 생성되어 병렬로 실행된다는 것이다.
블록의 개수 N은 65,535의 값을 초과할 수 없다.(하드웨어의 제약사항)
그림 - add 커널 함수
add() 함수는 tid 값에 처음 보는 blockIdx.x가 대입되었다. 앞에서 커널 함수 add()를 호출할 때 블록 인자를 넣어주었다.
이 blockIdx가 바로 디바이스 코드를 작동하는 블록의 인덱스 값이다. 그리고 'x, y'가 있지만, 여기서는 'x'만 이용하였을 뿐이다.(y는 어차피 1이니...)
그리고 밑에서 while 문이 if 문으로 바뀌었다. 이것은 블록별로 병렬 실행되므로 while로 계산할 필요없이, 해당하는 인덱스의 데이터만 처리하면 되기 때문이다.
각 스레드들의 blockIdx.x는 0에서 N - 1사이의 값을 가질 것이다. 따라서 변수 blockIdx.x가 서로 다른 값을 가지면서 동일한 디바이스 코드의 복사본들을 수행하는 네 개의 블록들을 가정해볼 수 있다.
그림 - GPU를 이용한 벡터의 합
그리고 이러한 병렬 블록들의 집합을 그리드(grid)라고 부른다.
'Parallel Programming > CUDA' 카테고리의 다른 글
CUDA - 스레드 동기화 (0) | 2015.12.11 |
---|---|
CUDA - 메모리의 계층 구조 (0) | 2015.12.10 |
CUDA - 병렬 프로그래밍(스레드를 이용한 벡터의 합) (0) | 2015.12.10 |
CUDA - 동작 단위 (Thread, Warp, Block, Grid) (0) | 2015.12.08 |
CUDA - 시작 (간단한 덧셈) (0) | 2015.12.07 |