天天看點

CUDA入門(六) 異步并行執行解析

為了更好地壓榨gpu和cpu,很多時候都使用異步并行的方法讓主機端與裝置端并行執行,即控制在裝置沒有完成任務請求前就被傳回給主機端。

異步執行的意義在于:首先,處于同一資料流内的計算與資料拷貝都是依次進行的,但一個流内的計算可以和另一個流的資料傳輸同時進行,是以通過異步執行就能夠使gpu中的執行單元與存儲器單元同時工作,更好地壓榨gpu的性能;其次,當gpu在進行計算或者資料傳輸時就傳回給主機線程,主機不必等待gpu運作完畢就可以進行進行一些計算,更好地壓榨了cpu的性能。

之前,單單使用gpu的同步函數,會使裝置在完成請求任務前,不會傳回主機線程,主機線程将進入讓步(yield)、阻滞(block)或者自旋(spin)。

下面一個sdk簡單的異步并行執行的程式:

執行結果:

CUDA入門(六) 異步并行執行解析

代碼中

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同步