前提需要有NVIDIA的显卡驱动,以及安装dir11.0。
首先需要准备cuda_9.0.176_windows.exe,这是我在官网上下载的最新版本,此版本将cuda SDK也封装进入了安装程序。
第一步:安装程序
重点是安装设置的选择时记得选自定义安装(不要使用默认安装),之后全选所有安装子项目。在选择安装位置界面:有CUDA TOOKKIT,CUDA SAMPLES,CUDA Documentation这三个安装路径选择,个人推荐使用默认的安装路径。之后一直安装,不出问题,能直接安装成功。
第二步:配置环境变量及拓展
正确安装成CUDA之后,在系统变量下会自动生成两个变量,分别是CUDA_PATH和CUDA_PATH_V9_0,然后需要对系统变量进行一些拓展,一下是变量名和变量值:
CUDA_LIB_PATH %CUDA_PATH%\lib\Win32
CUDA_BIN_PATH %CUDA_PATH%\bin
CUDA_SDK_PATH C:\ProgramData\NVIDIA Corporation\CUDASamples\v9.0
CUDA_SDK_BIN_PATH %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH %CUDA_SDK_PATH%\common\lib\x64
注意ProgramData是隐藏文件,可能你在指定位置开不到这个文件,设置一下显示隐藏文件即可看到,拓展完成之后重启计算机使变量生效。
第三步:建立VS2012下的cuda程序
1.创建工程的步骤和创建普通工程的步骤是一样的。最好建一个空项目,然后在这个空项目上配置CUDA环境。
2.源文件中创建CUDAC/C++ File
3.之后,右键项目名称,选择生成自定义,选中CUDA9.0自定义项文件,确定。
4.之后,右键工程名,选择属性,在配置属性界面>>C++目录
添加两个包含目录:
C:\ProgramFile\NVIDIA GPU ComputingToolkit\CUDA\v9.0\include
C:\ProgramData\NVIDIACorporation\CUDASamples\v9.0\common\inc
添加两个lib目录:
C:\ProgramFile\NVIDIA GPU ComputingToolkit\CUDA\v9.0\lib\x64
C:\ProgramData\NVIDIACorporation\CUDASamples\v9.0\common\lib\x64
然后到>>连接器下面,常规,附加库目录,添加以下目录:
$(CUDA_PATH_V9_)\lib\$(Platform)
连接器>>输入>>附加依赖项,添加以下库:
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
第四步:在配置管理器中将使用平台修改为64位
第五步:修改源文件属性
源文件中的.cu文件,选择属性,配置属性,常规,项类型选择CUDAC/C++,然后点击应用,确定,关闭属性页窗口。(注意:如果这个没有修改,VS2012会找不到函数入口,会报错:无法解析的外部符号main,该符号在函数__tmainCRTStartup中被引用)
注:只有先完成第三步的第3项,才能在项类型中找到CUDA C/C++的选项
第六步:测试搭建的CUDA环境
接下来就可以编写测试程序,对搭建的环境进行测试,给出以下两个测试代码:
#include <stdio.h>
#include <iostream>
//For the CUDA runtime routines (prefixed with "cuda_")
#include <cuda_runtime.h>
__global__ void Add(int a ,int b,int *c)
{
*c = a+b;
}
int main()
{
int c;
int *devc;
cudaError_t err = cudaSuccess;
err =cudaMalloc((void **)&devc,sizeof(int));
if (err != cudaSuccess)
{
fprintf(stderr, "Failed toallocate device vector A (error code %s)!\n",cudaGetErrorString(err));
exit(EXIT_FAILURE);
}
Add<<<1,1>>>(2,7,devc);
err =cudaMemcpy(&c,devc,sizeof(int),cudaMemcpyDeviceToHost);
if (err != cudaSuccess)
{
fprintf(stderr, "Failed toallocate device vector A (error code %s)!\n",cudaGetErrorString(err));
exit(EXIT_FAILURE);
}
printf("2+7=%d\n",c);
cudaFree(devc);
system("pause");
return 0;
}
第二个测试代码:
#include<stdio.h>
boolInitCUDA()
{
int count;
cudaGetDeviceCount(&count);
if(count == 0)
{
fprintf(stderr, "There is nodevice.\n");
return false;
}
int i;
for(i = 0; i < count; i++)
{
cudaDeviceProp prop;
if(cudaGetDeviceProperties(&prop,i) == cudaSuccess)
{
if(prop.major >= 1)
{
break;
}
}
}
if(i == count)
{
fprintf(stderr, "There is nodevice supporting CUDA 1.x.\n");
return false;
}
cudaSetDevice(i);
return true;
}
int main()
{
if(!InitCUDA())
{
return 0;
}
printf("HelloWorld, CUDA has beeninitialized.\n");
return 0;
}
编译运行,能够成功生成解决方案,运行出结果,就可以说明我们配置的CUDA环境是没有问题的。
接着就可以这个基础上进行其他的环境配置(例如配置FFmpeg和SDL环境等)。配置FFmpeg和SDL环境在这里就不详述了,配置完之后可以进行一些基础测试,例如通过avcodec_find_decoder_by_name()函数来查找FFmpeg中是否有硬解码相关的解码器,这需要在两个环境中测试,一个是配置过CUDA环境的,一个是没有配置CUDA环境的,通过测试可以知道,只有在配置完CUDA开发环境才能通过相应函数查找到cuvid硬解码器。接着编写一个解码器,就可以进行一些简单的CUDA硬解码实验。