2012-07-24 4 views
11

Cuda 4 programımı profilliyordum ve bir aşamada çalışan işlemin 80 GiB'den fazla sanal bellek kullandığını belirtti. Beklediğimden çok daha fazlaydı. AçıkçaCuda çalışma zamanı, başlatma sonrasında 80 GiB sanal belleği neden saklıyor?

int deviceCount; 
    cudaGetDeviceCount(&deviceCount); 
    if (deviceCount == 0) { 
    perror("No devices supporting CUDA"); 
    } 

şudur ki: zamanla bellek haritası evrimini inceleyen ve yürüttüğü kod hangi satır karşılaştırarak sonra sanal bellek kullanımı 80'in üzerinde GiB kadar çarptın bu basit talimatları sonra ortaya çıktı İlk Cuda çağrısı, böylece çalışma zamanı başlatıldı. Bundan sonra hafıza haritası (kesik) gibi görünür:

Address   Kbytes  RSS Dirty Mode Mapping 
0000000000400000 89796 14716  0 r-x-- prg 
0000000005db1000  12  12  8 rw--- prg 
0000000005db4000  80  76  76 rw--- [ anon ] 
0000000007343000 39192 37492 37492 rw--- [ anon ] 
0000000200000000 4608  0  0 ----- [ anon ] 
0000000200480000 1536 1536 1536 rw--- [ anon ] 
0000000200600000 83879936  0  0 ----- [ anon ] 

Şimdi sanal bellek alanına girmesine bu büyük bellek alanına sahip.

Tamam, büyük bir sorun değil, çünkü bu belleğe yazmazsanız, Linux'ta bellek ayırmak/ayırmak pek bir şey yapmaz. Ancak bu gerçekten sinir bozucu bir durumdur, mesela MPI işleri, işin kullanabileceği maksimum vem miktarı ile belirtilmelidir. Ve 80GiB, o zaman Cuda işleri için daha düşük bir sınırdır - biri de diğer tüm şeyleri de eklemelidir.

Bunun, Cuda'nın sürdürdüğü çizik alanıyla ilgili olduğunu düşünebilirim. Çekirdek kod için dinamik olarak büyüyebilen ve küçülen bir tür bellek havuzu. Ama bu spekülasyon. Ayrıca cihaz hafızasında ayrılmıştır.

Herhangi bir anlayış?

cevap

12

Çizik alanıyla ilgisi yok, host ve çoklu GPU'lar arasında birleştirilmiş andressing ve eşler arası erişim sağlayan adresleme sisteminin bir sonucudur. CUDA sürücüsü, tüm GPU (lar) bellek + ana belleğini kernel'in sanal bellek sistemini kullanarak tek bir sanal adres alanında kaydeder. Aslında bellek tüketimi değil, tek bir adresleme için tüm mevcut adres alanlarını doğrusal bir sanal alana eşleştirmek için sadece bir "numara".

+0

Tamam, mantıklı. Yani, benim durumumda ana bilgisayar 48 GB RAM yüklü + 8 GB takas ve 6 GB ile 4 GPU, her biri toplam 80 GB. Bingo! Bu normal yığına tahsis edersem, bu 80GB içinde de görünecek mi? – ritter

+0

Heap, her bir içerik için her GPU belleğinden yalnızca bir ayırmadır. Sanal bellekte yığın nedeniyle bir değişiklik görmezsiniz, ancak API'nin belirli bir GPU'da rapor ettiği boş bellek azalır. – talonmies

+7

@Frank: Bilgisayarını alabilir miyim? :) –