【问题标题】:Access an array of pointers to objects on device CUDA访问指向设备 CUDA 上对象的指针数组
【发布时间】:2020-08-25 06:31:25
【问题描述】:

CUDA 和 gpu 编程新手,在将对象指针数组复制到设备时遇到问题。

我有一个对象指针向量,每个对象包含两个向量,我将在设备代码中使用它们。

我需要以某种方式将该数组复制到设备内存中,但是在阅读了类似的解决方案之后,仍然无法弄清楚。

这是一个对象的结构,我正在使用:

   std::vector<int> retVals;
   std::vector<int> children{4};

所以,我不仅需要复制数组,还需要将这些向量转换为每个对象中的 int 数组。

编辑:

这就是我目前想出的:

auto **nodesPtr = ( aho_corasick::Node**)malloc(a->nodes.size() * sizeof(aho_corasick::Node *));

    int i = 0;
    for (auto &node: a->nodes){
        auto *newNode = new aho_corasick::Node(' ');

        cudaMalloc((void**)&(newNode->cudaChildren), sizeof(int) * node->children.size());
        cudaMemcpy(newNode->cudaChildren, node->children.data(), sizeof(int) * node->children.size(), cudaMemcpyHostToDevice);
        cudaMalloc((void**)&(newNode->cudaRets), sizeof(int) * node->retVals.size());
        cudaMemcpy(newNode->cudaRets, node->children.data(), sizeof(int) * node->retVals.size(), cudaMemcpyHostToDevice);

        aho_corasick::Node* devNode;

        cudaMalloc((void**)&devNode, sizeof(aho_corasick::Node));
        cudaMemcpy(devNode, newNode, sizeof(aho_corasick::Node), cudaMemcpyHostToDevice);

        nodesPtr[i++] = devNode;
    }

    aho_corasick::Node **devNodes;

    cudaMalloc((void **)&devNodes, a->nodes.size() * sizeof(aho_corasick::Node *));
    cudaMemcpy(devNodes, nodesPtr, a->nodes.size() * sizeof(aho_corasick::Node *), cudaMemcpyHostToDevice);

似乎还是不行。

另外,在 CUDA 术语中这样的代码有多糟糕,我将如何绕过指针数组?

EDIT2

忘了指出:我在我的对象中添加了两个额外的字段:两个 int 数组,在 for 循环中我正在创建一个新对象,我将两个对应的向量复制到其中(到 int 数组字段中),然后我正在使用这些字段在设备内存中创建一个新对象。

然后,在循环之后,我在设备内存中分配对象指针数组。

【问题讨论】:

  • 您的第二个 cudaMemcpy 从错误的位置复制。 &amp;devNodes 是三重指针而不是双指针。这可能无法解决所有问题,但应该是一个开始。
  • 谢谢你,@Shadow!

标签: c++ cuda gpu


【解决方案1】:
  auto **nodesPtr = (aho_corasick::Node **) malloc(a->nodes.size() * sizeof(aho_corasick::Node *));

    int i = 0;

    for (auto &node: a->nodes) {

        auto *newNode = new aho_corasick::Node(' ');

        cudaMalloc((void **) &(newNode->cudaChildren), sizeof(int) * node->children.size());
        cudaMemcpy(newNode->cudaChildren, node->children.data(), sizeof(int) * node->children.size(),
                   cudaMemcpyHostToDevice);
        cudaMalloc((void **) &(newNode->cudaRets), sizeof(int) * node->retVals.size());
        cudaMemcpy(newNode->cudaRets, node->retVals.data(), sizeof(int) * node->retVals.size(),
                   cudaMemcpyHostToDevice);

        newNode->retsCount = node->retVals.size();

        aho_corasick::Node *devNode;

        cudaMalloc((void **) &devNode, sizeof(aho_corasick::Node));
        cudaMemcpy(devNode, newNode, sizeof(aho_corasick::Node), cudaMemcpyHostToDevice);

        nodesPtr[i++] = devNode;
    }


    aho_corasick::Node **devNodes;

    cudaMalloc((void ***) &devNodes, a->nodes.size() * sizeof(aho_corasick::Node *));
    cudaMemcpy(devNodes, nodesPtr, a->nodes.size() * sizeof(aho_corasick::Node *), cudaMemcpyHostToDevice);

这就是我将对象数组复制到设备中的方式。然而,事实证明,对于我的任务,这种方法是不可接受的。复制所有对象需要几个小时。

关闭此线程,但如果有人知道如何避免使用指针数组从而避免复制,请告诉我。

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2011-07-18
    • 2014-11-07
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2012-03-09
    相关资源
    最近更新 更多