Я обнаружил, что поддержка cuda использует ключевое слово «шаблон» для кода, теперь я хотел бы связать использование «шаблона» между nvcc и g++. Но кажется, что я не могу найти правильный способ реализовать это, поэтому я использую строку типа данных для доставки объявления типа данных. Могу ли я найти лучший способ сделать это?
//in .cpp
extern "C" void function(string T);
int main(){
function("float");
}
//in .cu
extern "C" void function(string T){
if (T == "short")
func<short>(...);
if (T == "int")
func<int>(...);
.......
}
Это читается как вопрос X-Y. Шаблоны полностью поддерживаются, и исправить вашу первоначальную проблему должно быть тривиально, а не пытаться изобрести какую-то нелепую схему для ее замены. В качестве подсказки начните с потери связи C во всем. Связывание C++ полностью поддерживается в CUDA, и если вы используете шаблоны, вам необходимо использовать связывание C++.
если у вас есть решение, которым вы можете поделиться, добавьте его в ответ. Не редактируйте его в свой вопрос





Вы можете использовать перегрузку функций в стиле C.
// in .cpp
extern "C" void func_short();
extern "C" void func_int();
extern "C" void func_float();
int main(){
func_float();
}
// in .cu
template <typename T>
void func() {
// ...
}
extern "C" void func_short() {
func<short>();
}
extern "C" void func_int() {
func<int>();
}
extern "C" void func_float() {
func<float>();
}
Это значительно быстрее, чем сравнение строк каждый раз, когда вы вызываете функцию. Если вы хотите, вы можете создать функцию шаблона-оболочки на стороне C++, чтобы сделать использование немного чище.
// in .cpp
extern "C" void func_short();
extern "C" void func_int();
extern "C" void func_float();
template <typename T>
void func() = delete;
template <>
void func<short>() {
func_short();
}
template <>
void func<int>() {
func_int();
}
template <>
void func<float>() {
func_float();
}
int main(){
func<float>();
}
Чтобы упростить обслуживание, вы можете определить несколько макросов.
// in .cpp
template <typename T>
void func() = delete;
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE(); \
template <> \
void func<TYPE>() { \
func_##TYPE(); \
} \
DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)
int main(){
func<float>();
}
//in .cu
template <typename T>
void func() {
// ...
}
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE() { \
func<TYPE>(); \
}
DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)
Вы можете поместить эти строки DECLARE_FUNC в общий заголовок, чтобы вам нужно было обновлять список только в одном месте. Если вы хотите добавить функцию double, вы можете просто добавить DECLARE_FUNC(double) в заголовок.
// in declare_func.hpp
DECLARE_FUNC(short)
DECLARE_FUNC(int)
DECLARE_FUNC(float)
// in .cpp
template <typename T>
void func() = delete;
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE(); \
template <> \
void func<TYPE>() { \
func_##TYPE(); \
} \
#include "declare_func.hpp"
int main(){
func<float>();
}
//in .cu
template <typename T>
void func() {
// ...
}
#define DECLARE_FUNC(TYPE) \
extern "C" void func_##TYPE() { \
func<TYPE>(); \
}
#include "declare_func.hpp"
Я перешел от простого в настройке к простому в обслуживании. Вам придется решить, что подходит для вашей ситуации.
это то, чего я желал. Спасибо. А что, если у меня много функций, например func1, func2, func3 и т. д. с шаблонами. Могу ли я сделать то же самое с помощью макросов или другим способом?
Я думал, что этот способ функционален, но я надеюсь найти более эффективный и элегантный способ сделать то же самое, большое спасибо!