CUDA学习笔记一

使用VS2013编译CUDA程序时,可能会遇到以下问题:

1、error MSB3721: "D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env --cl-version 2013 -ccbin "D:\Program Files\Microsoft Visual Studio 12.0\VC\bin\x86_amd64"  -I"D:\Program Files\NVIDIA Corporation\CUDA Samples\v7.0\common\inc" -I"D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0\include" -I"D:\Program Files\NVIDIA Corporation\CUDA Samples\v7.0\common\inc" -I"D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0\include"  -G   --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -DWIN32 -DWIN32 -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o x64\Debug\kernel.cu.obj "C:\Users\MaoHeng_Lab\documents\visual studio 2013\Projects\CudaTest\CudaTest\kernel.cu"”已退出,返回代码为 2。

出现该问题的主要原因是:程序中有语法错误,只要修改掉所有的语法错误,就可以成功编译。

2、error MSB3721: "D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env --cl-version 2013 -ccbin "D:\Program Files\Microsoft Visual Studio 12.0\VC\bin\x86_amd64"  -I"D:\Program Files\NVIDIA Corporation\CUDA Samples\v7.0\common\inc" -I"D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0\include" -I"D:\Program Files\NVIDIA Corporation\CUDA Samples\v7.0\common\inc" -I"D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0\include"  -G   --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -DWIN32 -DWIN32 -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o x64\Debug\kernel.cu.obj "C:\Users\MaoHeng_Lab\documents\visual studio 2013\Projects\CudaTest\CudaTest\kernel.cu"”已退出,返回代码为 4。

对于这个问题我之前调试了很长时间,因为我程序中使用到了CUDA Sample提供的OpenGL,结果编译时总是出现关于GL.h,GLU.h中出现错误,其中GL.h,GLU.h是Windows系统SDK自带文件。可能原因有:

(1)VS是否include这些文件;

(2)检查是否因为x86,x64的编译环境不同引起的;

(3)很可能因为CUDA自带的OpenGL与系统中的GL.h,GLU.h的版本不匹配;

(4)VS中CUDA配置是否合理(VS中属性页面中的配置)

(1)、(2)很好核查,对于(3)可能需要下载OpenGL的库再测试。下载GLUT(https://www.opengl.org/resources/libraries/),之后再下载GLEW(http://glew.sourceforge.net/)。最后问题问题是在VS中CUDA配置存在问题。以下是修改之后的配置:

其中,IncludePath是VS自定义的变量,几乎包含了系统中所有的头文件。一般可直接按照VS自定义的值。

CUDA_PATH_V7_0是自定义环境变量,指向D:\Program Files\NVIDIA GPU Computing\Toolkit\CUDA\v7.0,即安装完CUDA后ToolKit的目录。NVCUDASAMPLES7_0_ROOT为D:\Program Files\NVIDIA Corporation\CUDA Samples\v7.0,即安装完CUDA后Samples的目录。

最关键的是设置CUDA C++,在这里设置include和lib。

一定要注意要这是合适的Code Generation,我的显卡是GTX970,支持CUDA5.2,所以在这里我设为compute_52,sm_52。如果支持2.0,则可设置为compute_20,sm_20。当然也可以设置多个,中间使用分号(;)分隔。

在链接处设置lib所在目录,其中看到的CudaToolkitLibDir是CUDA安装完VS工具包后自定义的,可以点该选项,弹出编辑,选择宏可以查看,如下所示:

之后写入lib:

如果选择静态使用cuda运行时库,填写cudart_static.lib,否则选择动态使用cuda运行时库,填写cudart.lib。因为使用了OpenGL,则需要OpenGL的库:freeglut.lib,glew64.lib。

之后,cuda程序可以编译通过,能够正常运行。

时间: 2024-10-06 14:55:52

CUDA学习笔记一的相关文章

CUDA学习笔记(二)【转】

来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一下. 作为例子,我参考了书本上的矩阵相乘的例子,这样开始写代码,然后很自然地出现了各种问题. 以下的内容供大家学习参考,有问题可以留言与我反馈. 开始学着使用 CUDA,实现一个矩阵乘法运算. 首先我们要定义一个矩阵的结构体,话说CUDA是否支持结构体作为设备端的函数的参数呢? 不妨都一股脑试验一下

CUDA学习笔记(三)

近期对CUDA的理解,是对库的利用. 1 nvcc.exe是CUDA C编译器. 2 cudart.dll是CUDA运行时API动态链接库. 3 在Sdk目录下,\lib有CUTIL.CUDPP等函数库的库文件 4 cutil中的函数以cut__为前缀 5 如果要将SDK中的代码直接用于其他工程中,一定要注意将带有_kernel后缀的.cu文件排除在编译外,避免重复定义.

CUDA学习笔记(五)

终于实质分析线程的内容了:按照SIMD的方式,每32个线程称为一个线程束,这些线程都执行同一指令,且每个线程都使用私有寄存器进行这一操作请求. 忽然觉得,做CUDA的程序就像是去北京上班:写MPI之后,还要看Pthread,再转换去上英语课写一堆作业,又要看看jquery有时写个页面难免用到:而去北京,早上坐公交赶到车站,进站等车上车休息,下车跑到地铁再倒车.这就是CUDA.写CUDA就是具备折腾的能力,一会儿学术,一会儿技术.

CUDA学习笔记二

简单的向量加 /** * Vector addition: C = A + B. * * This sample is a very basic sample that implements element by element * vector addition. It is the same as the sample illustrating Chapter 2 * of the programming guide with some additions like error checki

CUDA学习笔记(一)【转】

CUDA编程中,习惯称CPU为Host,GPU为Device.编程中最开始接触的东西恐怕是并行架构,诸如Grid.Block的区别会让人一头雾水,我所看的书上所讲述的内容比较抽象,对这些概念的内容没有细讲,于是在这里作一个整理. Grid.Block和Thread的关系 Thread  :并行运算的基本单位(轻量级的线程)Block   :由相互合作的一组线程组成.一个block中的thread可以彼此同步,快速交换数据,最多可以同时512个线程.Grid     :一组Block,有共享全局内

CUDA学习之一:二维矩阵加法

今天忙活了3个小时,竟然被一个苦恼的CUDA小例程给困住了,本来是参照Rachal zhang大神的CUDA学习笔记来一个模仿,结果却自己给自己糊里糊涂,最后还是弄明白了一些. RZ大神对CUDA关于kernel,memory的介绍还是蛮清楚,看完决定写一个二维数组的加法.如果是C++里的加法,那就简单了,用C[i][j] = A[i][j] +B[i][j]就可以. 1 void CppMatAdd(int A[M][N],int B[M][N],int C[M][N]){ 2 for(int

ufldl学习笔记与编程作业:Vectorization(向量化/矢量化)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/Vectorization/ 什么是向量化?怎么样向量化? 简单

nBodyCS<I>学习笔记之计算着色器

nBodyCS<I>学习笔记之计算着色器 Nvidia-SDK(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. DirectX一直是Windows上图形和游戏开发的核心技术.DirectX提供了一种在显卡上运行的程序--着色器(Shader).从DirectX11开始,DirectX增加了一种计算着色器(Compute Shader),它是专门为与图形无关的通用计算设计的.因此DirectX就变成了一个通用GPU计算的平台.鉴于GPU拥有极其强大的并行运算能力,学习使用Direct

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main