[CUDA 공부/책] 3.cuda_memory.cu

NJ·2025년 8월 21일
0

CUDA공부

목록 보기
4/4

<CUDA 기반 GPU 병렬 처리 프로그래밍> 책 읽으며 실습 코드 실행해보고 있음.
(코드는 https://github.com/bluekds/CUDA_Programming/tree/master/Book_BJ 여기에서 확인할 수 있음. 근데 짧은 코드면 나는 손으로 직접 작성하는 걸 선호! 그래야 하나하나 따라가면서 이해하는 느낌.)


3장에서는 cuda memory와 관련한 내용!
memory allocation, memory set (초기화), memory free
그리고
host -> device, device->host 로의 메모리 이동 (memory copy) 의 내용이 포함되어 있다!

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

__global__ void printData(int* _dDataPtr){
    printf("%d", _dDataPtr[threadIdx.x]);
}

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

int main(void){
    cudaSetDevice(15);
    int data[10] = {0};
    for (int i = 0; i < 10; i++) data[i] = 1;

    int* dDataPtr;
    cudaMalloc(&dDataPtr, sizeof(int)*10);
    cudaMemset(dDataPtr, 0, sizeof(int)*10);

    printf("Data in device: ");
    printData <<<1, 10>>> (dDataPtr);

    cudaMemcpy(dDataPtr, data, sizeof(int)*10, cudaMemcpyHostToDevice);
    printf("\nHost -> Device: ");
    printData <<<1, 10>>> (dDataPtr);

    setData <<<1, 10>>> (dDataPtr); // 2로 set 
    cudaMemcpy(data, dDataPtr, sizeof(int)*10, cudaMemcpyDeviceToHost);
    printf("\nDevice -> Host: ");
    for (int i = 0; i < 10; i++) printf("%d", data[i]);
    
    cudaFree(dDataPtr);
}

우선 3-3 코드를 보면 위와 같다.
cudaMalloc으로 메모리 얼록을 해주고, cudaMemset으로 0으로 초기화해준다.
그 다음 데이터 찍어본 후, cudaMemcpy를 통해 (dest, src, ...) 메모리 복사.
마지막으로 cudaFree.

아래는 함수 원형들.

헤더 파일

#include <cuda_runtime.h>

함수 원형들

1. cudaMalloc

cudaError_t cudaMalloc(void** devPtr, size_t size);
  • GPU 메모리를 할당합니다
  • devPtr: 할당된 GPU 메모리 주소를 저장할 포인터의 주소
  • size: 할당할 바이트 수
  • 반환값: cudaError_t 타입의 에러 코드

2. cudaMemset

cudaError_t cudaMemset(void* devPtr, int value, size_t count);
  • GPU 메모리를 특정 값으로 초기화합니다
  • devPtr: 초기화할 GPU 메모리 주소
  • value: 설정할 값 (0-255 범위의 정수)
  • count: 설정할 바이트 수
  • 반환값: cudaError_t 타입의 에러 코드

3. cudaFree

cudaError_t cudaFree(void* devPtr);
  • GPU 메모리를 해제합니다
  • devPtr: 해제할 GPU 메모리 주소
  • 반환값: cudaError_t 타입의 에러 코드

4. cudaMemcpy

cudaError_t cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind);
  • 메모리 간 데이터를 복사합니다 (Host ↔ Device)
  • dst: 목적지 메모리 주소
  • src: 원본 메모리 주소
  • count: 복사할 바이트 수
  • kind: 복사 방향을 지정하는 열거형
    • cudaMemcpyHostToDevice: Host → Device
    • cudaMemcpyDeviceToHost: Device → Host
    • cudaMemcpyDeviceToDevice: Device → Device
    • cudaMemcpyHostToHost: Host → Host
  • 반환값: cudaError_t 타입의 에러 코드

모든 함수는 성공 시 cudaSuccess를 반환하며, 에러 발생 시 해당하는 에러 코드를 반환합니다.


3-5, 3-6의 vector add 실습 코드도 재밌음!
특히 3-5 skeleton 부터 시작해서 작성해보면 (아주 친절함!) 뭔가 뿌듯함을 느낄 수 있다!
(3-6 코드의 벡터 크기 늘렸을 시 print가 너무 자주 찍히기 때문에 print는 주석처리 하는 거 추천~ 다만 if-else 구문으로 틀렸으면 틀렸다 한 마디만 적어주도록 하자~)

아차차,
그리고 너무 오랜만에 컴파일 해보아서,, 여러 파일 한 번에 컴파일 해야 하는 정보 밑에 추가.
책을 따라가다보면 DS_timer.cpp라는 파일을 같이 사용하게 되는데 (시간 측정용),
해당 .cpp 없이 .cu 파일만 컴파일하려니 오류가 생겨서! 클로드의 도움을 받아 무사히 잘 컴파일 후 실행해보았다.

nvcc -o vector_add_timer 3-6.vector_add_timer.cu DS_timer.cpp 

실습 재밌었다리~

코드만 있는 leetcuda보다 설명과 실습코드가 같이 들어간 책이... 역시 친절하다는 것을 느낌... 책 최고!

메모리와 관련해서는 궁금한 건 별로 없어서 호로록 호로록 넘어갔다.
실습 코드 적당히 있어서 따라해보는 것도 재밌었다.

CUDA의 특징적인 스레드 계층... 이런 거 이제 chapter 4부터 시작되는데 기대!

profile
Studying NLP

0개의 댓글