Использование CUDA 8.0 с GCC 6.x - жалоба на перегрузку плохой функции
Я пытаюсь построить некоторый код CUDA, используя GCC 6.2.1, компилятор по умолчанию в моем дистрибутиве (Примечание: не версия GCC, официально поддерживаемая CUDA, поэтому вы можете назвать это экспериментальной). Это код, который прекрасно работает с GCC 4.9.3 и обеими версиями CUDA 7.5 и 8.0.
Хорошо, если я построю следующий (близкий) минимальный пример:
#include <tuple>
int main() { return 0; }
с командной строкой
nvcc -std=c++11 -Wno-deprecated-gpu-targets -o main main.cu
Я получаю следующие ошибки:
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone
/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone
2 errors detected in the compilation of "/tmp/tmpxft_000071fe_00000000-9_b.cpp1.ii".
Это почему? Как я могу исправить / обойти это?
1 ответ
TL;DR: Забудь об этом. Используйте CUDA 8.x только с GCC 5.x и CUDA 9 или новее с GCC 6.x
Похоже, что другие люди видели эту проблему с GCC 6.1.x, и предлагается добавить следующие флаги в nvcc: -Xcompiler -D__CORRECT_ISO_CPP11_MATH_H_PROTO
(да, два последовательных флага; см. nvcc --help
для деталей). (Но я не могу сообщить о полном успехе, так как вместо этого появляются другие проблемы.)
Но помните, что GCC 5.4.x является последней поддерживаемой версией, и на это, вероятно, есть веская причина, так что это своего рода дикая погоня за внедрением GCC 6.x - особенно, когда CUDA 9 уже доступна.