CUDA

CUDA 디바이스 메모리 할당, 초기화 및 해제 - 공부하는 도비

DOVISH WISDOM 2025. 1. 9. 14:10  
728x90
반응형

GPU를 사용하여 연산을 하기 위해서는 CPU 메모리에 있는 데이터를 GPU 메모리 상으로 가져와야 한다. 

CUDA에서 CPU를 Host, GPU를 Device라고 부른다. 

즉, Host -> Device 또는 Host <- Device 간 데이터의 이동이 일어난다. 

 

아래는 Host 상에 있는 데이터를 어떻게 Device 상으로 가져오는 지, 그리고 어떻게 초기화 하며 해제 하는 지를 보여주는 예제다.

 

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

// cudaMemcpy : 호스트와 디바이스 간 데이터 전송을 위한 함수
// cudaError_t cudaMemcpy(void *dst, const void *src, size_t count, cudaMemcpyKind kind);
// dst : 복사할 대상 메모리 주소
// src : 복사할 데이터의 주소
// count : 복사할 바이트 수
// kind : 복사 방향을 나타내는 열거형 변수
/* (kind 종류) 
   cudaMemcpyHostToDevice : 호스트에서 디바이스로 복사
   cudaMemcpyDeviceToHost : 디바이스에서 호스트로 복사
   cudaMemcpyDeviceToDevice : 디바이스에서 디바이스로 복사
   cudaMemcpyHostToHost : 호스트에서 호스트로 복사 
*/
__global__ void printData(int* _da)
{
    printf("%d ", _da[threadIdx.x]);
}

__global__ void setData(int* _da)
{
    _da[threadIdx.x] = 2;
}   

int main() 
{
    int N = 10;
    int data[N] = {0,};
    for(int i = 0; i < N; i++)
    {
        data[i] = i * 2;
    }
    printf("Data in host\n");
    for (int i = 0; i < N; i++)
    {
        printf("%d ", data[i]);
    }

    int* _da;
    cudaMalloc(&_da, sizeof(int)*N);
    cudaMemset(_da, 0, sizeof(int)*N);

    printf("\nData in device after cudaMemset\n");
    printData <<<1, N>>> (_da);

    cudaMemcpy(_da, data, sizeof(int)*N, cudaMemcpyHostToDevice);
    printf("\nData in device after cudaMemcpy\n");
    printData <<<1, N>>> (_da);

    setData <<<1, N>>> (_da);   // Set all elements to 2 in device memory

    cudaMemcpy(data, _da, sizeof(int)*N, cudaMemcpyDeviceToHost);
    printf("\nData in host after setData\n");

    for (int i = 0; i < N; i++)
    {
        printf("%d ", data[i]);
    }
    printf("\n");

    cudaFree(_da);

    return 0;
}

 



1. data 라고 하는 배열을 선언하고, data = {0 2 4 6 8 10 12 14 16 18} 로 초기화 하였다. 

2. cudaMalloc을 사용하여 _da에 메모리를 할당해주고, cudaMaemset을 사용하여 _da 값을 0으로 초기화 하였다. 

3. cudaMemcpy를 사용하여 data 값을 _da에 복사해주었다. (Host -> Device)

 

4. __global__ 로 선언해둔 setData를 통해 _da 값을 모두 2로 셋팅을 해주었다. 

 

5. cudaMemcpy를 사용하여 _da 값을 data에 복사해주었다. (Device -> Host)

 

 

실행 결과