如何有效地将内核malloc数据返回到cpu

时间:2016-05-24 09:01:03

标签: c++ cuda gpgpu

让我说我malloc内核中的一些结构,我在那里进行了一些计算。然后我想返回这些变量,但是当我初始化内核时它们不是作为指针发送的,所以如果我想返回这些值。我该怎么做呢?以下示例代码。

我只是将此问作为一般性问题,不解决下面的代码。我有其他问题,我遇到这个问题,我不知道最好的方法是什么。我知道你可以扔一个指针并将结果复制到它上面。但是,如果结果的大小没有预先确定,那么很难有效地做到这一点。所以我在问是否有更好的方法。

__global__ void addKernel()
{
    int* c = (int*)malloc(sizeof(int) * 32);
#pragma unroll
    for (int i = 0; i < 32; i++){
        c[i] += 1;
    }
}

1 个答案:

答案 0 :(得分:2)

主机端API调用无法使用使用设备端分配(newmalloccudaMalloc)分配的指针。因此,传输存储在设备运行时分配的内存中的数据的唯一方法是将其在内核中复制到主机分配的内存并传递给正在运行的内核。

设备运行时支持设备到设备内存副本的memcpycudaMemcpyAsync。我怀疑在这种情况下那些将是你最好的选择。您应该仔细研究文档的this section,以便了解设备运行时API的限制。