这是一个非常复杂的问题,我不是母语为英语的人,所以如果你有足够的耐心来阅读我的问题,我会感谢你。
由于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?
答案 0 :(得分: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标记的未答复队列中获取问题]