為了更好地壓榨gpu和cpu,很多時候都使用異步并行的方法讓主機端與裝置端并行執行,即控制在裝置沒有完成任務請求前就被傳回給主機端。
異步執行的意義在于:首先,處于同一資料流内的計算與資料拷貝都是依次進行的,但一個流内的計算可以和另一個流的資料傳輸同時進行,是以通過異步執行就能夠使gpu中的執行單元與存儲器單元同時工作,更好地壓榨gpu的性能;其次,當gpu在進行計算或者資料傳輸時就傳回給主機線程,主機不必等待gpu運作完畢就可以進行進行一些計算,更好地壓榨了cpu的性能。
之前,單單使用gpu的同步函數,會使裝置在完成請求任務前,不會傳回主機線程,主機線程将進入讓步(yield)、阻滞(block)或者自旋(spin)。
下面一個sdk簡單的異步并行執行的程式:
執行結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyUDN1IDNzgDM1ETOwYTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
代碼中
gpu上執行的是對每一個資料進行加26的處理,在cpu上執行加1疊代,
執行結果依次是gpu執行的時間,異步時cpu調用gpu所用的時間,以及在gpu上進行計算時cpu進行疊代的次數。
其中:
void *memset(void *s, int ch, size_t n);
函數解釋:将s中前n個位元組替換為ch并傳回s;
memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法。
helper_timer.h在c:\programdata\nvidia corporation\cuda samples\v7.5\common\inc下是在cuda取消了cutil.h後包含計時的一個檔案
cudathreadsynchronize()函數是是cpu與gpu同步