2016-05-24 34 views
0

可以说我malloc一些结构在内核中,我执行了一些计算。然后我想返回这些变量,但是当我初始化内核时,它们并没有作为指针发送,所以如果我想返回这些值。我会怎么做呢?下面的示例代码。我如何有效地返回内核malloc数据回到CPU

我只是问这是一个普遍的问题,不解决下面的代码。我遇到过其他问题,我不知道怎么去解决这个问题。我明白,你可以抛出一个指针并将结果复制到它上面。然而,如果结果的大小不是预先确定的,那么这将非常困难。所以我在问是否有更好的方法。

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

回答

2

指针使用设备侧分配(newmalloc,或cudaMalloc)不能由主机侧的API调用被用于分配。因此,传输设备运行时分配的内存中存储的数据的唯一方法是将其在内核中复制到主机分配的内存中,并传递给正在运行的内核。

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

+0

我已经阅读过这个部分,但并没有准备好放弃这个想法:)我正在考虑使用uva和一个标题来指示数据是否被gpu和cpu操纵继续扫描位置。这是个好主意吗?如果你想让我把代码写出来,我会在家以后做。 –

+0

我想你应该提供一些关于你正试图解决的问题的更多信息。有许多不同的策略可以用来处理输出可变数据量的内核,您通常不需要设备端malloc。 –