精華區beta VideoCard 關於我們 聯絡資訊
※ 引述《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
hsz0566:高手過招...我的肉眼跟不上速度 XDrz 12/12 13:33