0

我需要在 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
}

我的第一个问题是:
还有其他几个类继承自它们Foo
并且它们具有不同的大小,那么我该如何:

  • 将所有创建的类型类Foo和所有派生类复制到设备
  • 甚至更好的是,将整个链表完全存储Foo在设备上

我不必从Foo主机上访问数据,
需要在设备上。

我的第二个问题:
我有多个 CUDA 设备(3 个支持 CUDA 的显卡)
我如何访问两个设备上的设备双向链表?

  • 点对点复制?
  • 别的东西?
4

2 回答 2

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 对象,可能没有什么可写的。不过,希望这能说明中心思想。

于 2013-06-29T08:05:09.240 回答
-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); }
于 2013-06-28T19:11:16.493 回答