У меня довольно большой код C ++ (более 60 отдельных файлов), и я пытаюсь переключить некоторые вычисления на GPU с использованием инфраструктуры CUDA-9.Код нормально компилируется с помощью gcc (v 7).В качестве упражнения я изменил расширение одного из исходных файлов с .cpp на .cu, БЕЗ изменения какого-либо кода в нем.Я запустил make, который компилирует файлы .cpp с помощью g ++ и файлы .cu с помощью nvcc, и я получаю исполняемый файл.Однако, когда я запускал исполняемый файл, я почти сразу получал ошибку сегмента.Излишне говорить, что код прекрасно работает при компиляции с gcc.Фактически, он компилируется и прекрасно работает с компилятором Intel.Это флаги, которые передаются компилятору nvcc
nvcc -g -Xcudafe "--diag_suppress = code_is_unreachable" -Xcudafe "--diag_suppress = extra_semicolon"
, в то время как флаги для g ++ являются
g ++ -fPIC -O3 -g -Wno-неиспользованная-переменная -Wno-comment -Wno-возможно-неинициализированный -Wno-строгого-псевдонима -Wno-long-long -Wno-sign-сравнить -Wno-не рекомендуется -ftemplate-глубина-39 -Wno-variadic-maris -m64
Из-за размера кода я бы не хотел переименовывать все файлы в .cu.Более того, это зависит от библиотек, скомпилированных с gcc, так что переключение всей проблемы на nvcc нецелесообразно, не говоря уже о том, что nvcc кажется очень медленным по сравнению с gcc.Символическая ссылка в cuda-9.0 / bin для gcc указывает на gcc-7.Я также попытался добавить ключ --device-c в nvcc, но в этом случае он не будет ссылаться ... Любая помощь приветствуется.