У меня проблемы с компиляцией кода, который включает в себя файлы .cu, скомпилированные с помощью nvcc, и файлы .cpp, скомпилированные с помощью gcc. - PullRequest
0 голосов
/ 07 февраля 2019

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

1 Ответ

0 голосов
/ 08 февраля 2019

Это определенно звучит как проблема со связыванием.Посмотрите здесь подробные инструкции по связыванию кода устройства cuda с кодом c ++: https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/

К сожалению, вы не предоставили свои команды связывания.Я постараюсь сделать свои предложения как можно более общими.Суть в том, что только nvcc понимает, как связать код устройства с кодом объекта CPU, поэтому он должен участвовать в процессе связывания, а не просто как компилятор.Ознакомьтесь с разделами «Использование привязки кода устройства» и «Расширенное использование: Использование другого компоновщика» в приведенной выше ссылке.Вы можете использовать nvcc в качестве компилятора и компоновщика, или вы можете использовать nvcc, чтобы связать вместе объединенный объектный файл cpu- и device-code, используя опцию -dlink, и затем вы можете связать все вместе как обычно.В обоих случаях вы должны передать опцию -dc в nvcc при компиляции исходных файлов, содержащих код устройства (это означает, что вы хотите связать код устройства позже)

Также обратите внимание, что nvcc может компилировать файлы .cpp;по умолчанию предполагается, что файлы .cpp содержат только код процессора.Вам не нужно переименовывать исходные файлы только для процессора, чтобы скомпилировать их с помощью nvcc.

...