如何将数据类型声明从 .cpp 文件传输到 .cu 文件?
How to transfer datatype declaration from .cpp file to .cu file?
我发现 cuda 支持在代码中使用 "template" 关键字,现在我想 link 在 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-style 函数重载。
// 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
行放在一个公共 header 中,这样您只需在一个地方更新列表。如果你想添加一个 double
功能,你可以只添加 DECLARE_FUNC(double)
到 header.
// 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"
我已经从 easy-to-setup 变成了 easy-to-maintain。您必须决定什么适合您的情况。
我发现 cuda 支持在代码中使用 "template" 关键字,现在我想 link 在 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-style 函数重载。
// 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
行放在一个公共 header 中,这样您只需在一个地方更新列表。如果你想添加一个 double
功能,你可以只添加 DECLARE_FUNC(double)
到 header.
// 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"
我已经从 easy-to-setup 变成了 easy-to-maintain。您必须决定什么适合您的情况。