Abstract: 本文爲CUDA內存的概述,介紹共享內存的模型,分配,訪問,配置,同步等內容
Keywords: 模型,分配,訪問,配置,同步web
這裏首先要進一步說明一下,前面咱們在說緩存的時候說其是可編程的,這是不許確的,應該說是能夠控制的,而咱們今天要說的共享內存纔是真正意義上的可編程的。
廢話很少說了,一套CUDA內容寫到如今,一大半已經進行完了,但願咱們在一個系列完成後都能有所成長,而不是純粹的閱讀或者碼字。
GPU內存按照類型(物理上的位置)能夠分爲編程
全局內存是較大的板載內存,延遲高,共享內存是片上的較小的內存,延遲低,帶寬高。前面我咱們講過工廠的例子,全局內存就是原料工廠,要用車來運輸原料,共享內存是工廠內存臨時存放原料的房間,取原料路程短速度快。
共享內存是一種可編程的緩存,共享內存一般的用途有:緩存
本章咱們研究兩個例子:svg
共享內存(shared memory,SMEM)是GPU的一個關鍵部分,物理層面,每一個SM都有一個小的內存池,這個線程池被次SM上執行的線程塊中的全部線程所共享。共享內存使同一個線程塊中能夠相互協同,便於片上的內存能夠被最大化的利用,下降回到全局內存讀取的延遲。
共享內存是被咱們用代碼控制的,這也是是他稱爲咱們手中最靈活的優化武器。
結合咱們前面學習的一級緩存,二級緩存,今天的共享內存,以及後面的只讀和常量緩存,他們的關係以下圖:函數
SM上有共享內存,L1一級緩存,ReadOnly 只讀緩存,Constant常量緩存。全部從Dram全局內存中過來的數據都要通過二級緩存,相比之下,更接近SM計算核心的SMEM,L1,ReadOnly,Constant擁有更快的讀取速度,SMEM和L1相比於L2延遲低大概20~30倍,帶寬大約是10倍。
下面咱們瞭解下共享內存的生命週期和讀取性質。
共享內存是在他所屬的線程塊被執行時創建,線程塊執行完畢後共享內存釋放,線程塊和他的共享內存有相同的生命週期。
對於每一個線程對共享內存的訪問請求學習
後面的全章內容都是基本圍繞如何避免訪問衝突,高效的是有共享內存來展開的。優化
注意咱們剛纔說的共享內存的生命週期是和其所屬的線程塊相同的,這個共享內存是編程模型層面上的。物理層面上,一個SM上的全部的正在執行的線程塊共同使用物理的共享內存,因此共享內存也成爲了活躍線程塊的限制,共享內存越大,或者塊使用的共享內存越小,那麼線程塊級別的並行度就越高。
共享內存,高端有限資源,合理使用!線程
接着說說可編程,矩陣乘法的串行形式,最簡單的方式是三層循環,經過調整循環能夠得到更好的緩存命中率,這個題在找工做筆試的時候有,當時在大學筆試工做的時候,我會很傻x的在筆試習題上寫上註釋,能夠經過調整循環順序提升緩存命中率,可是如今想一下,CPU的緩存是不可控制的,你只能調整本身的程序來適應它。
GPU高端的一點,就是你不止有一個緩存能夠編程控制,而是有好幾個。3d