글을 작성하기 전에 알고가야 하는 것을 적어보겠습니다.
- Host(CPU)와 Device(GPU)는 서로 다른 독립적인 메모리 영역입니다.
- 서로 비동기적으로 동시에 실행 가능합니다. - 즉, 동시에 동작할 수 있습니다.
CUDA Programming Structure
- CPU -> GPU로 데이터를 옮겨줍니다.
- GPU에서 작업을 진행합니다.
- 결과값을 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: 어디서 어디로 복사할지(방향성)
- cudaMemcpyHostToHost: CPU -> CPU
- cudaMemcpyHostToDevice: CPU -> GPU
- cudaMemcpyDeivceToHost: GPU -> CPU
- 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 |