如何将数据类型声明从.cpp文件传输到 .cu 文件

How to transfer datatype declaration from .cpp file to .cu file?

本文关键字:文件 传输 cu cpp 数据类型 声明      更新时间:2023-10-16

我发现cuda支持使用"template"关键字作为代码,现在我想在nvcc和g ++之间链接"template"的使用。但是我似乎找不到正确的实现方法,所以我使用数据类型的字符串来取消数据类型声明。我能找到更好的方法来做到这一点吗?

//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>(...);
    .......
}

您可以使用 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"

我已经从易于设置变成了易于维护。您必须决定什么适合您的情况。