Использование функций стандартной библиотеки времени компиляции 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++ во время компиляции?