Использование 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 уже доступна.

Другие вопросы по тегам