Windows/CUDA

[CUDA] 프로젝트 작성 및 기본 구조

Ohjeonghak 2018. 5. 21. 17:58
반응형

[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