CUDA 프로그래밍 : 첫 번째 CUDA 프로그램

 

 

# 환경 준비

설치된 CUDA, Windows에서 VS2013.

새 파일 "test.cu"를 추가, 빈 콘솔 응용 프로그램을 만듭니다.

## 구성 헤더 및 라이브러리 파일 디렉토리

```

C : \ 프로그램 파일 \ NVIDIA GPU 컴퓨팅 툴킷 \ CUDA \ v9.0을의 \ 포함

C : \ 프로그램 파일 \ NVIDIA GPU 컴퓨팅 툴킷 \ CUDA \ v9.0을 \ LIB \ 64

```

```

cublas.lib
cublas_device.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cufft.lib
cufftw.lib
curand.lib
cusolver.lib
cusparse.lib
nppc.lib
nppial.lib
nppicc.lib
nppicom.lib
nppidei.lib
nppif. LIB
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvcuvid.lib
nvgraph.lib
nvml.lib
nvrtc.lib
OpenCL.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32 lib 디렉토리
advapi32.lib
shell32.lib
해당 Ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib

```

## 구성 항목의 속성, 파일 속성

 

# 첫 번째 CUDA 프로그램

```

사용법 #include "cuda_runtime.h"
사용법 #include "device_launch_parameters.h"


사용법 #include "stdio.h에"

 

__global__ 공극 addKernel (INT의 * C를 INT * A, INT의 *의 b)
{
INT I = threadIdx.x;
C [내가] = A [I] + B [I];
}

cudaError_t addWithCuda (INT의 * C를 CONST INT의 *는, CONST의 INT의 * B를 CONST INT의 크기);


INT의 main ()
{
CONST의 INT의 arraysize = 5;
INT CONST A [arraysize] = {1, 2, 3, 4, 5};
CONST의 INT의 B [arraysize] = {10, 20, 30, 40, 50};
INT C [arraysize] = {0};


cudaError_t cudaStatus = addWithCuda(c, a, b, arraysize);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "addWithCuda failed!");
return 1;
}

printf("{ 1, 2, 3, 4, 5 } + { 10, 20, 30, 40, 50} = {%d, %d, %d, %d, %d} \n",
c[0], c[1], c[2], c[3], c[4]);

cudaStatus = cudaThreadExit();
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaThreadExit failed!");
return 1;
}

return 0;
}

cudaError_t addWithCuda(int *c, const int *a, const int *b, const int size)
{
int * dev_a = NULL;
int * dev_b = NULL;
int * dev_c = NULL;

cudaError_t cudaStatus;
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr,"cudaSetDevice failed!");
return cudaStatus;
}

cudaStatus = cudaMalloc((void**)&dev_c, size*sizeof(int));
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMalloc failed");
goto Error;
}

cudaStatus = cudaMalloc((void**)&dev_b, size*sizeof(int));
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMalloc failed");
goto Error;
}

cudaStatus = cudaMalloc((void**)&dev_a, size*sizeof(int));
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMalloc failed");
goto Error;
}

cudaStatus = cudaMemcpy(dev_a,a, size*sizeof(int),cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMemcpy failed");
goto Error;
}

cudaStatus = cudaMemcpy(dev_b,b, size*sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMemcpy failed");
goto Error;
}

addKernel << <1, size >> >(dev_c, dev_a, dev_b);

cudaStatus = cudaThreadSynchronize();
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaThreadSynchronize failed");
goto Error;
}

cudaStatus = cudaMemcpy(c,dev_c,size*sizeof(int),cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess)
{
fprintf(stderr, "cudaMemcpy failed");
goto Error;
}

Error:
cudaFree(dev_c);
cudaFree(dev_b);
cudaFree(dev_a);
return cudaStatus;
}

```

运行:

 

추천

출처www.cnblogs.com/xiaojianliu/p/11129812.html