我在.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,但是它已经快三年了,在我看来更像是一种变通方法-即使经过一些研究我也不理解,否则我会尝试的,而不是真正解决问题的方法。
是否有我错过的设置,或者如果没有解决方法就无法做到这一点?
答案 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 >注意:您将需要管理员权限才能进行这些更改。