對於kepler架構gpu的新特性——hyperq,往上的討論貼子還是比較少的,官方文件中也只是有乙個sample,給出了**,但對於有些情況下,hyperq不能成功的原因沒有過多的涉及,我們今天就來談一談。hyperq允許多個cpu執行緒或程序同時向乙個gpu發射任務,提高了gpu的使用率。
我們來看乙個例子:
c/c++ code
? 1
2
3
4
5
6
for
(
int
i = 0; i
如果是在fermi架構上執行上述**,每乙個流的三個kernel函式會序列執行,它們有各自的任務佇列,根據流的特性,只有a1 c0和a2 c1會具有並行性,如下圖:
c/c++ code
? 1
2
3
4
5
6
7
for
(
int
i = 0; i
下圖是在fermi架構的時序圖:
可見,hyperq特性將同時執行所有流的kernel函式。
下面我們來討論兩個問題:
1. hyperq和流的關係:
hyperq和流的區別。我們看到上邊的例子都有流的參與,流可以實現「資料的傳輸和kernel函式同步執行」,即傳輸資料的同時,執行kernel函式;而hyperq則是更高大上的實現了kernel同時執行。如果程式的函式執行時間遠遠大於資料的傳輸時間,那麼hyperq就減少了很多很多的執行時間。二者實現的功能是不一樣的,這對於初次接觸hyperq的小夥伴們是容易迷惑的地方。
2. 只要是kepler架構的gpu,按照上述例子那樣寫**,就一定能實現kernel函式並行嗎?
不一定。這句話正確的描述應該是:「只要是kepler架構的gpu就可以支援hyperq特性,而hyperq能不能達到使kernel函式並行的目的是不一定的,要看gpu的資源狀況」。什麼意思?就是說:如果gpu還有資源,包括視訊記憶體、空閒的smx等,那麼是可以並行的,如果乙個kernel已經讓gpu滿載運作了,還怎麼加入第二個kernel,更不用說多個並行了。有興趣的小夥伴們可以自行將cuda中hyperq的例子使用的資源量加大,在觀察時序圖。因此,任何高大上的新特性,都是有使用前提的,不能一味的盲目使用。
上述兩點就是本人使用hyperq的心得,如果在資源允許、gpu沒有滿載的情況下,hyperq還是乙個很好的特性,減少了程式執行時間;但如果kernel函式的任務量很繁重,那麼hyperq就體現不出kernel並行的特點了,實際執行還是序列的。大家也來談談你們使用hyperq時遇到的問題吧~
H5常用新特性
注意 這些新特性都有相容性的問題,基本是ie9 以上版本的瀏覽器才支援,如果不考相容性問題,可以大量使用這些新特性 html5新增的語義話標籤 html新增的多 標籤 屬性值描述 autoplay autoplay controls controls width pixels height pxlo...
h5新特性 canvas標籤(補充)
上下文物件 painter 1.透明度 語法 painter.globalalpha 0 1 任何操作都要在fill 之前 2.線性 1 設定線寬 painter.linewidth number 2 端點 painter.lincap 端點型別 型別 butt 無端點,round 圓弧端點 squ...
H5新特性 本地儲存
注意 本地儲存呼叫者必須統一,用臨時儲存儲存的資料,只有臨時儲存才能找到 localstorage 永久儲存 相對 其中的資料不隨著瀏覽器的開關而改變 sessionstorage 臨時儲存 相對 當瀏覽器關閉 當前頁面關閉時,資料消失,頁面重新整理時不會影響 兩者區別 local 和 sessio...