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() 출력 문제 해결

  1. 문제 상황: printf()는 바로 화면에 출력하지 않고 내부 “버퍼”에 저장.
  2. 원인: 버퍼는 특정 조건에서 화면에 출력됨. CUDA는 많은 스레드가 동시에 동작하므로 출력이 예상대로 나오지 않을 수 있음.
  3. 해결책: 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번씩 동작한 것이다.

image


이제는 hello «<1,8»> (); 을 hello «<8,2»> ();로 바꿔보자.

  • «<8,2»>
    • 8 x 2 = 16번 (16개의 코어 사용)
  • 함수를 8세트, 2번씩 동시 실행

아래와 같이 0 ~ 1 (2번)까지 8번 출력되는 것을 확인할 수 있다.

image