1. 다운로드 & 설치
CUDA 6.0 으로 설치해봅니다.
Unified Memory 를 사용할 수 있습니다.
CUDA 사용을 위해서 메모리 복사 코드를 사용하지 않아도 됩니다.
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 |
댓글