Почему?Я думал, что nvcc просто перенаправляет код процессора на хост-компилятор.
Это слишком упрощенное утверждение для понимания того, что здесь происходит.
Как вы обнаружили, поведение nvcc
(по умолчанию) отличается в зависимости от того, является ли расширение файла .cpp
или .cu
, даже для чисто хост-кода .
Более полное описание предварительной обработки nvcc, связанной с .cu
файлами (даже для кода хоста), дано в руководстве nvcc .Еще более полное описание можно получить, выполнив команду nvcc
с ключом --verbose
;таким образом вы можете полностью детально изучить процесс.
В двух словах, код хоста в файле .cu
проходит несколько этапов предварительной обработки, прежде чем он действительно достигает компилятора хоста C ++.Хост-код в файле .cpp
проходит меньше шагов, прежде чем достигает компилятора хоста C ++.
Кроме того, boost принимает определенное поведение, когда обнаруживает определенные макросы, которые компилятор nvcc добавляет (даже) к хост-коду,когда этот код хоста находится в .cu
файле.Эти макросы, обнаруженные кодом повышения, вызывают «поведение» буста по-другому. Здесь является примером.
Я не думаю, что есть какие-либо проблемы с .ipp
файлами, которые используются в обычным способом .Это просто «дополнения» к заголовочным файлам, следуя стандартному механизму включения.Тот факт, что в выводе ошибок указано много файлов .ipp
, не связан с этим.Это всего лишь следствие того, где происходят ошибки и как Boost разбивает свой код заголовка.
Если вы действительно хотите решить эту конкретную проблему здесь, обычные предложения:
- Поместите свой код повышения в файлы .cpp (или)
- Используйте последние версии boost и CUDA (и)
- Сообщайте о наблюдаемых проблемах либо (или оба) проблемы повышения или ошибки в CUDA на developer.nvidia.com (описание регистрации ошибок: здесь )