如何配置 mex 以将编译器标志传递给 nvcc
Posted
技术标签:
【中文标题】如何配置 mex 以将编译器标志传递给 nvcc【英文标题】:How can one configure mex to pass compiler flags to nvcc 【发布时间】:2015-10-27 10:59:20 【问题描述】:在使用nvcc
编译mex
文件时,我一直在努力将特定于CUDA 的编译器选项传递给nvcc
编译器,因为mex
无法识别它们。
我找到了一些old posts about passing compiler flags 和some newer ones,
但是这些问题是针对特定用户的,而且mex
编译器多年来发生了变化,所以我不知道该怎么办。
所以,我的具体问题是:我应该怎么做才能让mex
将编译器标志传递给nvcc
?
更通用一点:应该怎么做才能让mex
将编译器标志传递给另一个编译器?
【问题讨论】:
我只是在Visual Studio IDE 中使用与CUDA Toolkit 一起安装的集成来做这件事,真是令人头疼。但是,如果我今天有时间,我想为您的问题添加一个答案。简而言之,我通常使用属性表,您可以在其中键入其他标志,但这再次使用 IDE 进行编译,而不是mex
。这是否过于具体的用例?或者使用 XML 的新方法...
或者使用 XML as I do for MinGW 的新方法。或者这不是你的意思?
@chappjc 如果你有答案添加它,至少对于未来丢失的编译器。
是的,我想你有你的答案。 :) 只是想成为话题......
【参考方案1】:
如果使用选项位于 xml 文件中的最新编译方式,可以在其中硬编码默认编译标志。例如我的看起来像:
COMPILER="nvcc"
COMPFLAGS="-gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=\"sm_50,compute_50\" --compiler-options=/c,/GR,/W3,/EHs,/nologo,/MD"
COMPDEFINES="--compiler-options=/D_CRT_SECURE_NO_DEPRECATE,/D_SCL_SECURE_NO_DEPRECATE,/D_SECURE_SCL=0,$MATLABMEX"
MATLABMEX="/DMATLAB_MEX_FILE"
OPTIMFLAGS="--compiler-options=/O2,/Oy-,/DNDEBUG"
INCLUDE="-I"$MATLABROOT\extern\include" -I"$MATLABROOT\simulink\include""
DEBUGFLAGS="--compiler-options=/Z7"
可以修改COMPFLAGS
的默认值
【讨论】:
在哪里可以找到这个文件?是自动生成的吗? @Floris 好问题,但答案含糊(这是 5 年前!)。我在 MATLAB 安装中找到了我的。 Visual Studio 编译的xml
文件很少,然后我将这些东西添加到其中。如果您想要一个适用于 CUDA 的修改模板,请查看我在 github 中的工具“TIGRE 工具箱”,我提供了已为 CUDA 设置的各种 xml
。
回答我自己的问题...您可以在 prefdir
目录中找到该文件 - 所以 dir(fullfile(prefdir,'mex*.xml'))
应该让您对那里的内容有一个很好的了解。以上是关于如何配置 mex 以将编译器标志传递给 nvcc的主要内容,如果未能解决你的问题,请参考以下文章
如何最好地将 CString 转换为 BSTR 以将其作为“in”参数传递给 COM 方法?
MatConvNet编译报错:Error using mex nvcc fatal : ‘-DNDEBUG’: expected a number 解决办法
MatConvNet编译报错:Error using mex nvcc fatal : Unsupported gpu architecture ‘compute_20‘ 解决办法