글을 작성하기 전에 알고가야 하는 것을 적어보겠습니다.

  • Host(CPU)와 Device(GPU)는 서로 다른 독립적인 메모리 영역입니다.
  • 서로 비동기적으로 동시에 실행 가능합니다. - 즉, 동시에 동작할 수 있습니다.

CUDA Programming Structure

  1. CPU -> GPU로 데이터를 옮겨줍니다.
  2. GPU에서 작업을 진행합니다.
  3. 결과값을 GPU에서 CPU로 옮겨줍니다.

Deivce memory allocation / release

  • cudaError_t cudaMalloc(void** ptr, size_t size): GPU를 사용하기 위한 공간을 확보
  • cudaError_t cudaFree(void* ptr): 사용된 GPU 공간을 해제
  • cudaMemcpy(void* dst, const void* src, size_t size, kind): 확보한 GPU공간에 Data를 복사
    • dst: 복사할 곳
    • src: 어떤것을 복사할지
    • size: 어떤것의 크기
    • kind: 어디서 어디로 복사할지(방향성)
      1. cudaMemcpyHostToHost: CPU -> CPU
      2. cudaMemcpyHostToDevice: CPU -> GPU
      3. cudaMemcpyDeivceToHost: GPU -> CPU
      4. cudaMemcpyDevicetoDevice: GPU -> GPU

※ HOST와 DEVICE에서의 명령어 비교

 


직접 작성해보기

GPU에서 실행될 __global__ 함수를 정의해줍니다.

 

각종 변수들을 선언 및 초기화를 진행해줍니다.

여기서는 int * 512만큼의 공간을 사용하겠습니다.

 

위에서 선언한 d_a, d_b, d_c를 이용하여 GPU에 공간을 할당해줍니다.

그리고 위에서 선언한 __global__함수를 호출하여 실행해줍니다.

 

결과값을 비교해보면 잘 작동되는 것을 알 수 있습니다.

 


 

처리시간 재기

시간을 측정하기 위해서는 vecAdd<<<1, NUM_DATA>>>... 밑에

cudaDeviceSynchronize(); 라는 함수를 사용하면 됩니다.

위에서 말했다시피 CPU와 GPU는 서로 독립적으로 작동하기 때문데

CPU는 vecAdd를 실행시키고 끝날때까지 기다리는것이 아니고 바로 다음줄을 실행해버립니다.

그래서 vecAdd 밑에 cudaDeviceSynchronize();를 사용하게 되면

GPU연산이 끝날때까지 작동을 멈춥니다.

 

cudaDeviceSynchronize(); 를 사용해라!

'Cuda' 카테고리의 다른 글

06_Where_is_Thread_CUDA  (0) 2021.08.30
05_How_Kernel_Works_CUDA  (0) 2021.08.30
03_Hello_CUDA_(Colab에서 CUDA 설정하기)  (0) 2021.08.26
02_용어정리_CUDA  (0) 2021.08.26
01_Parallel_Computing_CUDA  (0) 2021.08.25

+ Recent posts