精華區beta VideoCard 關於我們 聯絡資訊
※ 引述《a5000ml (咖啡裡的海洋藍)》之銘言: : 終於要步入最佳化的部份, 實在令人興奮... XDD : =========================================================================== : 材質參考 (part.1) : =========================================================================== : ◆簡介 : -------------------------------------------------------------------- : 「材質參考」(Texture Reference) 其實就是開啟 GPU 的「快取機制」(cache)。 : 傳統 CPU 在記憶體的讀取上,預設是有快取的,並提供一些指令來控制後續的指令 : 資料流的快取 (例如: x86 的預先拮取 prefetch),然而這種方式,程式設計師必需 : 事先計算資料從 DRAM 預先被拮取所需的時間,並在適當的地方穿插 prefetch 指令, : 可是硬體的進展使得預先拮取的時間變得不確定,所以 prefetch 的效果並不具備 : 向下相容性,使得在某型號的機器上好不容易調到最佳效能,換新機器後就不見得。 CPU是先發展出cache機制(可以追溯到198x中期) 才發展出針對cache的prefecth功能. cache是針對經常被重複使用的資料,存放到比主記憶體快的地方, 在下次存取的時候,只要還存放在chace內,就可以增加存取速度. (關於cache應該是很基礎的常識,因此不多敘述) 原本cache的運作過程對軟體而言是自動的.但是在9x年代中期,cpu開始考慮到 多媒體相關的運用的時候,這些資料的特性就是彼此之間很獨立. (比如說聲音,這一秒內和上一秒的內容無關,影像,這個pixel和 相鄰很遠的pixel也是獨立的資料) 如果資料不會有機會重新使用的話,使用cache不但沒有好處. 還可能單純是負擔而已.因此針對已經發展成熟的cpu/cache機制. 才加入了prefectch指令.預先將資料載入cache中 而在GPU上,由於資料的重用性也並不高,所以並沒有針對data製作cache. 但是相鄰的pixel可能使用到同樣的texture,因此GPU具有texture cache的機制. 另外texture cache對於Anistropic Filtering以及FSAA的效能都有一定的幫助. : ◆兩種不同的最佳化風格 (合併存取 vs. 材質參考) : -------------------------------------------------------------------- : 「合併存取」可視為是 RISC 的延伸,因為資料要合併存取才能最佳化,會迫使 : 程式設計師先把一塊連續資料載入處理器中,處理完後再把這些資料做一次輸出, : 形成了所謂 Load/Save 的程式風格,以及大量暫存器的需求,而這種風格與需求 : 正是 RISC 的本意。 如果是說Write Combine或者是Read Combine,通常是指硬體自動實作的部分, 而不需要programmer手動操作...當然要手動操作也可以. 硬體自動的Read/Write Combine,就是在queue中的讀寫存取要求, 如果有位址屬於連續的,就會由硬體自動合併成連續的存取動作. CUDA中其實是有類似的機制的.就是在MP中的warp.屬於同一warp 中的Global Mrmory存取會有部分Read/Write Combine的效果. : ◆注意事項 : -------------------------------------------------------------------- : (1)材質記憶體是「唯讀快取」,本身在硬體上並不是的獨立的記憶晶片,而是 : 顯示卡的 DRAM (global memory),配合 GPU 上的 cache 來存取而己。 : (2)在 CUDA 中預設的全域記憶體存取是沒有快取的,只有透過材質參考來存取, : 才能使用 GPU 的讀取快取,兩者的讀取指令並不相同。 : (3)材質參考可被設定成較適合的方式以增進存取效率,現階段 nv 提供 1D、2D、3D : 三種模式,1D 的可以直接綁在全域記憶體上,其餘 2D 和 3D 必需綁 CUDA Array, : 這東西其實和也和全域記憶體一樣位在顯示卡的 DRAM 上,只是有特殊的位址對齊 : 符合 2D 和 3D 的要求,使得材質快取可以有效率的進行而己。 : (4)材質參考提供多種定址方式,除了整數位址之外,還提供歸一化後的浮點數位址 : (速度和整數位址差不多),在某些應用上可節省位址計算的時間,並達到 fuzzy : 定址的效果。 CUDA上由於記憶體的定義很多種,有時候很容易讓人誤會... 不過,由程式宣告,放在顯示卡記憶體上的memory有三種 (全部都可以由所有的Block中的所有thread共用) a. Global Memory 可讀取/可寫入,因此無cache功能. b. Const Memory 只可讀取,由於可被MP cache, 因此在不只一個Block讀取,以及重複讀取的時候具有 較好的效能. c. Texture Memory 也是Read Only,基本上Const Memory有的特性, Texture Memory特性也都有 也就是說,硬體上每個MP都具有對Const Memory以及Texture Memory 作cache的功能. 那Const Memory以及Texture Memory之間主要的差別在哪? 就cache的部分是沒有甚麼差別的......我看的結果是, Texture Memory會利用GPU上的texture filtering的單元的 很多功能.例如說,圖案縮放時候的bilinear filtering, 由於texture原本就支援不同格式如int,fp16,fp32等.因此使用 texture memory,讀取的時候可以快速轉換資料型態... 不過因為我試用過的程式資料並不屬於圖像之類的,所以是 看不太出使用texture memory勝過const memory的地方. : (5)材質參考可以跨多個 multiprocessors 共享,增加資料的利用率 (和硬體版本有關 : G80/G90 系列的為兩個多處理器共用,而 G200 為 3 個共用)。 其實Const Memory 跟 Texture Memory的cache,讓不同MP共享資料的能力 並沒有那麼差.只限定在相鄰MP(同一TPC)中... 這要從硬體實作開始解釋. 在GPU上,並不是每個MP都做成獨立的, 而是以2個或者是3個合併成一個TPC. 在一個TPC中的2或者是3個MP.對外的記憶體介面是共用的. 對內.....實作上cache可能是共享的.所以同一TPC中的其他MP已經 讓這筆資料在cache中的時候,這個MP再讀取就是直接從cache中取得, 不會再自顯示卡記憶體中載入. 不過const/texture memory的內容,可以被不同的TPC cache住. 這樣資料共享的威力就不限制於要在相鄰的MP,同一個TPC中了. 要broadcast給所有MP都是可行的. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.146.142
MichaelHsin:推推 12/11 20:24