Как я могу указать минимальные вычислительные возможности для компилятора mexcuda для компиляции функции mexcuda? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть проект CUDA в файле .cu, который я хотел бы скомпилировать в файл .mex, используя mexcuda.Поскольку мой код использует 64-битную атомарную операцию с плавающей запятой atomicAdd(double *, double), которая предназначена только для устройств с графическим процессором с вычислительной способностью 6.0 или выше, я должен указать это как флаг при компиляции.

В моей стандартной IDE это работает нормально, но при компиляции с mexcuda это работает не так, как хотелось бы.В этом посте на MathWorks было предложено использовать следующую команду (отредактировано из комментария Джоссом Найтом):

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

, но когда я использую эту команду в своем файле,опция verbose выводит следующую строку последней:

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)

Единственный другой пост, который я мог найти по этой теме, был этот пост на SO, но ему почти три года и он казалсядля меня это больше похоже на обходной путь - тот, который я не понимаю даже после некоторого исследования, иначе я бы попробовал его - а не настоящее решение проблемы.

Есть ли настройка, которую я пропустил, или это можетпросто не обойтись без обходного пути?

1 Ответ

0 голосов
/ 11 октября 2018

Я смог обойти эту проблему после некоторого возни со стандартными xml -файлами в папке MatLab.Следующие шаги позволили мне скомпилировать, используя -mexcuda:

-1) Перейдите в папку C:\Program Files\MATLAB\-version-\toolbox\distcomp\gpu\extern\src\mex\win64, которая содержит xml -файлы для разных версий msvcpp;

-2) Сделайте резервную копию файла, который соответствует используемой версии.В моем случае я сделал копию файла nvcc_msvcpp2017 и назвал его nvcc_msvcpp2017_old, чтобы всегда иметь оригинал.

-3) Откройте nvcc_msvcppYEAR с помощью блокнота и выделите следующий блоклинии:

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"

-4) Удалите архитектуры, которые не позволяют компилировать ваш код, т.е. все флаги архитектуры ниже 60 в моем случае:

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

-5) Iсмог скомпилировать используя mexcuda после этого.Вам не нужно указывать какие-либо флаги архитектуры в вызове mexcuda.

-6) (необязательно) Я полагаю, что вы хотите отменить это изменение после того, как вы закончили с проектом, который требовал от вас внести это изменение, если вы хотите обеспечить максимальную переносимость кода, который вы скомпилируете после этого.

Примечание : вам потребуется разрешение администратора для внесения этих изменений.

...