Доступ к массиву указателей на объекты на устройстве CUDA - PullRequest
0 голосов
/ 09 мая 2020

Новичок в программировании на CUDA и gpu, возникла проблема с копированием массива указателей объектов на устройство.

У меня есть вектор указателей на объекты, каждый объект содержит два вектора, с которыми я буду работать в коде устройства .

Мне нужно как-то скопировать этот массив в память устройства, однако, прочитав похожие решения, я все еще не могу понять.

Это структура объекта, я работаю с:

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

Итак, мне не только нужно сделать копию массива, мне также нужно преобразовать эти векторы в массив int в каждом объекте.

EDIT:

Вот что я придумал до сих пор:

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, и как мне go вокруг массива указателей?

EDIT2 :

Забыл указать: я добавил два дополнительных поля в свои объекты: два массива int и для l oop я создаю новый объект, в который я копирую два соответствующих вектора (в поля массива int), а после этого я создаю новый объект в памяти устройства с этими полями.

Затем, после l oop, я выделяю массив указателей объектов i n память устройства.

1 Ответ

1 голос
/ 09 мая 2020
  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);

Вот как я скопировал свой массив объектов в устройство. Однако, как выясняется, для моей задачи такой подход неприемлем. Копирование всех объектов занимает несколько часов.

Закрытие этой цепочки, но если кто-то знает, как избежать использования массива указателей и, следовательно, избежать копирования, дайте мне знать.

...