2012-09-28 31 views
10

主機等設備完好無損嗎? 例如該程序的結構如下CPU等待DEVICE讓它完成其內核執行....?

// cpu code segment 

// data transfer from host to device 

QUESTION - WILL CPU WAIT FOR DEVICE TO FINISH TRANSFER? IF NO, IS IT POSSIBLE? IF YES, HOW? 

// kernel launch 

QUESTION - WILL CPU WAIT FOR DEVICE TO LET IT FINISH KERNEL EXECUTION (CONSIDERING KERNEL EXECUTION WILL TAKE NOTABLE TIME say-5 sec)? IF NO, IS IT POSSIBLE? IF YES, HOW? 

// data transfer from device to host 

// program terminates after printing some information 
+0

@Spontifixus,不是很清楚嗎?我想知道與OP一樣。 –

+1

@Primož'c0dehunter'Kralj你說得對。問題只是格式不正確。 – Spontifixus

回答

14

CUDA運行時的同步功能可以讓你實現你想要的。

cudaDeviceSynchronize()

當你調用此功能時,CPU會等到設備已經完成了所有的工作,無論是內存複製或內核執行。

cudaStreamSynchronize(cudaStream)

該功能將阻止CPU直到指定CUDA流已完成它的執行。其他CUDA流將異步地繼續執行。

+6

爲了擴展這個問題,有兩個問題:1)對於數據傳輸,如果使用'cudaMemcpy()' - 如果使用異步版本('cudaMemcpyAsync()'),CPU將阻塞並等待傳輸完成。那麼它是異步的,並且CPU不會阻塞(顯然); 2)內核啓動始終是異步的,如編程指南中所述 - 內核調用(使用'cudaDeviceSynchronize()'(或流等效)或調用同步memcpy後同步會導致CPU阻塞。) – Tom

+1

還要記住,如果你使用GPU,理想情況下,您可以複製數據並異步執行內核 - 也可以很好地利用所有引擎! – Tom