在CUDA项目中使用外部库类

时间:2012-12-04 15:54:17

标签: c++ cuda libraries

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

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

有没有办法在设备上使用我的库?怎么做? 我没有CUDA和C ++的经验(我只使用CUDA和没有类的简单C代码)所以我没有很好地掌握这个策略。

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

如果您提供的方法可以访问您的类型使用的缓冲区,您可以在类型具有连续内存时连续复制它们,如果没有,则可以将其复制到图形卡中(使用CUDA内存复制功能),然后你可以使用简单的索引将内核作为double ***处理它们。