프로그래밍/GPU Computing(CUDA)

CUDA 설치 방법 (Windows 10, Visual Studio 2015, CUDA 8.0)

내꿈은자동화 2016. 12. 9. 11:03

프로그램 설치시 복원지점을 생성하길 바란다.


CUDA 8.0 에서 변화된 것은 블로그 내 다른 글에 있으며 링크를 참조하길 바란다.


글을 퍼가시거나 내용을 참고하실 때 출처를 남겨주세요.

생각보다 설치과정 포스팅하는게 힘드네요.


이 글에서는 C++에 CUDA를 사용하는 방법에 대해 알아볼 것이다.


글의 순서는 다음과 같다.

1. Visual Studio 설치 (확인)

2. CUDA 8.0 설치

3. 환경 변수 확인

4. Visual Studio 내 CUDA 환경 조성

5. CUDA 함수 사용 확인


1. Visual Studio 설치

Visual Studio 에 대한 설명이 필요하다면 블로그 내 통합개발환경에 대한 글(링크)를 참고하길 바란다.


2. CUDA 8.0 설치

CUDA 8.0 설치파일은 를 참고해서 다운받길 바란다.

설치 순서는 Visual Studio -> CUDA 순으로 해야한다. (아래 그림 1. 을 참고하면 Visual Studio 가 설치되어 있을 경우 해당 버전에 맞게 NSight 또한 설치되기 때문이다.)
(NSight 는 CUDA 디버깅 툴이다.)

<그림 1> CUDA 설치 방법


지금까지 Visual Studio 설치 후 CUDA 를 설치 완료하였다.


3. 환경 변수 확인 (환경 변수에 대한 자세한 설명은 링크를 참고하길 바란다.)

지금부터 Visual Studio 내부에 CUDA 를 사용할 수 있는 환경을 조성해 주어야 한다.

<그림 2> CUDA 환경 변수 설정 (그림 왼쪽에서 오른쪽으로 진행)


CUDA 를 설치하면 환경 변수가 자동으로 등록된다.

(여러 버전을 중복해서 설치할 경우 최근에 설치한 버전이 CUDA_PATH 로 등록되며 각각의 버전은 CUDA_PATH_V8_0 와 같은 형태로 등록된다.)


4. Visual Studio 내 CUDA 환경 조성

Visual Studio 내 CUDA 환경을 조성하기 위하여 다음 6가지를 해주어야 한다.

4.1. 프로젝트 빌드 종속성에서 CUDA 등록

4.2. 텍스트 편집기에서 cu/cuh 확장자 등록

4.3. 프로젝트 속성 내 구성 속성의 c/c++, 링커에서 디렉터리 추가

4.4. 프로젝트 속성 내 구성 속성의 링커에 추가 라이브러리 등록

4.5. cu 파일 생성 및 속성 변경

4.6. cu/cuh 파일에 특정 문구 적어서 C++에 객체로 사용하게 하기


4.1. 프로젝트 빌드 종속성에서 CUDA 등록

<그림 3> 빌드 종속성 설정 - 1


프로젝트 우클릭 -> 빌드 종속성 -> 사용자 지정 빌드 클릭

<그림 4> 빌드 종속성 설정 - 2

이후 CUDA 8.0 체크 후 확인 클릭


여기까지 하면 빌드 종속성에 CUDA 를 등록하였다.


4.2. 텍스트 편집기에서 cu/cuh 확장자 등록

<그림 5> cu/cuh 확장자 등록 - 1

상단 메뉴 바의 도구 -> 옵션 을 클릭한다.

<그림 6> cu/cuh 확장자 등록 - 2


이후 활성화 되는 창에서 좌측 텍스트 편집기에서 파일 확장명을 선택한 후 오른쪽 확장명에 cu/cuh 를 추가한다. (편집기는 Microsoft Visual C++ 로 해주어야 한다. 이 블로그에서 사용할 것이 C++과 CUDA이기 때문)


4.3. 프로젝트 속성 내 구성 속성의 c/c++, 링커에서 디렉터리 추가

<그림 7> 프로젝트 속성 내 C/C++ 추가 포함(Include) 디렉터리 설정


프로젝트 우클릭 -> 속성 -> 구성 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리 내 $(CUDA_PATH)\include 입력 (환경 변수)


(플랫폼에 x64를 사용하는 이유는 블로그에서 소개하게 될 cufft, cublas library 는 64bit 환경에서만 사용가능하기 때문이다.)


