如何为mexcuda编译器指定最低计算能力以编译mexfunction?

时间:2018-10-10 13:10:07

标签: compilation cuda mex nvcc

我在.cu文件中有一个CUDA项目,我想使用.mex编译成mexcuda文件。由于我的代码使用了64位浮点原子操作atomicAdd(double *, double),该操作仅适用于计算能力为6.0或更高的GPU设备,因此在编译时需要将其指定为标志。

在我的标准IDE中,它可以很好地工作,但是当使用mexcuda进行编译时,这并没有达到我的期望。在this post on MathWorks中,建议使用以下命令(由Joss Knight的评论编辑):

mexcuda('-v', 'mexGPUExample.cu', 'NVCCFLAGS=-gencode=arch=compute_60,code=sm_60')

但是当我在文件上使用此命令时,详细选项最后吐出以下行:

Building with 'NVIDIA CUDA Compiler'.
nvcc -c --compiler-options=/Zp8,/GR,/W3,/EHs,/nologo,/MD - 
gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_50,code=sm_50 - 
gencode=arch=compute_60,code=sm_60 - 
gencode=arch=compute_70,code=\"sm_70,compute_70\"

(依此类推),它向我发出信号,表明指定的标志未正确传递到nvcc。实际上,编译失败并显示以下错误:

C:/path/mexGPUExample.cu(35): error: no instance of overloaded function "atomicAdd" matches 
the argument list. Argument types are: (double *, double)

关于该主题的我唯一能找到的其他帖子是this post的SO,但是它已经快三年了,在我看来更像是一种变通方法-即使经过一些研究我也不理解,否则我会尝试的,而不是真正解决问题的方法。

是否有我错过的设置,或者如果没有解决方法就无法做到这一点?

1 个答案:

答案 0 :(得分:1)

弄乱MatLab文件夹中的标准-mexcuda文件后,我能够解决该问题。以下步骤使我可以使用C:\Program Files\MATLAB\-version-\toolbox\distcomp\gpu\extern\src\mex\win64进行编译:

-1)转到文件夹xml,其中包含用于不同版本的msvcpp的nvcc_msvcpp2017-文件;

-2)备份与您使用的版本相对应的文件。就我而言,我复制了文件nvcc_msvcpp2017_old并将其命名为nvcc_msvcppYEAR,以始终保留原始文件。

-3)用记事本打开COMPILER="nvcc" COMPFLAGS="--compiler-options=/Zp8,/GR,/W3,/EHs,/nologo,/MD $ARCHFLAGS" ARCHFLAGS="-gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=\"sm_70,compute_70\" $NVCC_FLAGS" 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" ,然后滚动到以下几行:

ARCHFLAGS="-gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=\"sm_70,compute_70\" $NVCC_FLAGS"

-4)删除不允许您的代码进行编译的体系结构,即在我的情况下,所有低于60的体系结构标志:

mexcuda

-5)之后,我可以使用mexcuda进行编译。您无需在{{1}}调用中指定任何体系结构标志。

-6)(可选)我想您要在完成需要进行此更改的项目后恢复此更改,如果要确保最大的可移植性,您将在此之后进行编译。

-6 >

注意:您将需要管理员权限才能进行这些更改。