从设备迭代双向链表

时间:2013-06-28 18:27:19

标签: c++ cuda

我需要在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的图形卡)
我如何在两台设备上访问设备双向链表?

  • 点对点拷贝?
  • 别的什么?

2 个答案:

答案 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); }