Использование функций стандартной библиотеки времени компиляции C++ при компиляции NVRTC

Все мы знаем, что включение заголовков в ядра, скомпилированные с помощью NVRTC, немного сложно. JITify, например, использует некоторые самодостаточные "строки заголовков заглушек" вместо некоторых из стандартных библиотек C, чтобы позволить нам использовать, например<stdio.h> а также printf()- а также истинные определения и константы типа C. И если вы не воспользуетесь их подходом, вас ждет довольно много боли.

Но я пишу на C++; и я хочу использовать некоторые из его заголовков. Очевидно, что не хватает реализации на стороне устройства. Допустим, я хочу использовать какие-то черты типа из<type_traits>: Может быть std::is_unsigned а также std::enable_if. Я также компилирую с--std=c++11 (или --std=c++14 если хотите), а также с последней версией CUDA (10.2 или 11.0).

У меня проблемы с этим. Даже если я вручную добавлю соответствующий путь включения, чтобы NVRTC мог подключаться к libstdC++bits/ подкаталог и еще несколько мест:

-I /usr/include/c++/8/ -I /usr/include/x86_64-linux-gnu/ -I /usr/include/x86_64-linux-gnu/c++/8/

(это, конечно, только в моей системе), я получаю кучу ошибок компиляции:

/usr/include/c++/8/type_traits(32): warning: unrecognized #pragma
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h(238): error: identifier "__SIZE_TYPE__" is undefined
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h(238): error: "size_t" has already been declared in the current scope
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h(239): error: identifier "__PTRDIFF_TYPE__" is undefined
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h(239): error: "ptrdiff_t" has already been declared in the current scope
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h(260): warning: attributes ignored here
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h(264): warning: attributes ignored here
/usr/include/x86_64-linux-gnu/gnu/stubs.h(7): catastrophic error: cannot open source file "gnu/stubs-32.h"

Некоторые из них я, возможно, смогу решить, добавив некоторые определения препроцессора. Некоторые из них более проблематичны: Отсутствующиеgnu/stubs-32.h из-за:

#if !defined __x86_64__
# include <gnu/stubs-32.h>
#endif

Я бы предпочел не пытаться преодолевать это, и, честно говоря, я не особо заинтересован в этом файле с самого начала.

Это заставило меня подумать, что, возможно, мне просто следует использовать libstdC++. Возможно, другая реализация стандартной библиотеки могла бы делать меньше предположений и быть менее требовательной к среде компиляции, в которой она используется. Но, может быть, все они просто имеют разные типы предположений? Хм.

Итак, мой вопрос: какой подход, если таковой имеется, мне следует предпринять, чтобы разрешить моему коду ядра доступ к частям стандартной библиотеки C++ во время компиляции?

0 ответов

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