kepler架构GPU新特性--HyperQ
生活随笔
收集整理的這篇文章主要介紹了
kepler架构GPU新特性--HyperQ
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于Kepler架構GPU的新特性——HyperQ,往上的討論貼子還是比較少的,官方文檔中也只是有一個sample,給出了代碼,但對于有些情況下,HyperQ不能成功的原因沒有過多的涉及,我們今天就來談一談。HyperQ允許多個CPU線程或進程同時向一個GPU發射任務,提高了GPU的使用率。
????????我們來看一個例子:
C/C++ code?
????????如果是在Fermi架構上運行上述代碼,每一個流的三個Kernel函數會串行執行,它們有各自的任務隊列,根據流的特性,只有A1?C0和A2?C1會具有并行性,如下圖:
????????我們再來看一個開發包自帶的例子:
C/C++ code?
????????下圖是在Fermi架構的時序圖:
????????而在具有HyperQ特性的Kepler架構的GPU上,時序圖是這樣子的:
????????可見,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時遇到的問題吧~
????????我們來看一個例子:
C/C++ code?
| 1 2 3 4 5 6 | for(int?i?=?0;?i?<?3;?i++) { ????????A<<<gdim,?bdim,?smem,?streams[i]>>>(); ????????B<<<gdim,?bdim,?smem,?streams[i]>>>(); ????????C<<<gdim,?bdim,?smem,?streams[i]>>>(); } |
????????如果是在Fermi架構上運行上述代碼,每一個流的三個Kernel函數會串行執行,它們有各自的任務隊列,根據流的特性,只有A1?C0和A2?C1會具有并行性,如下圖:
????????我們再來看一個開發包自帶的例子:
C/C++ code?
| 1 2 3 4 5 6 7 | for(int?i?=?0;?i?<?nstreams;?++i) { ????????kernel_A<<<1,?1,?0,?streams[i]>>>(&d_a[2?*?i],?time_clocks); ????????total_chocks?+=?time_clocks; ????????kernel_B<<<1,?1,?0,?streams[i]>>>(&d_a[2?*?i?+?1],?time_clocks); ????????total_clocks?+=?time_clocks; } |
????????下圖是在Fermi架構的時序圖:
????????而在具有HyperQ特性的Kepler架構的GPU上,時序圖是這樣子的:
????????可見,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時遇到的問題吧~
總結
以上是生活随笔為你收集整理的kepler架构GPU新特性--HyperQ的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ad采样做按键开关_电池应用中的电流采样
- 下一篇: cpu使用率 htop显示_Linux