MFC + CUDA 配置问题

问题描述:
在查阅了有关MFC+CUDA编程的相关资料后,得知使用早期版本的CUDA时需要将写有分配GPU显存、数据从host传递至device代码的.cu文件的编译Tool设为Custom Build tool,并且手动添加编译命令行,写有kernel的.cu文件Tool设为CUDA Runtime API,并且将Excluded from build设为yes才能正常工作。
试问使用CUDA5.0+MFC编程时,是否也需要上述设置,还有大家可以谈谈MFC+CUDA编程时需要注意的事项么?

:(没有用过MFC,无法解答楼主的问题了,推荐楼主可以按照你说的方法进行尝试!

嗯!
谢谢ZBZ的回复

楼主您好!

感谢您选用极其简单的CUDA Toolkit 5.0。您无需上述过程。

您只需要正常建立solution和project, 然后添加.cu文件即可。(为了保险,您可以检查.cu文件的属性,通过您的鼠标右键,看看是否为CUDA C/C++类型,如果不是,请改过。)。

然后Rebuild all即可。
无需任何第三方工具哦。

:slight_smile:

BZ您好!您说的CUDA C/C++类型是否为Tool类型?可Tool选项中无此类型
[attach]2918[/attach]

EDIT:不好意思插错了图!!!

楼主您好。

在VS2010里它叫item type, 如果您看到的是tool type, 您可能是用的VS 2008.

如果您看不到CUDA C/C++类型,请用鼠标右键点击您的MFC project, 寻找Build Extensions(如果是vs08, 可能叫神马custom build rules),然后在弹出的窗口中,用鼠标左键点击CUDA 5.0前面的勾子。

此外,如果您是直接用的MFC类型建立的项目(而不是用CUDA C/C++然后添加的VC代码), 那么请注意您还缺少1步编译成功后自动复制dll的过程,(1)您可以通过相反的项目建立顺序以规避。或者(2)您复制cudart*.dll到您的syswow64/system32目录下。或者(3)您先建立一个空cuda c/c++项目,然后在此项目的属性中有一步post build command, 复制到您的MFC项目中的对应位置即可,这可以自动复制dll。

大致如此。如还有更多疑问,欢迎继续留言。

对了。您还需要链接cudart.lib(他们上文对应的cudart*dll的导入库,请别忘记链接)。这个依然在project属性的linker input里设置。

应该没有其他需要注意的事项了。

(当然,如果您是直接建立的CUDA C/C++项目然后添加了其他的MFC相关代码/资源文件等,那么您无需这些步骤,已经自动配置好了)。

额。刚看到你修改了帖子。可能VS08里面叫cuda runtime api,你可以选择这个尝试下。VS08使用的不同的自定义构建规则,和VS10的构建扩展不同。

首先,感谢BZ对此问题的详细解析
其次,custom build rules里面的CUDA 5.0 runtime 和 driver rule已有选中
再次,我是在原有MFC程序里面编写cuda程序,为了省事把cudart*.dll文件拷贝到了路径$(CUDA_SDK_PATH)\C\common\bin
最后,经过验证在Cuda Runtime API类型可以正常工作,不过会出现LIBCMT.lib与MSVCRTD.lib库冲突错误的情况如图:
[attach]2919[/attach]

   解决这种冲突的方法是:


   右键project,打开属性设置对话框,依次选择Configuration Properties->Linker->Input,在Ignore Specific Library编辑框中输入LIBCMT.lib。

恩,:handshake

那个不是cuda的问题。而是你的问题。

你同时使用了静态库和动态库了。这个很不好。

(不过有时候你无法避免,不是吗?例如你自己的代码试图使用静态库,但是你抄袭来,引用来的其他代码/其他库配置使用了动态库等。)

(需要说明的是,将cudart*dll复制到system32(或者syswow64)才是王道。当然,你复制到任何一个path中的路径下,也是可以的。cuda toolkit 5自带的模板是选择复制到你的exe的目录下,这个比较好,我也建议这样)

最后恭喜楼主成功在项目中使用了CUDA, 欢迎有空再来!

嗯,BZ说的有理,一般我是将需要用的dll放在项目Debug或Release目录下的,这样方便移植:)

有一个疑问,发现若选择(-G)会有Ptx相关错误,不选则编译正常
[attach]2920[/attach]

那就奇怪了。我用的是CUDA 5.0, 重演你的步骤建立的项目,然后加入了-G选项,最后build succeed.

不知道为何你加入-G就在ptxas那步出错。

建议其他版主/会员给予您帮助。

恩,谢谢BZ

如果楼主想继续探索原因(例如是贵机上的ptxas的问题呢?还是其他的您的问题呢之类的),可以进行如下操作:

(1)在.cu的属性页的CUDA C/C++ → Common里,选择–keep选项。
(2)重新进行build过程。
(3)根据出错信息,打开.ptx文件,定位到指示错误的那行。
(4)将这行和附近几行粘帖到论坛。

如果您不干兴趣。请无视上文。
一般来说,有无-G不会影响的。

BZ您好!
昨天忙其他事情了,不好意思没回您的贴,错误如下1>ptxas Rt_Calculate.compute_20.ptx, line 158; : fatal error : Parsing error near ‘-’: syntax error
1>ptxas : fatal error : Ptx assembly aborted due to errors

[attach]2921[/attach]

楼主您好!

您的路径中可能含有非ASCII码字符(例如中文),建议您修正以规避此问题。

您的可能位于.section .debug_info的行.b8 -62,因为跟随的是负数,导致汇编出错。

我识别出您的.b8 102/58/92是f:\开头的一个路径,后续负数值应该是中文路径,
建议您修改为英文作为路径。

感谢您的来访。

恩,谢谢BZ,我开始也怀疑是路径有中文的问题,因为在全英文路径下开启(-G)是正常的,经过版主这么一分析,我以后得更加注意避免使用含有非ASCII码字符的路径了。

您客气了,能服务您是我的荣幸。