【CUDA 基礎】5.1 CUDA共享內存概述


title: 【CUDA 基礎】5.1 CUDA共享內存概述
categories:
- CUDA
- Freshman
tags:
- CUDA共享內存模型
- CUDA共享內存分配
- CUDA共享內存訪問
- CUDA共享內存配置
- CUDA共享內存同步
toc: true
date: 2018-06-01 17:46:23


Abstract: 本文爲CUDA內存的概述,介紹共享內存的模型,分配,訪問,配置,同步等內容
Keywords: 模型,分配,訪問,配置,同步web

開篇廢話

這裏首先要進一步說明一下,前面咱們在說緩存的時候說其是可編程的,這是不許確的,應該說是能夠控制的,而咱們今天要說的共享內存纔是真正意義上的可編程的。
廢話很少說了,一套CUDA內容寫到如今,一大半已經進行完了,但願咱們在一個系列完成後都能有所成長,而不是純粹的閱讀或者碼字。
GPU內存按照類型(物理上的位置)能夠分爲編程

  • 板載內存
  • 片上內存

全局內存是較大的板載內存,延遲高,共享內存是片上的較小的內存,延遲低,帶寬高。前面我咱們講過工廠的例子,全局內存就是原料工廠,要用車來運輸原料,共享內存是工廠內存臨時存放原料的房間,取原料路程短速度快。
共享內存是一種可編程的緩存,共享內存一般的用途有:緩存

  1. 塊內線程通訊的通道
  2. 用於全局內存數據的可編程管理的緩存
  3. 告訴暫存存儲器,用於轉換數據來優化全局內存訪問模式

本章咱們研究兩個例子:svg

  1. 歸約核函數
  2. 矩陣轉置核函數

共享內存

共享內存(shared memory,SMEM)是GPU的一個關鍵部分,物理層面,每一個SM都有一個小的內存池,這個線程池被次SM上執行的線程塊中的全部線程所共享。共享內存使同一個線程塊中能夠相互協同,便於片上的內存能夠被最大化的利用,下降回到全局內存讀取的延遲。
共享內存是被咱們用代碼控制的,這也是是他稱爲咱們手中最靈活的優化武器。
結合咱們前面學習的一級緩存,二級緩存,今天的共享內存,以及後面的只讀和常量緩存,他們的關係以下圖:函數

5-1

SM上有共享內存,L1一級緩存,ReadOnly 只讀緩存,Constant常量緩存。全部從Dram全局內存中過來的數據都要通過二級緩存,相比之下,更接近SM計算核心的SMEM,L1,ReadOnly,Constant擁有更快的讀取速度,SMEM和L1相比於L2延遲低大概20~30倍,帶寬大約是10倍。
下面咱們瞭解下共享內存的生命週期和讀取性質。
共享內存是在他所屬的線程塊被執行時創建,線程塊執行完畢後共享內存釋放,線程塊和他的共享內存有相同的生命週期。
對於每一個線程對共享內存的訪問請求學習

  1. 最好的狀況是當前線程束中的每一個線程都訪問一個不衝突的共享內存,具體是什麼樣的咱們後面再說,這種狀況,你們互不干擾,一個事務完成整個線程束的訪問,效率最高
  2. 當有訪問衝突的時候,具體怎麼衝突也要後面詳細說,這時候一個線程束32個線程,須要32個事務。
  3. 若是線程束內32個線程訪問同一個地址,那麼一個線程訪問完後以廣播的形式告訴你們

後面的全章內容都是基本圍繞如何避免訪問衝突,高效的是有共享內存來展開的。優化

注意咱們剛纔說的共享內存的生命週期是和其所屬的線程塊相同的,這個共享內存是編程模型層面上的。物理層面上,一個SM上的全部的正在執行的線程塊共同使用物理的共享內存,因此共享內存也成爲了活躍線程塊的限制,共享內存越大,或者塊使用的共享內存越小,那麼線程塊級別的並行度就越高。
共享內存,高端有限資源,合理使用!線程

接着說說可編程,矩陣乘法的串行形式,最簡單的方式是三層循環,經過調整循環能夠得到更好的緩存命中率,這個題在找工做筆試的時候有,當時在大學筆試工做的時候,我會很傻x的在筆試習題上寫上註釋,能夠經過調整循環順序提升緩存命中率,可是如今想一下,CPU的緩存是不可控制的,你只能調整本身的程序來適應它。
GPU高端的一點,就是你不止有一個緩存能夠編程控制,而是有好幾個。3d

共享內存分配

完整內容參考 https://face2ai.com/CUDA-F-5-1-CUDA共享內存概述/xml

相關文章
相關標籤/搜索