[英]How many blocks can be allocated if i use shared memory?
我是Cuda編程的新手。 我可以使用設備“ Tesla K10”。 我正在處理一個復雜的問題 ,每個問題實例大約需要20 KB的內存。 現在,由於cuda提供了並行化,我決定每個塊使用96個線程(牢記扭曲)來解決問題的一個實例。 現在的問題是我有很多這樣的問題需要解決(比如說超過1,600,000)。 我知道,如此大的內存需求甚至無法適應全局內存(在我的情況下為3.5 GB,如下面的DeviceQuery輸出所示),因此我必須一次解決幾個問題。
此外,我已將每個問題與每個塊進行映射以解決問題的一個實例。
現在,我現在能夠解決全局存儲器中數據的大量問題。 但是共享內存比全局內存快,因此我計划使用20 KB(每個問題)共享內存。
1)現在我的困惑是,這一次將只允許我在共享內存中加載兩個要解決的問題(即40KB <48 KB共享內存)。 (基於我對cuda的理解,如果我不滿意,請指正我)。
2)如果我在內核中聲明了具有此20 KB的數組,這是否意味着這個(20 KB * number_of_blocks)將被共享內存使用? 我說的number_of_blocks是要解決的問題數。 我的啟動配置有問題<>>(...)
您在這方面的所有幫助將得到高度認可。 預先感謝您。
***My partial Device Query***
Device : "Tesla K10.G1.8GB"
CUDA Driver Version / Runtime Version 6.5 / 5.0
CUDA Capability Major/Minor version number: 3.0
Total amount of global memory: 3584 MBytes (3757637632 bytes)
( 8) Multiprocessors, (192) CUDA Cores/MP: 1536 CUDA Cores
GPU Clock rate: 745 MHz (0.75 GHz)
Memory Clock rate: 524 Mhz
Memory Bus Width: 2048-bit
L2 Cache Size: 4204060 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 2046), 65536 layers
Total amount of constant memory: 65536 bytes
**Total amount of shared memory per block: 49152 bytes**
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 0
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
...
首先,快速總結一下我是否正確理解:
解決整個問題將需要大於30 GB的內存,因此很顯然,您需要將問題集分成批處理。 使用您的4 GB卡(〜3.5 GB可用於ECC等),您隨時可以容納大約150,000個問題。 如果要對它們進行雙緩沖,以允許同時傳輸下一個批次與當前批次的計算,那么您正在研究的是一個批次中的75K問題(如果需要用於輸出的空間,則可能更少)。
首先要考慮的是您是否可以並行處理每個問題,即是否可以將多個線程分配給一個問題? 如果是這樣,那么您應該考慮分配一個線程塊來解決一個單獨的問題,使用共享內存可能值得考慮,盡管您可能會將占用率限制為每個SM兩個塊,這可能會損害性能。
如果您無法在問題中並行化,那么您就不應該考慮共享內存,因為正如您所說,您將自己限制為每個SM兩個線程(從根本上消除了GPU計算的好處)。 相反,您需要確保全局內存中的數據布局能夠實現合並訪問-這很可能意味着使用SoA(數組結構)布局而不是AoS(結構數組)。
您的第二個問題有些令人困惑,尚不清楚您是在GPU上下文中還是在問題上下文中表示“阻塞”。 但是從根本上說,如果您在內核代碼中聲明一個20 KB的__shared__
數組,則該數組將在每個塊中分配一次,並且每個塊將具有相同的基地址。
根據OP的評論進行更新
GPU包含許多SM,每個SM都有一個較小的物理內存,可用於L1和共享內存。 在您的情況下,對於K10,每個SM都有48 KB可用作為共享內存,這意味着在SM上執行的所有塊在任何時候都可以使用多達48 KB的內存。 由於每個塊需要20 KB,因此您可以隨時在SM上最多執行兩個塊。 這並不影響您可以在啟動配置中設置多少個塊,而僅影響它們的調度方式。 這個答案討論的內容更為詳細(盡管對於每個SM 16 KB的設備而言), 這個(很舊的)答案的解釋要多一些,盡管最有用(最新)的信息在CUDA教育中頁數 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.