본문 바로가기
Programming/C#

[CUDA] CUDA 사용해보기

by NAMP 2014. 4. 7.
CUDA 사용하기.



1. 다운로드 & 설치


CUDA 6.0 으로 설치해봅니다. 


Unified Memory 를 사용할 수 있습니다. 

CUDA 사용을 위해서 메모리 복사 코드를 사용하지 않아도 됩니다.




해당 시스템에 맞는 툴킷을 다운로드 합니다. 

설치는 기본설정으로 진행하면 됩니다. 


2. Visual Studio 설정

VS 2010 을 사용중입니다. 


프로젝트에서 우클릭 메뉴 중에서 [Build Cutomizations]를 선택합니다. 


CUDA 6.0(.targets, .props) 앞에 체크박스를 선택합니다. 


[확장자 등록]


Tools > Options 를 선택합니다. 


Text Editor > File Extension 을 선택합니다. 

cu, cuh 확장자를 추가합니다. 


프로젝트 속성 페이지 > Linker > Input 페이지 에서

cudart.lib 를 추가합니다. 


[CUDA 작성하기]



.h, .cu 파일을 생성합니다. 


.cu 파일 속성에서, 

Item Type 을 CUDA C/C++ 로 선택합니다. 



Header 파일을 작성합니다.

#include <cuda.h>
#include <builtin_types.h>
#include <cuda_runtime_api.h>
#include <cuda_d3d9_interop.h>
 
<중략>

__global__ void DoClosestLineKernel( Lines* pLines,  int lineCount, GeoPoint* pGeo, int pointCount);
__device__ bool IsPermitArea( double x, double y, Lines* pLines, double permitDistance );
__device__ double getDistance( double x, double y, double x1, double y1, double x2, double y2 );

class CCUDAKernel
{
public:
            CCUDAKernel( void);
             virtual ~CCUDAKernel(void );

public:
             void GetClosestLine( Lines* pLines,  int lineCount, GeoPoint* pGeo, int pointCount) ;
};


다른 클래스에서 -> CCUDAKernel 의 GetClosestLine 을 호출하면 CUDA 사용을 위해서 DoClosestLineKernel 함수를 호출하는 방식으로 작성하였습니다. 



.cu 파일을 작성합니다. 

#include "CUDAKernel.h"

__global__ void DoClosestLineKernel( Lines* pLines,  int lineCount, GeoPoint* pGeo, int pointCount)
{
             int i = blockDim.x * blockIdx.x + threadIdx.x;

             if (i < pointCount)
            {
               < 중략 >
               }
}

CCUDAKernel::CCUDAKernel( void)
{
}

CCUDAKernel::~CCUDAKernel( void)
{
}


void CCUDAKernel::GetClosestLine( Lines* pLines,  int lineCount, GeoPoint* pGeoPoint, int pointCount)
{
               < 중략 >

             // Allocate vectors in device memory
            cudaMalloc(( void**)&d_GeoPoints, geoPointsSize);
            cudaMemcpy(d_GeoPoints, pGeoPoint, geoPointsSize, cudaMemcpyHostToDevice);
            DoClosestLineKernel<<<blocksPerGrid, threadsPerBlock>>>(d_Lines, copyCount, d_GeoPoints, N);
            cudaMemcpy(pGeoPoint, d_GeoPoints, geoPointsSize, cudaMemcpyDeviceToHost);
            cudaFree(d_GeoPoints);

             return;

}


작성해야 할 코드는 아래와 같습니다. Unified Memory를 사용하지 않았습니다. 

1. 메모리 할당
2. 메모리 복사    ( SRC → DEST )
3. CUDA 호출
4. 메모리 복사    ( DEST → SRC)
5. 메모리 해제 


GPU 메모리의 크기의 한계로 인해, 큰 메모리를 사용해야 하는 경우는 분할해서, 반복문으로 처리해야 합니다. 



'Programming > C#' 카테고리의 다른 글

C# LINQ GROUP BY  (0) 2015.04.08
C# delegate  (0) 2014.05.22
[MFC] 리스트 컨트롤 컬럼 헤더 텍스트 얻기  (0) 2013.07.01
[MFC] 리스트컨트롤 데이터를 엑셀로 저장하기  (2) 2013.07.01
[MFC] 디버깅용 메시지 출력  (0) 2013.06.30

댓글