我在同一个文件中有两个内核,代码应该运行第一个内核来生成一个数组。然后我需要将生成的数组发送到第二个内核。 但是,当我这样做时,第二个内核看到所有数组元素都是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上创建一个循环,它如何将所有元素打印为零。
在内核之间发送数据的正确方法是什么。我应该再次为结果数组预留空间吗?我该怎么办?
答案 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;设备副本很昂贵。