Компиляция .cu против .cpp: ошибки компилятора даже без кода CUDA - PullRequest
0 голосов
/ 08 апреля 2019

Я компилирую следующий код:

#include <iostream>
#include <boost/beast.hpp>


int main()
{
    std::cout << "Hello, world!\n";
}

через

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
$ nvcc -O0 --std=c++14 -g -Xcompiler=-Wfatal-errors -I./include -I../boost  main.cu -o runserver

Я получаю ошибку компилятора:

boost/beast/core/impl/error.ipp(20): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::beast::detail::error_codes"

beast/core/impl/error.ipp(55): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::beast::detail::error_conditions"

boost/beast/core/impl/error.ipp(84): warning: invalid narrowing conversion from "unsigned int" to "int"

boost/beast/core/impl/error.ipp(92): warning: invalid narrowing conversion from "unsigned int" to "int"

boost/asio/impl/error.ipp(32): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::asio::error::detail::netdb_category"

boost/asio/impl/error.ipp(64): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::asio::error::detail::addrinfo_category"

boost/asio/impl/error.ipp(94): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::asio::error::detail::misc_category"

boost/beast/http/impl/error.ipp(21): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::beast::http::detail::http_error_category"

boost/beast/http/impl/error.ipp(96): warning: invalid narrowing conversion from "unsigned int" to "int"

boost/beast/websocket/impl/error.ipp(20): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::beast::websocket::detail::error_codes"

boost/beast/websocket/impl/error.ipp(117): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::beast::websocket::detail::error_conditions"

boost/beast/websocket/impl/error.ipp(144): warning: invalid narrowing conversion from "unsigned int" to "int"

boost/beast/websocket/impl/error.ipp(152): warning: invalid narrowing conversion from "unsigned int" to "int"

boost/beast/zlib/impl/error.ipp(49): warning: overloaded virtual function "boost::system::error_category::message" is only partially overridden in class "boost::beast::zlib::detail::error_codes"

boost/beast/zlib/impl/error.ipp(115): warning: invalid narrowing conversion from "unsigned int" to "int"

boost/beast/http/message.hpp(265): error: static assertion failed with "Fields type requirements not met"
          detected during:
            instantiation of class "boost::beast::http::header<false, Fields> [with Fields=boost::beast::http::fields]"
(495): here
            instantiation of class "boost::beast::http::message<isRequest, Body, Fields> [with isRequest=false, Body=boost::beast::http::string_body, Fields=boost::beast::http::fields]"
boost/beast/websocket/detail/impl_base.hpp(199): here

boost/beast/http/message.hpp(61): error: static assertion failed with "Fields type requirements not met"
          detected during:
            instantiation of class "boost::beast::http::header<true, Fields> [with Fields=boost::beast::http::fields]"
(495): here
            instantiation of class "boost::beast::http::message<isRequest, Body, Fields> [with isRequest=true, Body=boost::beast::http::empty_body, Fields=boost::beast::http::fields]"
boost/beast/websocket/detail/impl_base.hpp(257): here

2 errors detected in the compilation of "/tmp/tmpxft_00002a42_00000000-6_main.cpp1.ii".

Однако, если я изменю суффикс файла на .cpp и скомпилирую с nvcc, проблем не возникнет, и все будет хорошо.

Почему? Я думал, что nvcc просто перенаправил код процессора в компилятор хоста.

Кроме того, кажется, что у nvcc есть проблема с файлами .ipp. Это известная проблема?

1 Ответ

3 голосов
/ 08 апреля 2019

Почему?Я думал, что nvcc просто перенаправляет код процессора на хост-компилятор.

Это слишком упрощенное утверждение для понимания того, что здесь происходит.

Как вы обнаружили, поведение nvcc (по умолчанию) отличается в зависимости от того, является ли расширение файла .cpp или .cu, даже для чисто хост-кода .

Более полное описание предварительной обработки nvcc, связанной с .cu файлами (даже для кода хоста), дано в руководстве nvcc .Еще более полное описание можно получить, выполнив команду nvcc с ключом --verbose;таким образом вы можете полностью детально изучить процесс.

В двух словах, код хоста в файле .cu проходит несколько этапов предварительной обработки, прежде чем он действительно достигает компилятора хоста C ++.Хост-код в файле .cpp проходит меньше шагов, прежде чем достигает компилятора хоста C ++.

Кроме того, boost принимает определенное поведение, когда обнаруживает определенные макросы, которые компилятор nvcc добавляет (даже) к хост-коду,когда этот код хоста находится в .cu файле.Эти макросы, обнаруженные кодом повышения, вызывают «поведение» буста по-другому. Здесь является примером.

Я не думаю, что есть какие-либо проблемы с .ipp файлами, которые используются в обычным способом .Это просто «дополнения» к заголовочным файлам, следуя стандартному механизму включения.Тот факт, что в выводе ошибок указано много файлов .ipp, не связан с этим.Это всего лишь следствие того, где происходят ошибки и как Boost разбивает свой код заголовка.

Если вы действительно хотите решить эту конкретную проблему здесь, обычные предложения:

  1. Поместите свой код повышения в файлы .cpp (или)
  2. Используйте последние версии boost и CUDA (и)
  3. Сообщайте о наблюдаемых проблемах либо (или оба) проблемы повышения или ошибки в CUDA на developer.nvidia.com (описание регистрации ошибок: здесь )
...