如何配置 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 方法?

如何将编译器标志从 clang 传递给 nvcc

waf : 将编译器标志传递给 qt 的 moc

MatConvNet编译报错:Error using mex nvcc fatal : ‘-DNDEBUG’: expected a number 解决办法

如何获取剃须刀中单选按钮的值以将其作为参数传递给操作?

MatConvNet编译报错:Error using mex nvcc fatal : Unsupported gpu architecture ‘compute_20‘ 解决办法