【CUDA】如何将一个MFC工程变成CUDA工程

来源:互联网 发布:网络选秀活动 编辑:程序博客网 时间:2024/05/02 12:32

导言:

    CUDA SDK 操作第二弹来了!这次小E为大家介绍如何将一个标准的MFC工程变成一个CUDA工程。

    对于致力于软件移植的同学,一定会遇到这样的问题。拿到一个程序,需要将其中部分代码更改为GPU运算。此篇文章将结合实例进行详细说明。

准备工作:

    1,已经成功安装Toolkit 并运行成功;2,成功安装SDK;3,成功编译运行SDK中的C语言例子程序(如果运行不了请检查项目属性中是否:连接器->其他程式库目录是否配置有误,如果有误会产生.lib的连接错误)。并且需要移植的MFC程序可以正常运行。

正式工作:

    步骤一:将MFC程序复制到~/NVIDIA Corporation/NVIDIA GPU Computing SDK/C/src(sdk中C的示例程序文件夹下)。

    步骤二:打开你的MFC工程,对照示例工程将工程属性(右键点击工程,上下文菜单中寻找属性按钮点击)逐一改过。

    步骤三:此时会遇到两个问题,1,MFC工程中没有相应的.Rule文件。2,MFC中的.cu文件会与其他cpp文件有链接冲突问题。

 

    1,还是右键点击工程,上下文菜单中寻找“自定建制规则”如图Fig.1所示:

 

Fig.1

单击按钮“寻找现有的..”找到~/NVIDIA Corporation/NVIDIA GPU Computing SDK/C/common 中CUDA.rule选择确定。

然后在方框选框中勾选即可。

    2.此时编译会产生许多error LNK2005的问题。

这是由于C++的runtime用的是/MD即multithread- and DLL-specific version

而CUDA runtime 用的是/MT 即multithread, static version


    /MT是 "multithread, static version ” 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。

/MD是 "multithread- and DLL-specific version” ,意思是多线程DLL版本,定义了它后,编译器把 MSVCRT.lib 安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。

即:

静态运行时库:LIBCMT.lib
动态运行时库:MSVCRT.lib + MSVCR80.DLL

所以,当你用CMAKE生成工程文件时,若CMAKE是用/MT生成的(查看工程原始目录的CMakeLists.txt),则它所调用的运行时库为:LIBCMT.lib,若生成的工程的运行时库(Runtime Library)你选择/MD,则此工程在编译后链接的时候,将会调用动态运行时库:MSVCRT.lib + MSVCR80.DLL,明显,两次对同一个某运行时库里的函数调用的库不同,则会出现重定义的错误。若此工程生成的是库文件,则其他工程调用此库时也必须是/MT。

    那么我们再右键点击工程-》属性-》组态属性-》一般,将MFC的使用一栏更改为“使用MFC的静态程式库”。进入组态属性-》C++-》程式码产生,将“执行阶段程式库”改为“/MTd”。最后进入组态属性-》CUDA build rulexxx-》Hybrid CUDA/C++ Options, 将Runtime Library 一栏改为/MTd,即可。

    重新编译运行-》成功~

 

如有问题欢迎留言

原创粉丝点击