<그림 8> 프로젝트 속성 내 링커 추가 라이브러리(Library) 디렉터리 설정


<그림 8> 은 <그림 7> 의 것과 비슷한 방법으로 등록한다.

프로젝트 우클릭 -> 속성 -> 구성 속성 -> 링커 -> 일반 -> 추가 라이브러리 디렉터리 내 $(CUDA_PATH)\lib\x64 입력 (환경 변수)


4.4. 프로젝트 속성 내 구성 속성의 링커에 추가 라이브러리 등록

<그림 9> 프로젝트 속성 내 링커 입력 추가 종속성 설정


링커에 등록한 라이브러리 내에서 프로젝트에서 사용될 라이브러리를 등록해주는 것이다.

블로그 내에서는 cuda.lib, cudart.lib, cublas.lib, cufft.lib 를 사용할 것이다.


4.5. cu 파일 생성 및 속성 변경

<그림 10> cu/cuh 파일 생성


cu/cuh 파일은 각각 C++에서의 cpp/h 파일에 해당한다. 그렇기 때문에 <그림 10> 에서와 같이 각각 소스파일/헤더파일에 등록한다.

<그림 11> cu 파일 설정 변경 - 1


<그림 12> cu 파일 설정 변경 - 2 (그림의 Win32 -> x64)


<그림 11> 에서와 같이 cu 파일을 우클릭하여 속성에 들어간 다음 <그림 12> 에서와 같이 구성 속성 -> 일반 -> 항목 형식을' CUDA C/C++' 로 설정해준다. (이전 버전에서는 따로 등록을 해줬어야 했는데 visual studio 2015 + CUDA 8.0 조합에서는 자동으로 설정되어 있다.)


<그림 13> cuh 파일 설정 변경 (그림의 Win32 -> x64)


cuh 파일도 cu 파일과 마찬가지로 들어가서 항목 형식을 '사용자 지정 빌드 도구'로 바꿔준다.


4.6. cu/cuh 파일에 특정 문구 적어서 C++에 객체로 사용하게 하기


사실 이 글에서는 이 부분이 가장 중요할 것이다. CUDA 함수를 C++에서 사용하기 위해서는 cu 파일에 C++ 로 사용할 수 있게 해주는 과정이 필요하다.


CGPUACC.cu 파일 내에는 아래와 같이 써준다.


#include "CGPUACC.cuh"

#include "cuda.h"

#include <iostream>

#include <cufft.h>

#include "cublas_v2.h"

#include <stdio.h>

#include <stdlib.h>



CGPUACC::CGPUACC(void)

{


}


CGPUACC::~CGPUACC(void)

{

}


CGPUACC.cuh 파일 내에는 아래와 같이 써준다.


#pragma once

#include <cuda_runtime.h>


#ifdef __cplusplus 

extern "C" {//<-- extern 시작

#endif


class CGPUACC

{

public:

CGPUACC(void);

virtual ~CGPUACC(void);

};


#ifdef __cplusplus 

}

#endif


위 과정을 거치면 C++에서 CUDA 함수를 객체처럼 사용가능하다.


여기까지 진행하면 Visual Studio 내 CUDA 환경 조성을 완료한 것이다.



5. CUDA 함수 사용 확인

CUDA 함수가 제대로 작동하는지 알아보기 위해 C++ 함수로의 덧셈, CUDA를 이용한 덧셈을 각각 해본다.


<그림 14> 덧셈 연산을 위한 main 파일

<그림 15> 덧셈 연산을 위한 cu 파일


<그림 16> 덧셈 연산을 위한 cuh 파일


덧셈 연산을 하기 위해 cu 파일에서 객체를 선언한 후 main.cpp 파일로 가져와 사용하였다.

결과적으로 GPU 에서의 덧셈과 CPU 에서의 덧셈 결과가 같은 것(<그림 17>)을 통해 GPU 에서 연산이 잘 됨을 알 수 있다.

여기서 Call by Value/Call by Reference, CUDA 내 메모리 이동, Grid/Block/Thread 에 대한 개념 없이 코드를 작성하였고 이러한 개념에 대해서는 앞으로 설명해 나갈 것이다.


<그림 17> CPU 와 GPU 에서의 덧셈 연산 결과


이번 글에서는 Visual Studio 내 CUDA 설치를 하고 작업 환경을 만든 후 제대로 실행되는지 확인까지 해보았다.




이 글이 CUDA 설치에 어려움을 겪는 사람들에게 도움이 되길 바란다.




감수. RAego



<참고 문헌>


<그림>