라벨이 CUDA인 게시물 표시

[CUDA] CUDA 공부 2 - CUDA 기본 구조 및 함수 키워드

이미지
자 이제 GPU 메모리에 데이터를 올렸으니 연산이 들어가야 할 차례이다. 우선 CUDA를 이용하여 GPU를 연산에 사용할려면 파일 확장자를 CUDA 용으로 cu로 작성하여야 CUDA 관련 컴파일러(NVCC)가 이를 컴파일 해줄 것이다. CUDA에서 사용되는 함수는 크게 3가지로 구분된다. CPU에서 사용되는 함수, GPU에서 사용되는 함수, CPU와 GPU에서 사용되는 함수 이다. CPU와 GPU에서 사용되는 함수는 CPU에서 사용되는 함수와 GPU에서 사용되는 함수를 이어주는 다리 같은 역할이라고 이해하면 되겠다. 이 각각의 함수는 __host__, __device__, __global__ 의 키워드로 대표된다.   1. __host__ 호스트 즉, CPU와 시스템 메모리에서 실행되는 함수. 일반적으로 사용하는 함수처럼 키워드를 생략가능하다. 디바이스 함수에서 호출 불가하다.  __host__ int main() {      ... } 2. __device__ 디바이스(GPU)에서 실행되는 함수. 호스트에서 호출 불가능하다. 클래스내의 private 멤버 함수와 비슷하다고 생각하면 될 듯 하다. __device__ void function() {     ... } 3. __global__ 디바이스에서 실행되는 함수. 호스트에서 호출 가능하나 디바이스 함수에선 호출 불가하다. 호스트 함수에서 호출하여 실행하는 커널 함수를 지정하거나 디바이스 함수를 호출하는데 사용된다. 주의 점은 리턴 값은 무조건 void 이다. __global__ void function() {     ... } 위 소스는 __global__ 함수로 작성된 두 개 벡터의 값을 더해 다른 벡터에 대입하는 예제이다.(예제소스 : vectorAdd) 여기서 blockDim 과 blockIdx, threadIdx 가 보인다. 이것들이 뭔지 정확히 하고 가야 CUDA 함수를 작성할 때 혼란이 없다. 자세한 내용은 성태님의 블로그 를 확인하자. 간단히 요약하면 CUDA는 작업을 thread 단위로 수행

[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)(img

[CUDA] Cuda 공부 0

이미지
 CUDA 학습을 진행하며 정리하는 글 일단 CUDA를 설치하면 새 프로젝트 만들기에 CUDA Runtime 이 추가된다. CUDA 다운은 여기 서! 자신의 개발 환경을 선택하여서 다운로드 후 설치하면 된다. 참고로 개발 환경은 VS2019 (Enterprise) 간단하게 프로젝트 이름을 정하고 완료를 누르면 간단한 예제가 나온다.    a 행렬과 b행렬의 값들을 더하는 예제이다. 파일 확장자는 .cu 로 cuda Source Code 파일이다. 아래는 예제 프로그램 실행 시 화면이다.   이 확장자로 GPU가 할일을 작성하고 일반 C 파일 헤더처럼 include 하여 사용하면 된다. 일반 C 문법과 크게 차이는 없다. malloc 대신 cudaMalloc 을 사용하고 free 대신 cudaFree 를 사용한다는 정도 하지만 C++ 문법이 아닌 C 문법을 따르고 있다는게 흠이라면 흠이랄까... cu 파일의 기본헤더는 "Cuda_runtime.h" 이며  "device_launch_parameters.h" 는 자신의 blockIdx, blockDim, threadIdx 를 구할 때 필요하다던데 일단은 뭔진 모르겠지만 그렇단다..출처 : 쿠로이님 블로그 우선은 Q's Tech blog 에 있는 NVIDIA CUDA 기초 튜토리얼을 보며 공부 할 예정임.