我发现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>(...);
.......
}
答案 0 :(得分:0)
您可以使用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"
我已经从易于设置转到易于维护。您必须决定哪种方式适合您的情况。