3

我正在尝试使用 CUDA 增强一个小型 C++ 项目。我的项目正在使用自定义库的类和函数Matrix3d, Vector3d, Plane2d等。它们主要是几何对象。

当我尝试在设备中使用我的代码(__host__ __device__函数或内核)时,所有库函数/对象都被视为主机代码,例如我收到多个警告和错误error: identifier "Plane3d::~Plane3d" is undefined in device code

有没有办法在设备上使用我的图书馆?它是如何完成的?我没有 CUDA 和 C++ 方面的经验(我只使用 CUDA 和没有类的简单 C 代码)所以我不太了解这个策略。

有没有办法避免更改库源代码?可以更改库的代码,但如果我能避免它会更好。

非常感谢。

4

2 回答 2

1

在 CUDA 中使用 C++ 类没有什么特别的问题。对象模型与标准 C++ 仅略有不同。

任何结构或类数据成员都会在类或结构被实例化的任何内存空间(如主机或设备)中自动定义。不自动的是类和结构内的函数成员和运算符的代码生成。程序员必须显式定义和编译那些对象将被实例化的内存空间。后一个要求意味着您必须同时拥有对象中调用的每个函数__device____host__定义。这包括构造函数和析构函数,后者是您在问题中显示的错误。

于 2012-12-04T18:33:52.437 回答
0

您不需要更改源代码 - 您需要的是编写一个适配器。

CUDA 内核使用低级结构,例如 double*、double* 、double ** 或 float*、float* 、float ** 以及内置的 CUDA 类型。

无论如何,CUDA 不能直接在 CUDA 外部分配的内存上工作(仅在显卡上分配内存,而不是常规 RAM),因此您必须将数据复制到图形内存中。

如果您提供可以访问您的类型使用的缓冲区的方法,您可以将它们复制到图形卡中,如果您的类型有连续的内存,或者如果没有,则以块的形式复制到显卡中(使用 CUDA 内存复制功能),那么您可以使用简单的索引将它们与内核一起处理为 double***。

于 2012-12-04T16:23:13.443 回答