簡體   English   中英

如果我使用共享內存,可以分配多少塊?

[英]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
...

首先,快速總結一下我是否正確理解:

  • 您需要解決約150萬個問題,這些問題是完全獨立的,即令人尷尬的並行
  • 每個問題的數據集約為20 KB

解決整個問題將需要大於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM