cuda 시작하기
- 최초 작성일: 2023년 8월 31일(목)
목차
[TOC]
hello CUDA 출력해보기
새로운 프로젝트를 생성할 때 임의로 작성된 코드들을 모두 지우고, 아래와 같이 hello CUDA를 출력하는 코드를 작성해보자.
hello-cpp.cu
#include <stdio.h>
void hello(void) {
printf("hello world!\n");
}
int main(void) {
hello();
return 0;
}
C++ 프로그래밍을 해본 사람이라면 많이 익숙한 코드일 것이다.
내용은 C/C++ 내용 뿐이지만 컴파일/실행이 잘되는 것을 확인할 수 있다.
프로그래밍 팁
CUDA에서 printf()
출력 문제 해결
- 문제 상황:
printf()
는 바로 화면에 출력하지 않고 내부 “버퍼”에 저장. - 원인: 버퍼는 특정 조건에서 화면에 출력됨. CUDA는 많은 스레드가 동시에 동작하므로 출력이 예상대로 나오지 않을 수 있음.
- 해결책:
fflush(stdout);
사용- 이 함수로 저장된 출력 내용을 즉시 화면에 보여줄 수 있음.
printf("CUDA 출력 예제\n");
fflush(stdout);
이렇게 사용하면 CUDA에서 printf()
로 바로 화면에 출력할 수 있습니다!
이제 GPU에서 “hello CUDA!” 메시지를 화면에 출력하는 간단한 CUDA 프로그램 작성해보자.
hello-cuda.cu
#include <stdio.h>
#include <cuda.h>
__global__ void hello(void) {
printf("hello CUDA!\n");
}
int main(void)
{
hello <<<1,1>>> ();
fflush(stdout);
return 0;
}
__global__
: 이 키워드는 함수가 GPU에서 실행되는 CUDA 커널임을 나타낸다.hello <<<1,1>>> ();
:hello
커널을 GPU에서 호출하는 부분.<<<1,1>>>
는 커널 실행 구성을 나타내는데, 1개의 블록과 블록 당 1개의 스레드로 커널을 실행함을 의미한다. 총 1개(1x1)의 스레드(코어)가hello
함수를 실행하게 된다.- 이 코드는 ‘Linux’에서는 실행이 안될 수 있는데, 그 부분은 뒤에서 다루자.
이제 함수를 여러번 ‘동시 실행’하는 간단한 ‘병렬 컴퓨팅’ 코드를 작성해보자.
hello-parallel.cu
#include <stdio.h>
__global__ void hello(void) {
printf("hello CUDA%d!\n", threadIdx.x);
}
int main(void)
{
hello <<<1,8>>> ();
fflush(stdout);
return 0;
}
__global__
: 함수가 GPU에서 실행된다는 표시.threadIdx.x
: 현재 스레드의 x 인덱스.hello <<<1,8>>> ();
: GPU에서hello
커널 실행. 1개 블록, 블록 당 8개 스레드. 8(1x8)개 core.
코드를 실행해보면, 아래와 같은 결과를 확인할 수 있다.
0 ~ 7까지 출력되는 것을 볼 수 있는데, 이것은 하나의 쓰레드가 8번 돈 것이 아니라 8개의 쓰레드가 각각 1번씩 동작한 것이다.
이제는 hello «<1,8»> (); 을 hello «<8,2»> ();로 바꿔보자.
- «<8,2»>
- 8 x 2 = 16번 (16개의 코어 사용)
- 함수를 8세트, 2번씩 동시 실행
아래와 같이 0 ~ 1 (2번)까지 8번 출력되는 것을 확인할 수 있다.