【发布时间】:2013-05-10 03:49:34
【问题描述】:
我有一个包含混合 C++、CUDA 和 Thrust 的嵌套类的类。我想将成员定义拆分到多个文件中。
// In cls.h:
#include <thrust/device_vector.h>
class cls {
class foo { // define in foo.cu (include "cls.h")
kernelWrapper();
}
class bar { // define in bar.cu (include "cls.h")
thrust::device_vector A;
thrustStuff();
}
thrust::device_vector B;
pureCPP(); // define in cls.cpp (include "cls.h")
moreThrust(); // define in cls.cu (include "cls.h")
}
在每个定义文件中我只是#include "cls.h"。但是,无论我尝试什么,我目前都会遇到各种各样的编译器错误,例如pureCPP was referenced but not defined。
我读过 Thrust 只能用于
.cu文件。因为我的父类cls声明了像B这样的推力类型变量(因此#includesthrust/device_vector.h),这是否会强制将所有#includecls.h的文件制作成.cu文件?在这种情况下,我应该在哪里使用
extern "C"?我想cls.cpp会要求.cu文件中的所有函数都包含在extern "C"中,但是.cu到.cu的调用呢,比如moreThrust()调用bar::thrustStuff()我还知道类的成员不能与
extern "C"一起工作,所以我必须为每个成员函数编写一个extern "C"包装函数吗?
我完全不知道如何让这一切正常工作 - 每个文件我需要 #includes 和 extern "C"s 的什么鸡尾酒?
【问题讨论】:
-
你根本不需要 extern "C"。那是从旧时代开始的,当时所有的 CUDA 代码都被视为 C 而不是 C++,因此您必须非常具体地了解名称修饰。 CUDA 文件现在是 C++
-
@alrikai - 但我的编译器也非常清楚地表明,我不能随意混合
.cu和.cpp文件之间的调用。事实上,提供.cpp访问.cu内核的内核包装器似乎只适用于extern "C" -
您使用的是最新版本吗?
-
或者我已经迫不及待地将我所有的
.cpp重命名为.cu文件 - 但我仍然无法让它工作。我得到恒定的function [x] referenced but not defined错误 -
你不应该重命名任何东西。试试我的答案中的代码,让我知道它是否适合你
标签: c++ class cuda gpgpu thrust