2

这是一个非常复杂的问题,而且我不是以英语为母语的人,所以如果您有足够的耐心阅读我的问题,我将不胜感激。

由于 Cuda 实际上是在两台计算机上运行,​​因此当您在设备上时,指向主机的内存是无效的,这意味着如果结构(或对象)具有指针成员,则无法将它们复制到设备。

我尝试制作以下系统来解决此问题:

  1. 使用整数而不是指针。整数是内存池中的偏移量。整数被包装在一个类中(重载“->”和“*”),使其看起来像一个指针。
  2. 内存池对象管理着一个连续的对象数组,可以很容易地转移到 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?

4

1 回答 1

1

OP 能够通过使用如下静态类方法包装全局范围 __device__ 变量来解决此问题:

class FooBar;
__device__ FooBar* FOOBAR_DEVICE_POOL;
class FooBar
{
    __device__ static FooBar& DEVICE_GET(uint64_t p);
}

template<typename T>
class MemPoolPointer {
public:
    inline T* operator -> () const
    {
#ifdef __CUDA_ARCH__
        return &( T::DEVICE_GET(_p) );
#else
        return &( MemPool<T>::get_instance.get_object(_p) );
#endif
    }
    uint64_t _p;
}

[此答案添加为社区 wiki 条目,以将问题从 CUDA 标签的未回答队列中删除]

于 2016-11-14T10:32:40.123 回答