[CUDA] 프로젝트 작성 및 기본 구조
* 개발 환경
- IDE : Visual Studio 2013
- CUDA : v9.1
- OS Type : 64 bit
1. 기본적으로 C 프로젝트에는 소스 파일(*.c)과 헤더 파일(*.h)이 존재한다면 CUDA도 동일하게 소스파일(*.cu)과 헤더 파일(*.cuh)이 존재한다.
2. 기본적인 Sample Test를 위해 하기와 같이 빈 프로젝트를 생성한다.
3. 프로젝트 빌드 종속성의 사용자 지정 빌드 옵션에서 사용하는 CUDA 버전을 선택한다.
- 이 작업을 하면 프로젝트의 추가 종속성(lib) 및 추가 포함 디렉터리(include) 등 환경 설정들이 추가 반영 된다.
5. 프로젝트 속성에 링커의 lib 추가종속성을 추가해준다.
6. 프로젝트가 생성 되면 Main 소스 파일과 CUDA 소스파일, CUDA 헤더파일을 하기와 같이 생성해 준다.
- 먼저 프로젝트의 소스 파일을 우클릭하여 새 항목으로 main 소스와 Cuda 소스를 생성해 준다.
주의 할 점은 일반 소스 파일과 CUDA용 소스파일 생성 방법은 선택 항목이 다르다.
일반 소스파일 생성하듯이 만들면 문법적 오류가 발생되어 build 되지 않을 것이다.
- 사용 하고 있는 NVIDIA CUDA 버전을 선택 하고 CUDA C/C++ File을 선택하여 소스파일을 생성해준다.
CUDA 소스파일의 확장자는 .cu 로 끝난다.
- 일반적으로 만드는 Visual C++을 선택하여 Main 소스 파일을 생성해준다.
- 프로젝트의 헤더 파일을 우클릭하여 새 항목으로 Cuda 헤더 파일을 생성해 준다.
- CUDA 헤더파일 역시 CUDA 소스파일처럼 별도의 생성 선택항목이 있으므로 하기와 같이 사용하고있는 CUDA 버전의 헤더파일을 생성해 준다.
7. 소스 코드 작성
- CudaTest.cuh
기본 Run Time 헤더는 "Cuda_runtime.h" 이며, 런타임 해더도 버전마다 변경 되는 것 같다.
새 버전이 나올 때 마다 꼭 사용하고자 하는 버전의 Sample 코드를 확인해볼 필요가 있는것 같다.
"device_launch_parameters.h"는 Kernel Function에서 자기 BlockIdx, BlockDim, threadIdx를 구할 때 필요하다.
#pragma once #include "Cuda_runtime.h" #include "device_launch_parameters.h" #ifdef __cplusplus extern "C" {//<-- extern 시작 #endif class CudaTest { public: CudaTest(void); virtual ~CudaTest(void); int sum_cuda(int a, int b, int*c); }; #ifdef __cplusplus } #endif
- CudaTest.cu
#include "CudaTest.cuh" #include <stdio.h> CudaTest::CudaTest(void) { } CudaTest::~CudaTest(void) { } __global__ void sum_kernel(int a, int b, int *c) { int tid = blockIdx.x * blockDim.x + threadIdx.x; c[tid] = a + b; } int CudaTest::sum_cuda(int a, int b, int *c) { int *f; cudaMalloc((void**)&f, sizeof(int)* 1); cudaMemcpy(f, c, sizeof(int)* 1, cudaMemcpyHostToDevice); sum_kernel << <1, 1 >> >(a, b, f); cudaMemcpy(c, f, sizeof(int)* 1, cudaMemcpyDeviceToHost); cudaFree(f); return true; }
- CudaTest.cpp
#include <stdio.h> #include "CudaTest.cuh" int sum_int(int a, int b) { return a + b; } int main() { int a = 3, b = 4, c = 0, cu = 0; c = sum_int(a, b); CudaTest gpuacc; gpuacc.sum_cuda(a, b, &cu); printf("CPU Result : %d\n", c); printf("GPU Result : %d\n", cu); return 0; }
'Windows > CUDA' 카테고리의 다른 글
[CUDA] 수식어 (0) | 2018.05.23 |
---|---|
[CUDA] Visual Studio 2010 / Visual Studio 2013 기반 OpenCV + CUDA Build (0) | 2018.05.21 |