假设我在内核中malloc
一些结构,我在其中执行了一些计算。然后我想返回这些变量,但是当我初始化内核时它们没有作为指针发送,所以如果我想返回这些值。我将如何去做呢?下面的示例代码。
我只是作为一般性问题提出这个问题,而不是解决下面的代码。我遇到了其他问题,但我不知道最好的解决方法是什么。我知道您可以只放入一个指针并将结果复制到它上面。然而,如果结果的大小不是预先确定的,那么就很难有效地做到这一点。所以我想问一下有没有更好的方法。
__global__ void addKernel()
{
int* c = (int*)malloc(sizeof(int) * 32);
#pragma unroll
for (int i = 0; i < 32; i++){
c[i] += 1;
}
}
最佳答案
主机端 API 调用不能使用使用设备端分配(new
、malloc
或 cudaMalloc
)分配的指针。因此,传输存储在设备运行时分配的内存中的数据的唯一方法是在内核中将其复制到主机分配的内存并传递给正在运行的内核。
设备运行时支持memcpy
和cudaMemcpyAsync
用于设备到设备的内存复制。我怀疑在这种情况下,这些将是您的最佳选择。你应该学习this section仔细阅读文档,以便您了解设备运行时 API 的限制。
关于c++ - 如何有效地将内核 malloc 数据返回给 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408859/