CUDA 설치 방법 (Windows 10, Visual Studio 2015, CUDA 8.0)
프로그램 설치시 복원지점을 생성하길 바란다.
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
<참고 문헌>
<그림>