【发布时间】: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从错误的位置复制。&devNodes是三重指针而不是双指针。这可能无法解决所有问题,但应该是一个开始。 -
谢谢你,@Shadow!