У меня есть проект 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, но ему почти три года и он казалсядля меня это больше похоже на обходной путь - тот, который я не понимаю даже после некоторого исследования, иначе я бы попробовал его - а не настоящее решение проблемы.
Есть ли настройка, которую я пропустил, или это можетпросто не обойтись без обходного пути?