2017-02-18 38 views
-2

我在同一個文件中有兩個內核,代碼應該運行第一個內核來生成一個數組。那麼我需要將生成的數組發送到第二個內核。然而,當我這樣做時,第二個內核看到所有數組元素都是0.啓動CUDA內核序列和它們之間的數據傳輸

這裏是簡化(不是可運行的代碼)只是一個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) 

for testing ..在kernel2中,我在device_result_array上創建一個循環,它將它的所有元素都打印爲零。

什麼是在內核之間發送數據的正確方式。我應該再次爲結果數組保留空間嗎?我該怎麼辦?

回答

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)

在這兩種情況下,都不要將中間結果複製到主機(除非您確實需要其他原因)。主機< - >設備副本很貴。