[CUDA] CUDA 공부 1 - 이미지 읽어와 GPU에 복사/가져오기


 자 이제 본격적으로 해보자

우선 이미지 읽어와서 GPU에 복사, GPU 메모리 안에서 복사, GPU에서 시스템 메모리로 복사

등을 해보자.

 

참조한 블로그 : Z-wony 님 블로그의 [CUDA] 02. Memory Copy 및 Crop

 

z-wony 님은 리룩스에서 작성하셨으나 난 윈도우니까 그에 맞게 소스를 수정하고 공부해보자


우선 프로젝트를 생성하고 속성에서 opencv 와 CUDA를 추가하자.

(include, lib 추가)

 


기존 read_JPEG_file 함수를 opencv 함수로 바꾸고

    cv::Mat Img;
    Img = cv::imread(SAMPLE_IMG, CV_8U);

    imgWidth = Img.cols;
    imgHeight = Img.rows;

    imgBuffer = Img.data;

회색조 이미지 이니까 pitch * 3 된 곳을 3배를 없앤다.

imageWriteToGPU 함수 안에도 opencv 함수로 수정

    cv::Mat Img = cv::Mat(height, width, CV_8U, hostMem).clone();

    cv::imwrite(filepath, Img);


추후 GPU 구해서 GPUDirect Storage 를 구현하면 달라지겠지만

CUDA에서 사용하는 명칭을 사용하여 설명하자

CUDA에서는 기존 메모리 (시스템 메모리) 를 Host Memory

GPU 메모리를 Device Memory 라고 한다.


이 두 메모리 간에 복사 및 GPU 메모리 내의 복사를 할 때 cudaMemcpy 나 cudaMemcpy2D 함수를 사용한다.



cudaMemcpy2D(devPtr, // dst Buffer (Device) pitch, // Pitch size of dst (devPtr) imgBuffer, // src Buffer (Host) (size_t)(imgWidth * 3), // Pitch size of src (imgBuffer) (size_t)(imgWidth * 3), // Width size of src (imgBuffer) (size_t)imgHeight, cudaMemcpyHostToDevice); // Direction of copy (IMPORTANT)

출처: https://z-wony.tistory.com/21 [끄적끄적 프로그래밍]
cudaMemcpy2D(devPtr, // dst Buffer (Device) pitch, // Pitch size of dst (devPtr) imgBuffer, // src Buffer (Host) (size_t)(imgWidth * 3), // Pitch size of src (imgBuffer) (size_t)(imgWidth * 3), // Width size of src (imgBuffer) (size_t)imgHeight, cudaMemcpyHostToDevice); // Direction of copy (IMPORTANT)

출처: https://z-wony.tistory.com/21 [끄적끄적 프로그래밍]


어느 메모리에서 어느 메모리로 복사하느냐에 따라 transfer type 을 다르게 넣어주면 된다.

 - System Memory -> Device Memory : cudaMemcpyHostToDevice

 - Device Memory -> System Memory : cudaMemcpyDeviceToHost

 - Device Memory 내 메모리 복사 : cudaMemcpyDeviceToDevice

댓글

이 블로그의 인기 게시물

[Python] 파이썬에서 Opencv를 이용해 웹캠 영상 읽어오기 및 저장

[MFC] 에디트 컨트롤에 계속 문자열 추가하기(List log)

[Python] OpenCv를 이용하여 마우스 위치 가져오기