본문 바로가기

카테고리 없음

[CUDA기반 GPU병렬 처리 프로그래밍] CUDA프로그램의 기본 흐름

728x90
반응형

CUDA프로그램

  • Host 코드
  • Device 코드

 

 

GPU가 사용하는 메모리는 Device메모리이지만, 모든 데이터는 기본적으로 호스트 메모리에 저장되어있다.

 

 

순서 

1. Host메모리에서 Device 메모리로 입력 데이터 복사 

2. 커널 호출을 통해 GPU연산을 시작한다. 모든 데이터는 디바이스 메모리에서 관리한다.

3. Device메모리에서 Host메모리로 결과 데이터 복사  

 

 

1. Device 메모리 할당

 

Device 영역에 동적할당은 cudaMalloc을 사용하면 된다. 

cudaMalloc 후에 print를 해보면 

하지만 아래의 코드는 오류가 날 것이다.

(인덱스 0에 값을 넣어줘도 오류가 나는 것은 똑같다.)

 

 

이유는 Host코드에서 Device데이터에 접근하려고 하는 것이기 때문이다.

 

 

2. Device 메모리 해제

 

c에서 동적할당 후 free를 하는 것과 같이 cuda도 직접 동적할당 해제를 해줘야한다.

 

 

3. Device 메모리 초기화

 

  • void* devPtr : 초기화 할 주소
  • int value: 초기화 할 값
  • size_t count: 초기화할 메모리 크기

 

 

4. 에러코드 확인

cudaGetErrorName

 

5. 장치간 데이터 복사

cudaMemcpy()

dst와 src는 직관적이다.

src에서 dst로 데이터를 옮기는 것이다. 근데 dst,src가 device인지 host인지 명시를 해줘야한다.

그것을 cudaMemcpyKind로 해주는 것이다.

 

+

1. cudaMemcpy2D

cudaMemcpy2D는 2차원 메모리 공간을 복사할 때 사용된다. (ex 이미지, 행렬) 

  • dst: 데이터를 복사할 목적지 주소.
  • dpitch: 목적지에서 한 행(row)을 저장하는 데 사용되는 실제 메모리 너비(바이트 단위). 데이터는 실제로는 연속적이지 않고 메모리에서 padding이 있을 수 있기 때문에, pitch는 데이터를 복사할 때 이를 고려하게 해.
  • src: 원본 데이터가 있는 주소.
  • spitch: 원본 데이터에서 한 행을 저장하는 데 사용되는 메모리 너비.
  • width: 복사할 데이터의 가로 길이 (바이트 단위).
  • height: 복사할 데이터의 세로 길이.

2. cudaMemcpy3D

cudaMemcpy3D는 3차원 메모리 공간을 복사할 때 사용된다.

 

cudaMemcpy3D는 cudaMemcpy3DParms 구조체를 사용해 파라미터를 전달한다.

 

  • srcArray: 원본 데이터가 있는 3차원 배열
  • dstArray: 데이터를 복사할 3차원 배열
  • extent: 복사할 3차원 범위를 지정하는 구조체로, 가로, 세로, 높이 정보를 포함한다.
  • kind: cudaMemcpyKind(위에 있다

 

 

실습

 

1.메모리 할당/해제

 

 

 

2. 데이터 복사

728x90
반응형