我需要在cuda设备上创建一个双向链表 我有主持人代码:
class Foo
{
public:
int my_index;
static int count;
static int index;
static Foo* first;
static Foo* last;
Foo* next;
Foo* prev;
Foo(); //adds object to list
~Foo(); //deletes object from list
}
Foo* Foo::first = 0;
Foo* Foo::last = 0;
int Foo::count = 0;
int Foo::index = 0;
当我想要遍历它时:
for (Foo* pr = Foo::first; pr; pr = pr->next)
{
//do something
}
我的第一个问题是:
<{1}}中有继承的几个其他类
它们有不同的尺寸,我怎么能:
Foo
的类以及设备的所有派生类Foo
的整个链接列表我不必访问主机上Foo
的数据,
我需要在设备上 。
我的第二个问题:
我有多个CUDA设备(3个支持CUDA的图形卡)
我如何在两台设备上访问设备双向链表?
答案 0 :(得分:1)
我不熟悉CUDA,但听起来你需要将每个对象转换成某种形式,以便它可以转移到设备,问题是对象的大小不同,内容也不同。如果是这样,您应该能够使用虚函数解决问题,该函数将每个对象转换为可根据其类型传输的表单。例如,如果使用void *
缓冲区将数据作为二进制文件传输,则可能如下所示:
class Foo
{
public:
// ... Everything else ...
virtual void *add_transfer_data(void *buffer)
{
// Copy whatever makes sense for a Foo object into the buffer.
memcpy(buffer, [something], n);
return reinterpret_cast<unsigned char *>(buffer) + n;
}
};
class Bar: public Foo
{
public:
// ... Everything else ...
virtual void *add_transfer_data(void *buffer)
{
// First, take care of the Foo part of the object.
buffer = Foo::add_transfer_data(buffer, buffer_size);
// Now copy whatever else a Bar object needs into the buffer.
memcpy(buffer, [something], m);
return reinterpret_cast<unsigned char *>(buffer) + m;
}
};
void transfer_data(void *buffer)
{
void *next_location = buffer;
for (Foo* pr = Foo::first; pr; pr = pr->next)
{
next_location = pr->add_transfer_data(next_location);
}
// Send the contents of buffer to the device somehow.
}
当然,您的add_transfer_data
版本可能会有很大不同,具体取决于传输的工作方式和对象的外观。例如,可能没有什么可以为普通的Foo对象编写。但是,希望这说明了中心思想。
答案 1 :(得分:-3)
我对CUDA一无所知,所以可能有更好的答案。
如果您的问题是确定Foo
实例的大小,那么为什么不给该类一个虚拟的size
方法?
// In Foo:
virtual size_t size() const;
// In class T, a derivation of Foo:
size_t size() const override { return sizeof(T); }