• [转]CUDA在Windows下的软件开发环境搭建


    引自:http://www.makaidong.com/yaoyuanzhi/archive/2010/11/13/1876215.html

    本文我们以visual studio 2005 为例演示cuda的安装以及软件开发环境搭建,以及cuda与mfc联调的实现。

    1.cuda安装包

    cuda是免费使用的,各种操作系统下的cuda安装包均可以在http://www.nvidia.cn/object/cuda_get_cn.html上免费下载。cuda提供3个安装包,分别是: driver, toolkit和sdk。sdk包括许多例子程序和函数库。toolkit包括cuda的基本工具。安装时按照顺序,先安装driver,再toolkit,最后sdk。

    cuda toolkit

    安装后在nvidia_cuda_toolkit安装目录下出现6个文件夹,分别是:

    bin :     工具程序和动态链接库

    doc :     相关文档

    include : header头文件包

    lib :     程序库

    open64 :  基于open64的cuda compiler

    src :     部分原始代码

    安装过程中toolkit自动设定了3个环境变量:cuda_bin_path、cuda_inc_path和cuda_lib_path分别对应工具程序库、头文件库和程序库,预设路径为当前安装文件夹下的bin、include 和lib三个文件夹。

    cuda sdk

    sdk可以根据需要选择安装(推荐安装,因为sdk中的许多例子程序和函数库非常有用。

    cuda display

    对于没有安装nv显卡的计算机,不需要安装display安装包,程序也可以在模拟模式下运行。

    2.在Visual Studio2005中使用cuda

        cuda的主要工具是nvcc,它会执行所需要的程序,将cuda程序编译并执行。本文将介绍在windows环境下,基于vs 2005ide环境下的几种配置cuda nvcc的方法。

    2.1 nv自带的修改模板方法

        在cuda sdk安装目录下的project目录下新建文件夹,命名为想要建立的工程名字,比如test1。并在project文件夹下找到sdk自带的template文件夹,将template文件夹下所有的文件copy到test1下。

        将copy到test1文件夹下的所有文件文件名中的template改为test(也即是自己的工程文件名字)。test.sln与test.vcproj是vs 8系列的工程文件,test_vc7.sln与test_vc7.vcproj是vs 7系列的工程文件,可以根据自己visual studio的版本选择要更改的工程文件,其它两个可以删除。在visual studio c++ 2005 express中,删除test_vc7.sln与test_vc7.vcproj即可。

    将*.cu、*.sln和*.vcproj用记事本等文字编辑软件其他 打开,使用查找替换功能将以上文件中所有的template改为test。

    使用*.sln文件打开整个工程,可以任意更改代码,编译运行。

    修改输出文件路径(可选,如不改变,可执行文件输出到上两级目录下的bin目录中),如使用了cuda sdk中的动态链接库,将相应的动态链接库拷贝到可执行文件的同一目录下。

        总结:这种方法是nv公司为windows下使用vs编译cuda提供的标准方法(参见sdkdoccuda_sdk_release_notes_windows.txt), 使用公司提供的模板更改为自己想要建立的工

     

    此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

    程,也可以参照以上方法,在sdk project库中的找到与自己想建立工程相近的其它工程做更改。

    2.2 在win32项目中建立.cu文件

        首先建立一个c++的win32的控制台应用程序empty project,并添加一个新的源文件,此处以main.cu为例。

    p1.建立一个win32 project

    设定为empty project

    p3.建立一个cuda程序专用的main.cu文件

    在solution explorer 中main.cu上右键单击,选择property。在打开的对话框中选择general,确定tool的选项是custom build tool。

    确认tool选项为custom build tool。

    选择custom bulid step,在command line中分别设定模式参数。这里要分几种编译方式来设定命令行参数。

    (1)、release 模式:"$(cuda_bin_path) vcc.exe" -ccbin "$(vcinstalldir)bin" -c -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/o2,/zi,/mt -i"$(cuda_inc_path)" -o $(configurationname)$(inputname).obj $(inputfilename)

    (2)、debug 模式:"$(cuda_bin_path) vcc.exe" -ccbin "$(vcinstalldir)bin" -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -o $(configurationname)$(inputname).obj $(inputfilename)

        如果计算机中没有安装nv显卡,使用模拟模式,需增加两个额外的设定。新建两个模式emurelease和emudebug。

    p6.新建模式(1)

    p6.新建模式(2)

            对新建立的emurelease和emudebug的command line分别设定为:

    (1)、emurelease 模式:"$(cuda_bin_path) vcc.exe" -ccbin "$(vcinstalldir)bin" -deviceemu -c -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/o2,/zi,/mt -i"$(cuda_inc_path)" -o $(configurationname)$(inputname).obj $(inputfilename)

    (2)、emudebug 模式:"$(cuda_bin_path) vcc.exe" -ccbin "$(vcinstalldir)bin" -deviceemu -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -o $(configurationname)$(inputname).obj $(inputfilename)

    3.1.4、对所有的设定模式,均在 custom build step 的 outputs 中加入 $(configurationname)$(inputname).obj。

    p7.设定outputs

    右键单击project,选择property,再选择linker,对所有模式修改以下设定:

    (1)、general/enable incremental linking:no

    (2)、general/additional library directories:$(cuda_lib_path)

    (3)、input/additional dependencies:cudart.lib

    p8.设定linker参数(1)

    p9.设定linker参数(2)

    设置头文件路径tools -> options,弹出以下对话框

    将右边的下拉框选择include files,点击添加按钮,将c:program files vidia corporation vidia cuda sdkcommoninc选入到头文件搜索路径中。

    选择链接库文件路径

    同上库头文件路径选择,将右边下拉框选择library file,选择路径c:program filesnvidia corporation vidia cuda sdkcommonlib。

    完成,可以编写cuda程序,并直接编译执行了(编译方式于c++相同)

    总结:这种方法既不需要借助模板,也不需要使用第三方的软件其他 。但是操作相当复杂,而且仅对配置的单个project有效。如果重新建立一个project又要重新配置一遍。

    需要注意的是,当需要使用cuda sdk中的动态链接库(以dll为后缀)时,将动态链接库和生成的可执行文件放在同一个路径下。

    如果是driver api,需要添加”cuda.lib cudart.lib”,头文件#include ,#include。

    2.3 使用cuda_vs_wizard插件

        下载cuda_vs_wizard插件并安装。

        将cuda安装目录下的bin和cuda sdk安装目录下的binwin32文件夹下的四个文件夹(debug, emudebug, release, emurelease)的路径全部加入环境变量中的path变量中。

        使用vc直接建立工程。在工程选项里选择cudawinapp。

      

    如果是在模拟模式下运行,需要在解决方案 中右键属性,在configuration properities 中将configuration 设置为emu模式。

    模拟模式设置(1)

    模拟模式设置(2)。

    总结:这种方法虽然使用了第三方的工具,但只需要配置一次即可,而且配置简单,以后每次建立cuda程序都可以直接生成。如果是建立预定义头文件的工程,则建立的cuda程序,会自带一个sample.cu,可以选择在sample.cu的基础上更改或删除sample.cu重新建立.cu文件。如果是建立空工程则没有。建立方法.cu文件的方法是建立.cpp文件或.txt文件改名为.cu文件即可。推荐使用。

    2.4 语法高亮设置。

    找到cuda sdk安装目录下docsyntax_highlighting自带的文件usertypt.dat,将其copy到microsoft visual studio 安装目录的common7ide下。

    在visual studio中做以下设置: 在tools-> options ->text editor-> file extension中添加cu。编辑方式microsoft visual c++。

      

    p16.设置高亮

    重新启动visual studio,完成高亮设置。

    ??

    3.配置生成规则。将sdk目录下c/common目录下的cuda,rules拷贝到vs安装目录下的vcvcprojectdefaults子目录下。建立一个 win32工程,并在项目上右击,选择custombuildrules,在cuda build rule前打勾。在工程中新建一个.cu文件,右击属性后查看自定义生成规则是否已经是cuda build rule。

    3. cuda在mfc中的联调方法实例

    3.1 sdk中程序的编译

             例如我们的sdk安装路径“c:program files vidia corporation vidia cuda sdkprojectsdevicequery”中可以找到devicequery的工程文件。

             当我们把这个文件夹拷贝到其他目录下时,会出现找不到头文件的错误,如“找不到cutil.h”。为什么会出现这种情况呢?我们注意到在devicequery中对其的引用#include <cutil.h>,是在系统目录下的。这个系统目录在c:program filesnvidia corporation vidia cuda sdkcommoninc中可以找到cutil.h头文件。

             通过查看devicequery.cu的属性,通过观察“命令行”:

    "$(cuda_bin_path) vcc.exe" -ccbin "$(vcinstalldir)bin" -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -i./ -ihttp://www.makaidong.com/common/inc -o $(configurationname)devicequery.obj devicequery.cu

    注意红色下划线部分,带便往上退两个文件夹,然后进入commom文件夹中的inc文件夹。再比较之前的两个路径,这正好是decicequery.sin文件到cutil.h的一个访问的过程。

             当我们将工程文件拷贝到新的目录下时,这样的一个访问方式必然会失效。于是我们需要做如下的一些设置。

    1.  首先我们需要将c:program files vidia corporation vidia cuda sdkinwin32文件目录下的四个文件夹分别添加到环境变量里。

    具体的操作方法是:”我的电脑” ->属性->高级->环境变量path,注意路径都是全路径,每个变量间用“;”分隔。

    2.  注意到这里面的系统变量nvsdkcuda_root为c:program filesnvidia corporation vidia cuda sdk。

    我们在转移了工程文件目录后,只需要将命令行进行修改。即将之前的红线部分作如下修改:

    "$(cuda_bin_path) vcc.exe" -ccbin "$(vcinstalldir)bin" -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -i./ -i"$(nvsdkcuda_root)/common/inc" -o $(configurationname)devicequery.obj devicequery.cu

    3.  此外我们还需要将“项目属性”的“链接器”做对应的修改。然后该程序即可正常编译运行。

    3.2 mfc中应用cuda程序

    本章建立一个mfc工程,然后在该工程中添加对cu文件中cuda程序的调用。本章还可参考sdk中的程序示例cppintegration。

    3.2.1 配置visualstudio环境配置准备工作

    语法高亮:将d:programmingcudasdkdocsyntax_highlightingvisual_studio_8里面的usertype.dat文件copy到microsoft visual studio 8common7ide目录下面(如果已经存在,就追加到原来的后面)。

    设置vs2005环境(因为本程序将不仅仅是在cu文件中使用cuda函数了,其中还包括在cpp文件中使用,所以需要包括这些库)

    进入tools|options|projects and solutions|vc++directories 添加:

    include files:

    d:programmingcuda oolkitinclude

    d:programmingcudasdkcommoninc

    library files:

    d:programmingcuda oolkitlib

    d:programmingcudasdkcommonlib

    source files:d:programmingcudasdkcommonsrc    

    文本编辑器设置:进入vc++ project settings:c/c++ file extensions:添加*.cu,在text editor-file extension:添加cu 对应editor到microsoft vc++ editor。    

    visual assist x设置(如果需要安装的话):关闭已经所有打开的visual studio,安装va,之后进入注册表编辑器:hkey_current_usersoftwarewhole tomatovanet8 找到右边的extsource项,将其值添加.cu;.cuh;之后关闭,再次打开vs2005即可。)

    3.2.2 创建全局函数和头文件

             首先我们在头文件和资源文件中建立全局函数以供调用:

             这里的testcuda函数采用extern关键字声明c语言扩展。

    我们在查看类视图的时候就可以看到该全局函数:

    3.2.3 创建cuda代码

    为了标示清楚,我们首先创建了一个名为cuda的筛选器,然后在该筛选器中分别创建名为first.cu和first_kernel.cu的两个源代码文件。然后其中添加代码如下:

    #include "stdio.h"

    #include "cutil.h"

    #include "first_kernel.cu"

    extern "c" void runtest(float *source,int datalen,float *result)

    {

        int count;

        cudagetdevicecount(&count);

        if(count == 0) {

            fprintf(stderr, "there is no device. ");

             *result=-1;

        }

        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 no device supporting cuda 1.x. ");

             *result=-1;

        }

         float * d_source,*d_result;

         cudamalloc((void**)&d_source,datalen*sizeof(float));

         cudamalloc((void**)&d_result,sizeof(float));

         cudamemcpy(d_source,source,datalen*sizeof(float),cudamemcpyhosttodevice);

         kernel<<<1,256,0>>>(d_source,datalen,d_result);

       

         cudamemcpy(result,d_result,sizeof(float),cudamemcpydevicetohost);

         cudafree(d_source);

         cudafree(d_result);

    }

    以及在first_kernel.cu中添加的内核函数(即并行部分):

    #ifndef _first_kernel_h_

    #define _first_kernel_h_

    __global__ void kernel(float *source,int len,float *result)

    {

         int i;

         float sum;

         sum=0;

         for(i=0;i<len;i++)

             sum+=*(source+i);

           

         *result=sum;

    }

    #endif

    3.2.3 修改链接器设置

    首先是first.cu的属性设置:

    将“常规”中的工具一项设为“自定义生成工具”。

    然后在命令行中参考3.1中的设置方式。这里需要注意的是“附加依赖项”为first_kernel.cu.

    而在first_kernel.cu中的属性设置,我们需要将这个存放内核函数的文件“从生成中排除”。

             最后是设置项目的属性,仍旧参照3.1在“项目属性”的“链接器”的属性中作一些改动。

      &nb

     

    搜索此文相关文章:CUDA 在Windows 下的软件开发环境搭建

     

    此文链接:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%B1%87/38217.shtml

     

    转载请注明出处:CUDA在Windows下的软件开发环境搭建 - 博客园

  • 相关阅读:
    如何实现网页程序自动登录(java)?
    Java读取股票信息
    (转)如何以32 bit的方式存取SDRAM?
    在DE2上运行uCOSII
    Ubuntu不能上网问题解决之二
    (转)GNU编译器工具链
    (转)Quartus II文件的管理
    (转)avm_m1_writedata[15:0] 與 avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011意義是否一樣?
    (转)如何將編譯結果,統一放在一個目錄下? (QuartusII)
    (转)如何在DE270使用SSRAM?
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/5171575.html
Copyright © 2020-2023  润新知