본문 바로가기

CUDA C

Hello, World!

728x90
반응형
반응형

새로운 카테코리에 글을 쓰는 건 오랜만이네요.

사실 논문도 많이 못 올리고 있었는데, 정말 바빴거든요.

이번 기회에 CUDA C가 필요하게 되어서 기본 부터 해볼까합니다.

정리도 할겸! 그럼 볼까요?

 


Code

# include <stdio.>

 

__global__ void hello(void){

    printf("Hello, World!\n",threadIdx.x);

}

 

int main(void);

{

  hello<<<1,1,>>>();

  cudaDeviceSynchronize();

}


환경 설명

  우선 환경에 대해 설명해야겠네요. 저는 우선 nvidia orin nx board 상에서 진행하고 있고, os 는 linux, cuda 11.4, jetpack 5.1.1이 설치되어 있습니다. 환경 설정 부분은 조금 다르겠지만, 도움이 필요하시면 댓글에 남겨주세요!


코드 설명

간단한 코드입니다. 우선 가장 눈여겨 봐야할 친구는 2 가지 입니다.

  • __global__ void hello(void){}
  • hello<<<1,1>>>();

우선 첫 번째 친구는 kernel function 이라고 합니다. 함수의 몸체를 kernel 이라고도 하고 해당 부분을 함수로 구현하면 kernel funtion이라고 하죠. 이 부분이 gpu에서 실행되는 부분이라고 생각하면 됩니다. __global__ 이라는 친구는 cpu에서 실행되는 코드에서 CUDA에게 제어권을 넘기는 부분인데, 다음번에 제대로 설명해드리겠습니다. 몸체 부분에 threadIdx.x 라는 친구가 보일꺼에요. 이 친구는 for loop에서 i와 같은 역할을 하신다고 보면됩니다. 즉 for(int i=0;i<SIZE;i++) 부분에서 i와 같은 역할이라고 보시면 될 거에요. 나중에 가면 갈수록 더 잘 알게 되실테니, 오늘은 느낌정도만 가지고 갑시다.

 

두 번째 친구는 hello<<<1,1>>>(); 라는 친구인데 kernal을 launch 하는 부분입니다. 우리가 함수는 call 한다고 하는 것처럼 kernel function은 launch한다고 합니다. 여기서 <<< >>> 이 부분은 block과 thread를 설정해주는 부분입니다. cuda는 일 처리를 병렬로 합니다. 그래서 gpu에 일을 어떻게 병렬로 처리할 지를 알려줘야 합니다. 그러기 위해서 필요한 개념이 grid, block, thread 입니다. grid는 blocks으로 이루어져있고, blocks 는 threads로 이루어져있죠. 즉 <<<1,1>>>은 전체 grid에 한 개의 block 안에서, 1 개의 thread에 일을 시키겠다는 의미입니다. 사실 위 코드는 single cpu가 뱉어내는 결과와 같아요. 왜냐면 1개의 block에서 1개의 thread가 hello를 실행하기 때문이죠.

 

만약 hello<<<1,4>>>(); 로 바뀌면 어떻게 될까요? 그럼 hello,world!가 4번 출력되게 됩니다. hello<<<2,4>>>();

라면 2 x 4 = 8 임으로 8개의 hello, world!가 출력되겠죠. 우선은 간단하게 여기까지 하겠습니다.

728x90
반응형