亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GPU不能完全取代CPU的最大原因指的是什么

發布時間:2022-01-14 09:09:50 來源:億速云 閱讀:438 作者:柒染 欄目:大數據

小編今天帶大家了解GPU不能完全取代CPU的最大原因指的是什么,文中知識點介紹的非常詳細。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內容,希望能夠幫助更多想解決這個問題的朋友找到問題的答案,下面跟著小編一起深入學習“GPU不能完全取代CPU的最大原因指的是什么”的知識吧。

最近寫 CUDA 寫出精神病,以 NVIDIA GPU 為例分析下

GPU的相比CPU有幾個特點

  • 運算資源非常豐富

  • 控制部件占的面積比較小

  • 內存帶寬大,目前獨顯都采用 GDDR5 顯存,位寬也高,主流獨顯內存帶寬是CPU的十倍(200GB/s 對比 20GB)

  • 內存延遲高,對比 CPU 使用多級緩存掩蓋延遲,GPU 采用多線程掩蓋延遲

  • 寄存器資源極為豐富,32bit 寄存器有 64k ,單線程可用 255 個

所以,GPU 只適合處理分支少,數據量大,延遲不敏感的任務。

先看一個GTX 1080 (Compute capability 6.1) 的 SM(stream multiprocessor) 結構

GPU不能完全取代CPU的最大原因指的是什么  
CC 6.0 SM,來自NVDIA

可以看到,一個 SM 中包含4個 Warp,每個 Warp 含有 32 個 CUDA Core【1】。那么,是不是一個Warp 就相當于 CPU 的 32 核呢?

一、 GPU 不適合處理大量分支

我們上面說了,GPU 控制部件面積比較小,為了節約控制器,32 個 CUDA Core 必須時刻執行同樣的指令。也就是說,一個 Warp 內部的所有 CUDA Core 的 PC(程序計數器)一直是同步的【2】,但是訪存地址是可以不同的,每個核心還可以有自己獨立的寄存器組,這種執行方式叫做 SIMT(Single Instruction Multi Trhead)。

這是,你可能會問,如果這一個 Warp 中永遠都在執行相同的指令,如果分支了怎么處理呢?

問的好,其實 Warp 中的 CUDA Core 并不是真的永遠都執行相同的指令,它還可以不執行啊

GPU不能完全取代CPU的最大原因指的是什么  
An example of warp divergence(http://15418.courses.cs.cmu.edu/spring2013/article/11)

這樣會導致 Warp Divergence(見上圖)。如果極端情況下,每一個Core的指令流都不一樣,那么甚至還可能導致一個 Warp 中僅有一個 Core 在工作,效率降低為 1/32.

二、GPU 需要數據高度對齊

別看 GPU 一個 Warp 核心這么多,帶寬看起來這么大,但是實際上一個一個 Warp 的內存訪問是成組的,一次只能讀取連續的且對齊的 128byte。【3】(這正好是WarpSize 32 * 4 byte)

GPU不能完全取代CPU的最大原因指的是什么  

上圖這種操作的效率是最高的。如果訪問完全分散,那么效率可能會又變成1/32.如下圖。

GPU不能完全取代CPU的最大原因指的是什么  

而且 NVIDIA GPU 的緩存策略和 CPU 也不同,沒有時間局部性

DIFFERENCE BETWEEN CPU L1 CACHE AND GPU L1 CACHE  
The CPU L1 cache is optimized for both spatial and temporal locality. The GPU L1 cache is designed for spatial but not temporal locality. Frequent access to a cached L1 memory location does not increase the probability that the data will stay in cache.  
-- 《Professional CUDA Programming》

你可能又會問,CPU 的 Cache line 不也有 64bytes嘛,也就比 GPU 少一半啊,這有什么差別嗎?當然有,CPU 是一個核心一個 L1,GPU 是兩個 Warp 一個 L1 Cache【4】整個Warp 有一個核心數據沒準備好都執行不了。

當然,這么苛刻的訪存條件,如果真的做 C = A+ B 還是沒什么問題的,現實中訪存不會真的這么對齊,所以NVIDIA也下了很多功夫,準備了 Cache 和 Shared Memory, Constant Cache 等部件,力求讓程序員能高效訪問內存。

三、GPU 訪存延遲大

說起來訪存延遲和上一節的對齊還是有不少關系,這里分開講。

你可能還注意到,一個 SM(CC6.1) 最多可同時啟動 1024 個線程,但是一個 SM 中僅有 4個 Warp 共計 4 * 32 = 128 個 CUDA Core。顯然一個SM可以啟動的線程數比 CUDA Core 的數量大好多。這是為什么呢。

我們看下典型的 GPU 訪存延遲(《Professional CUDA Programming》數據可能有點老)

10-20 cycles for arithmetic operations  
400-800 cycles for global memory accesses

訪存一次能做40個運算啦!但是GPU的顯存帶寬實際上是非常高的。怎么能讓CudaCore 盡量滿載呢?這時 SIMT 就上場了。

沒關系,這個 Warp (這里指32個線程,之前文中混淆了調度單位和硬件單位)在等數據準備好,我們可以執行另外一組32個線程嘛,這樣雖然延遲還是很大,但是 CUDA Core 和 Memory 都能夠充分利用。

GPU 的線程切換不同于 CPU,在 CPU 上切換線程需要保存現場,將所有寄存器都存到主存中,而我們最開始說了,一個 SM 中有高達 64k 個 (注意不是64kbytes,有些中文書寫錯了)4 bytes 寄存器。而每個 Thread 最高使用的寄存器數量為255。少年你發現什么了嗎?

256 * 4 * 32 = 32k。也就是說我每個線程把寄存器用到爆,也才用了一半的寄存器,那多出來的這些寄存器是干啥的?

其實,GPU 的線程切換只是切換了寄存器組,延遲超級低,幾乎沒有成本。考慮到通常線程并不會使用高達255個寄存器,實際上一個 CUDA Core 可以隨時在八個線程之間反復橫跳,那個線程數據準備好了就執行哪個【5】。這是 GPU 優于 CPU 的地方,也是為了掩蓋延遲沒辦法的事情。

總而言之,GPU 訪存還是需要對齊,而且延遲還是很大,但是最大吞吐量(在場景合適的情況下,一個比較長的單位時間,處理的數據量)是遠高于 CPU 的。

【注1】LD/SD 是存取部件,用來訪問顯存,SFU 為超越函數單元

【注2】 Volta 架構重大更新,目前允許每個線程有單獨PC

【注3】經過 L1 Cache 的數據讀取是以 128 byte 為單元,還可以配置為不經過緩存,單元大小為32byte,寫入操作單元大小可以為為 32,64,128 bytes,本條說的都是 Global Memory access。

【注4】NVIDIA GPU 的 Cache 最近幾代架構變化明顯,具體架構請具體分析

【注5】實際上線程切換是以 Warp 為單位

感謝大家的閱讀,以上就是“GPU不能完全取代CPU的最大原因指的是什么”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家帶來更優質的文章。謝謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双鸭山市| 灵武市| 哈巴河县| 灯塔市| 平乡县| 侯马市| 阿荣旗| 和田市| 玉溪市| 通山县| 吉木乃县| 福建省| 广安市| 东宁县| 安阳市| 岗巴县| 花莲县| 乌海市| 饶阳县| 舟山市| 林州市| 泰和县| 临朐县| 丘北县| 隆林| 台北县| 会东县| 成都市| 荔浦县| 滕州市| 竹溪县| 博野县| 同心县| 桃江县| 家居| 资源县| 连云港市| 英山县| 湟中县| 社旗县| 石屏县|