< How to integrate CUDA and C++ >
(CUDA와 C++와 함께 사용 해야 하는데 구글 찾다가 지친 사람들 참조용)
퍼갈땐 참조 링크를 넣어주시거나 제가 정리했다는 언급 정도 해주시면 감사하겠습니다. 본 글은 다른 사람들의 낭비되는 시간을 줄여주는 용도와 더불어 제가 까먹었을때 다시 참고하는 용도로 정리했습니다.
본 글은 Window OS에서 CUDA를 C++ (cpp) 와 연개해서 사용하는 것을 가정함. 리눅스는 고려 안함.
1. CUDA toolkit을 포함한 관련 소프트웨어를 우선 엔비디아에서 받아서 설치한다.
2. visual studio를 켠다.
3. 엔비디아에서 CUDA를 받을때 함께 받은 sample들을 보면 확장자가 .cu 뭐 이런 형태로 되어있고, 아이콘은 그냥 하얀색이다. 즉, 연계된 프로그램이 없다는 뜻이므로 visual studio에서 추가해 준다.
메뉴에서 도구-옵션-텍스트편집기-파일확장명
4. cpp 파일을 하나 만든다.
5. 사용자 지정 빌드로 들어가서 목록에 있는 CUDA를 체크한 뒤 확인.(본인은 CUDA 7.5 버전을 사용)
체크를 한뒤, 소스파일내 .cu파일에서 우클릭 속성-일반-항목형식에 가면 CUDA C/C++ 항목이 생기는데 그 항목으로 적용한 후 확인.
6. 속성에서 VC++ 디렉터리의 포함 디렉터리에 $(CUDA_INC_PATH) 를 추가
7. 다시 속성에 링크로 가서 추가 라이브러리 디렉터리에 아래 표시한 상속값 $(CUDA_PATH)어쩌구 추가
8. 속성의 링커-입력-추가종속성에서 cuda.lib 와 cudart.lib를 추가한다.
9. CUDA 설치로 인해서 구성에 목록이 생겼을텐데 CUDA C/C++로 들어가서 target machine platform에서 64 bit로 맞춰준다.
10. 새로운 .cu 파일을 만든다.
11. 이제 .cu에서 작성한 파일을 main이 있는 .cpp에 연결 시켜서 main.cpp에서 계산이 필요한 부분만 CUDA가 돌아가도록한다.
main.cpp <- -> myCuda.cu 라고 가정하자.
----------------------------------------------------------
main.cpp 부분
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
extern "C" void myCuda(int*, int*, int*);
main()
{
.....
myCuda(a,b,c);
.....
}
----------------------------------------------------------
myCuda.cu 부분
#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <stdio.h>
#define nBlock (4)
#define nThread (4)
extern "C" void myCuda(int* a, int* b, int* c);
__global__ void add(int *a, int *b, int *c);
void myCuda(int* a, int* b, int* c)
{
선언부 ....
cudaMalloc(); ....
cudaMemcpy(); ....
add<<< nBlock, nThread >>>(); ....
cudaMemcpy(); // 계산값을 device에서 host로 불러옴.
cudaFree(); // clear
}
__global__ void add(int*a, int*b, int*c)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
....
}
----------------------------------------------------------
cu 파일과 cpp 파일간 연계되는 부분을 서로 extern으로 붙여 주면된다. 그리고 많다면 header 만들어서 따로 모아두면 될것이다.
cu 파일 내부에서 kernel을 형성하고 host와 device를 오가는 것과 __global__, __device__ 같은 내용들은 CUDA관련 책을 참고하기 바란다.
위의 내용을 따라하면 CUDA가 돌아가는 cu 파일부분과 우리가 작성하는 메인이 있는 cpp 부분을 함께 사용하면서 진행이 가능할 것이다.