几年前一直叫嚣着要学习CUDA,却从未开始过,那么就从今天起步。自己对CUDA并行编程的原理似有了解,却从未真正跑过CUDA程序。CUDA编程第一步首先从VS2010+CUDA5.5的配置环境走起。学走路当然少不了前人的搀扶。
1)从NV官网下载、安装CUDA Toolkit 5.5 :
默认安装路径:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5
C:\ProgramData\NVIDIA Corporation\CUDASamples\v5.5
2)环境变量设置:
Toolkit安装完后会有两个自动默认的环境变量:
CUDA_PATH =C:\ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v5.5
CUDA_PATH_V5_5 = C:\ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v5.5
为了运行SDK中的示例,还需额外在系统环境变量PATH中添加:
; C:\ProgramData\NVIDIACorporation\CUDA Samples\v5.5\common\lib\Win32
;C:\Program Files\NVIDIA GPUComputing Toolkit\CUDA\v5.5\bin
;C:\ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v5.5\lib\Win32
;C:\ProgramData\NVIDIACorporation\CUDA Samples\v5.5\common
3)测试CUDA安装成功与否:
运行deviceQuery.exe,bandwidthTest.exe,particles.exe等示例,存放路径:C:\ProgramData\NVIDIACorporation\CUDA Samples\v5.5\Bin\win32\Release
4)利用VS向导创建CUDA工程(推荐):
打开VS-新建项目-NVDIA-CUDA5.5,输入项目名称,自动创建一个包含kernel.cu的示例代码,通常可以直接编译运行成功。如果失败,解决方法请参考xingoo博文“手把手教你cuda5.5与VS2010的编译环境搭建”
5)创建VC工程,手动配置CUDA环境(稍微复杂不推荐,参考xingoo博文“手把手教你cuda5.5与VS2010的编译环境搭建”):
5.1启动vs2010,创建空的win32控制台程序;
5.2右键源文件夹-新建项-选择cuda c/c++-新建test.cu文件;
5.3右键工程-生成自定义-选择cuda生成
5.4右键test.cu-属性-常规-项类型-选择cuda c/c++编译器
5.5右键工程-属性-连接器-常规-附加库目录:C:\Program Files\NVIDIA GPUComputing Toolkit\CUDA\v5.5\lib\Win32;
输入:cudart.lib;
5.6在工具-选项-文本编辑器-文件扩展名-添加cu \cuh两个文件扩展名
5.7测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#define DATA_SIZE 1024
#define checkCudaErrors(err) __checkCudaErrors (err, __FILE__, __LINE__)
#define getLastCudaError(msg) __getLastCudaError (msg, __FILE__, __LINE__)
int data[DATA_SIZE];
// These are CUDA Helper functions
// This will output the proper CUDA error strings in the event that a CUDA host call returns an error
inline void __checkCudaErrors(cudaError err, const char *file, const int line )
{
if(cudaSuccess != err)
{
fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n",file, line, (int)err, cudaGetErrorString( err ) );
return ;
}
}
// This will output the proper error string when calling cudaGetLastError
inline void __getLastCudaError(const char *errorMessage, const char *file, const int line )
{
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err)
{
fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n",
file, line, errorMessage, (int)err, cudaGetErrorString( err ) );
return ;
}
}
// end of CUDA Helper Functions
__global__ static void sumOfSquares(int *num, int * result){
int sum=0;
int i;
for(i=0;i<DATA_SIZE;i++) {
sum += num[i]*num[i];
}
*result = sum;
}
void GenerateNumbers(int *number, int size){
for(int i = 0; i < size; i++) {
number[i] = rand() % 10;
printf("number[%d] is %d\n",i,number[i]);
}}
int main(){
cudaSetDevice(0);
cudaDeviceSynchronize();
cudaThreadSynchronize();
GenerateNumbers(data, DATA_SIZE);
int * gpudata, * result;
int sum;
checkCudaErrors( cudaMalloc((void**) &gpudata, sizeof(int)*DATA_SIZE));
checkCudaErrors(cudaMalloc((void**) &result, sizeof(int)));
checkCudaErrors(cudaMemcpy(gpudata, data, sizeof(int)*DATA_SIZE,cudaMemcpyHostToDevice));
sumOfSquares<<<1, 1, 0>>>(gpudata, result);
checkCudaErrors(cudaMemcpy(&sum, result, sizeof(int), cudaMemcpyDeviceToHost));
cudaFree(gpudata);
cudaFree(result);
printf("-----------sum: %d\n",sum);
sum = 0;
for(int i = 0; i < DATA_SIZE; i++) {
sum += data[i] * data[i];
}
printf("sum (CPU): %d\n", sum);
getchar();
return 0;
}
6)利用Visual Assist X实现CUDA文件(.cu, .cuh)的高亮显示和代码提示(参考随风秀舞博文“VS2010中配置CUDA5.0”:):
6.1在Visual Studio 2010的菜单里依次选择:
“ VAssistX|Visual assistX Options|Projects|C/C++Directories”,在该界面的“Platform”下拉框中选择Custom,在“ShowDirectories for”下拉框中选择Other include files,然后在下面的输入框里,新建、添加如下路径,如图:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.5\common\inc
6.2修改注册表:使用Win+R组合键打开“运行”窗口,键入regedit命令(registeredit的缩写)打开注册表,找到如下位置:HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist X\VANet10。在右边找到ExtSource项目,鼠标右键选修改,在原有文字后添加如下文字:.cu;.cuh;确定后关闭注册表。重新打开Visual Studio 2010,Visual Assist X便开始支持.cu及.cuh文件的语法高亮及代码完成。
Ok,至此,我可以编译运行别人的CUDA代码了。接下来就是学习CUDA语法,尝试修改现有代码实现特定算法应用了。