推 hsz0566:高手過招...我的肉眼跟不上速度 XDrz 12/12 13:33
※ 引述《jk21234 ()》之銘言:
: 勘誤一些硬體觀念的部分.
: ※ 引述《a5000ml (咖啡裡的海洋藍)》之銘言:
: : ◆ 多處理器 (MP, Multiprocessors)
: : GPGPU 是以「多處理器」 為群組, 每個多處理器有 8 個單精確浮點數的「串流處理器」
: : (SP, Stream Processor) 負責運算, 這些串流處理器就是我們平常說的「核心」.
: : 所以像 GTX 280 有 30 個 MP, 裡面就有 30 x 8 = 240 個 SP 核心, 在不切換執行緒的
: : 情況下, 可以同時處理 240 個單精確的運算.
: 理想狀態下是480個(理由同第二段,fMADD以及fADD)
確實是 3 倍 (720個), 可以寫程式測試, 理由在下面描述
還有不是 FMAD+FADD, 而是 FMAD+FMUL
詳見 realworld tech 那篇 nv 工程師團隊寫的文章
http://www.realworldtech.com/page.cfm?ArticleID=RWT090808195242&p=9
FADD太簡單了, 為它做個專屬的硬體單元划不來
: : ◆ 運算效能估計
: : 運算效能一般採用「每秒能執行的浮點運算次數」GFlops (Giga float operations per
: : seconds)來衡量, NV 的 GPGPU 最大效能可用下面公式估計:
: : 單精確倍數 (增速因子為 3, 每個多處理器有 8 個單精確的串流處理器)
: : GFlops = 多處理器數目 x 8 x 3 x 處理器頻率(GHz)
: : (其中 3 是因為管線化因素所造成的「增速因子」)
: 跟管線無關,是因為在nVidia的SP中,可以執行一個float的MADD(multiply-add)
嗯嗯, 我這邊寫錯了 >"<... 謝謝
: 以及一個float ADD指令,而通常計算flops的時候,MADD又可以被視為一個
: 乘法與一個加法.當兩個指令灌水....(其實最原始的FLOPS必須是MADD或者是
: 一次乘法與一次加法才構成一個FLOPS,只是後來為了數字灌水,而把定義當成
: 乘法與加法不用合併計算)
FMAD 平均可在一個 cycle 做 a*b+c, 裡面執行一個乘法和一個加法運算,
PTX 確實有這道指令, 詳見 ToolKit 中附的 ptx_isa 的 pdf 文件
在 FLOP 的定義上 FMAD 是兩個浮點運算 throughput, 否則會混淆不清,
這種定義並不是在灌水 *****
若只是計算指令個數, 那不同機器上就無法有一致的 FLOP 定義,
有的機器有 FMAD, 有的只有 FMUL 和 FADD, 同樣程式到底要算 1 個還是算 2 個?
另外 VLIW 一道指令可做數個計算, 如果只算指令數, 而不是達成的計算數,
那它的 throughput 不就超低 (ATI 不就很吃虧, 它就是 VLIW 機器 >_<)
: 因此將MADD以及ADD當成每個SP每個cycle具有3 FLOPS(single)的能力
因為 dual issue 的技術, (詳見 realworld tech 一文)
平均可在 4 個 clocks 中完成 FMAD+FMUL,
亦即每個 SP 在一個 clock 之下最多可完成 3 個 flop
: 至於管線化造成的影響,已經反映在SP的平均throughput,以及
: SP時脈倍率是晶片的2.5倍這兩項上面.
是的
: : 雙精確倍數 (增速因子為 2, 每個多處理器只有 1 個雙精確的串流處理器)
: : GFlops = 多處理器數目 x 1 x 2 x 處理器頻率(GHz)
: 同上,這是因為GT200對於double,每個時脈可以執行一次MADD.
: 因此FLOPS算成每個SP每個時脈2次.
是的, SFU 中無 double 的 FMUL
所以無法 dual issue, 只能發 FMAD64, 所以只有 x2
: : 一般來說, 這種最大效能是達不到的, 因為我們還需要從記憶體中載入或儲存資料,
: : 位址轉換和執行緒定位計算, 條件分支指令, 各執行緒之間同步和交換資料, 以及
: : 內部記憶體競爭問題, GPU 做的工作並非單純直線型地只做浮點運算而己, 通常
: : 達到最大效能的 1/3 或 1/4, 就已經很驚人了。
: : ◆ 記憶體頻寬估計
: : 記憶體頻寬通常用每秒傳輸的資料量來衡量 GB/s (giga-bytes per seconds),
: : 其最大頻寬, 可用下面公式估計
: : 記憶體頻寬(GB/s) = 記憶體介面寬度(bits) x 記憶體時脈頻率(GHz) / 8 x 2
: : 其中 /8 是因為 1 個 byte 有 8 個 bits。
: : x2 是因為雙通道。
: x2是因為DDR SDRAM有兩倍的data rate.
: 跟雙通道無關,因為N通道會直接反映在記憶體bus的寬度上.
: 以256bit的G92來說,內部設計是每32bit一個channel,
: 構成256bit對256bit的crossbar架構.
嗯嗯, 這方面我會再去查清楚, 因為之前我看的是「資料線寬度」,
256 bit 就是在一個 bus 的 clock 上可傳 256 bit,
dual channel 用互補的記憶體控制器, 達到平均在一個 bus clock 下傳送兩筆資料
這技術是 AMD 和 nv 共同做出來的 (類似 dual issue 技術)
data rate 的倍數是在 DRAM 晶片上, 傳的時候還是要透過 bus,
並不是變成 DDR5 就可以傳 5 倍.
就好像 100BaseT 的乙太網路, 並不會因為電腦由 Pentium 升級成 Quad Core,
而讓傳輸速度變 4 倍一樣, 頂多只是反應快一點而己
: : (2) 共享記憶體 (shared memory) 多處理機時, 會有一塊所有處理機都看得到的記憶體,
: : 稱為共享記憶體, 用來共享或交換資料用, 交換資料時必需要同步所有
: : 處理機, 避免因先後序不可預期而導至資料存取錯誤。
: 這裡有誤,CUDA中的shared memory,共享的對象是同一個MP(&block)中的
一個 MP 可同時執行多個 block (compute 1.0 設定最多 8 個, 後續版本可能調整)
但 shared memory 只能在 block 中共用,
而 shared memory 是做在 MP 上的,
同時執行的 block 數受限於 MP 上的 shared memory 總量
這邊的確是比較容易混淆
: 所有thread,shared memory也具有所有晶片內嵌記憶體的特色.
: 容量有限,存取速度極快等等.
: 不同MP(&block)中的shared memory是互不相干的.
: 但是同一個MP/block中的所有thread就共享這16KB shared memory,
: 也可以利用這個在thread之間"快速"交換資料......
: ^^^^^^存疑,因為等thread同步很慢
起碼比直接由 DRAM 載入快...XDD
而且同步的 overhead 比直接存取 DRAM 小
實際上和演算種類有很大的關係, 無法一概而論
: 不過下一篇的記憶體有對於這個正確的解釋.請直接參考該篇...
: : (9) 記憶庫 (Memory bank) 將記憶體分散成數個獨立的群組儲存, 並可借由多個獨立
: : 的記憶體控制器來提昇整體的頻寬。
: : (10) 記憶庫衝突 (bank conflict) 當同時要存取的資料位於同一記憶庫, 稱為記憶庫
: : 衝突, 此時就要排隊等待而造成延遲.
: 這裡不是勘誤,不過由於memory bank存在於很多地方,
: 顯示卡上用的DDR SDRAM"晶片內部"有memory bank,因此
: 存取外部DDR SDRAM有bank conflict的延遲,顯示晶片內的
: shared memory也有memory bank(共16組),存取shared memory就必須避開
: bank conflict問題....不過CUDA文件中的bank conflict通常
: 是指後者.除非特例,不然前者的問題是被隱藏住的不需要直接控管.
嗯嗯,
bank conflick 問題在 DRAM (global memory) 還有 shared memory 中皆存在,
在 Tesla 中有 4G 的記憶體 (每個 bank 容量加大), 就會出現這問題了
(曾經在 C1060 中遇過, 同樣的程式, 不同的位址, 效能變 2/3)
所以顯示卡的記憶體也不能太大, 不然對需要及時反應的遊戲效能會有影響.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.210.207