这是一个非常复杂的问题,而且我不是以英语为母语的人,所以如果您有足够的耐心阅读我的问题,我将不胜感激。
由于 Cuda 实际上是在两台计算机上运行,因此当您在设备上时,指向主机的内存是无效的,这意味着如果结构(或对象)具有指针成员,则无法将它们复制到设备。
我尝试制作以下系统来解决此问题:
- 使用整数而不是指针。整数是内存池中的偏移量。整数被包装在一个类中(重载“->”和“*”),使其看起来像一个指针。
- 内存池对象管理着一个连续的对象数组,可以很容易地转移到 Cuda 设备上。池的内容在主机和设备之间同步,因此整数偏移量在两侧具有相同的含义。
为了方便使用偏移量,它应该被包裹。在主机端,包装器如下所示:
template<typename T>
class MemPoolPointer {
public:
inline T* operator -> () const
{
return &( MemPool<T>::get_instance.get_object(_p) );
}
uint64_t _p;
}
我们可以看到,指针类需要全局访问内存池。这通常通过将内存池设置为单例来实现。但是,Cuda 不允许静态成员,并且它将 __device__ 变量限制为文件范围。如何解决这些限制?或者我应该试试 OpenCL?