启动CUDA内核序列并在它们之间进行数据传输

时间:2017-02-18 16:54:27

标签: cuda

我在同一个文件中有两个内核,代码应该运行第一个内核来生成一个数组。然后我需要将生成的数组发送到第二个内核。 但是,当我这样做时,第二个内核看到所有数组元素都是0。

这里是简化(不是可运行的代码)只是一个psyducode。

 cudaMalloc(device input array)
 cudaMalloc(result array)    
 cudaMemcpy(device_input_array,inputarray,size,hosttodevice)    
 kernel1<<<1,n>>(device_input_array,device_result_array)
 cudaMemcpy(host_result_array,device_result_array ... )     
 cudaMalloc(dev_secndarray)    
 kernel2<<<1,n>>>(dev_secndarray,device_result_array )

用于测试..在kernel2中我在device_result_array上创建一个循环,它如何将所有元素打印为零。

在内核之间发送数据的正确方法是什么。我应该再次为结果数组预留空间吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

通过cudaMalloc分配的内存一直存在,直到应用程序结束,或直到您明确释放内存为止。因此,device_result_array可以作为输入直接传递给第二个内核。我会推荐以下模式:

cudaMalloc(device_input_array)
cudaMalloc(device_intermediate_result_array)
cudaMalloc(device_final_result_array)
cudaMemcpy(device_input_array,host_input_array,size,hosttodevice) 
kernel1<<<G,B>>>(device_input_array,device_intermediate_result_array)
kernel2<<<G,B>>>(device_intermediate_result_array,device_final_result_array)
cudaMemcpy(host_result_array,device_final_result_array,size,devicetohost)

如果由于某种原因您确实需要在设备中复制中间结果,您可以选择拨打cudaMemcpy(...,cudaMemcpyDeviceToDevice)

在任何一种情况下,都不要将中间结果复制到主机(除非您出于其他原因确实需要它)。主机&lt; - &gt;设备副本很昂贵。