Я пытался использовать std::tuple
в своем коде ядра, но получил много ошибок error: this declaration may not have extern "C" linkage
, указывающих на utility
и tuple
Он жалуется на включение. Следующие репро для меня.
from pycuda.compiler import SourceModule
mod = SourceModule("""#include <tuple>""")
Нужно ли мне делать что-то особенное в моем коде ядра или в моем коде Python, чтобы указать, что я хочу использовать компилятор C++?
Куда версия: 11.8
Версия PyCuda: 2022.2.1
Нужно ли мне делать что-то особенное в моем коде ядра или в моем коде Python, чтобы указать, что я хочу использовать компилятор C++?
Чтобы было ясно, вы используете компилятор C++. Но PyCUDA автоматически упаковывает код, который вы передаете, в экземпляр SourceModule в extern “C”
, если вы явно не укажете:
Если no_extern_c не равно True, данный исходный код заключен в
extern “C” { … }
, чтобы предотвратить искажение имени C++.
Основная причина с точки зрения C++ заключается в том, что шаблонные экземпляры типов и функций не могут разрешаться с помощью компоновки C, поэтому возникает ошибка.
Однако даже после того, как вы устраните эту проблему, приготовьтесь к разочарованию. CUDA поддерживает множество функций языка C++, но не поддерживает стандартную библиотеку, и вы не можете использовать std::tuple
в коде ядра. NVIDIA предоставляет собственную (очень ограниченную) повторную реализацию стандартной библиотеки C++, и у нее есть базовый тип кортежа. Это может сработать для вас.
std::tuple можно использовать в коде ядра с помощью
--expt-relaxed-constexpr