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)
'CUDA' 카테고리의 다른 글
CUDA 2D 블록 내 스레드 인덱싱(Thread Indexing) - 공부하는 도비 (0) | 2025.01.21 |
---|---|
CUDA 큰 벡터의 합 - 공부하는 도비 (0) | 2025.01.21 |
CUDA 스레드 레이아웃 설정 및 커널 호출<<<>>> - 공부하는 도비 (0) | 2025.01.21 |
CUDA Pitch, cudaMallocPitch() - 공부하는 도비 (0) | 2025.01.09 |