2012-03-16 11 views
6

Değişken boyuttaki bir dosyanın tamamını okumayı gerektiren GPU hızlandırılmış bir program üzerinde çalışıyorum. Benim sorum, bir dosyadan okumak ve bir işlemciye (CUDA aygıtı) aktarmak için en uygun bayt sayısı nedir?Büyük dosyayı (2GB'a kadar) CUDA GPU'ya verimli bir şekilde aktarın?

Bu dosyalar 2GiB kadar büyük olabilir, bu nedenle bu boyutta bir arabellek oluşturmak en iyi fikir gibi görünmüyor.

cevap

4

Cihazınızda kullanabileceğiniz maksimum boyutta bir cudaMalloc kullanabilirsiniz. Bundan sonra, bu boyuttaki giriş verilerinizin bileşenlerini ana bilgisayardan cihaza kopyalayın, işleyin, sonuçları kopyalayın ve devam edin. Bunu karttaki parçalar üzerinde çalışabilirsiniz senin fonksiyonunu bölebilmeniz Eğer

// Your input data on host 
int hostBufNum = 5600000; 
int* hostBuf = ...; 

// Assume this is largest device buffer you can allocate 
int devBufNum = 1000000; 
int* devBuf; 

cudaMalloc(&devBuf, sizeof(int) * devBufNum); 

int* hostChunk = hostBuf; 
int hostLeft = hostBufNum; 
int chunkNum = (hostLeft < devBufNum) ? hostLeft : devBufNum; 

do 
{ 
    cudaMemcpy(devBuf, hostChunk, chunkNum * sizeof(int) , cudaMemcpyHostToDevice); 
    doSomethingKernel<<< >>>(devBuf, chunkNum); 

    hostChunk = hostChunk + chunkNum; 
    hostLeft = hostBufNum - (hostChunk - hostBuf); 
} while(hostLeft > 0);  
+0

Bu bölümü zaten planlıyordum, ama giriş verilerinin parçaları ne kadar büyüklükte olmalı? – sj755

+0

Cihazda ayırabileceğiniz en büyük dizinin boyutu. –

+5

Hafızada (en fazla yarıya) sığacak şekilde daha küçük parçaların async hafızalarını kullanmayı ve "k-1" parçasının ana sunucuya geri gönderilmesi ve "k + 1" öğesinin aktarılmasıyla birlikte "k" kümesini işlemeyi düşünebilirsiniz. ev sahibi cihaz. Çift yönlü örtüşme bir Tesla GPU gerektirir, ancak GeForce'de bile bir yönü üst üste bindirebilirsiniz. – harrism

0

, kullandığınız akışları (cudaStream_t) içine bakmak gerekir.

Çeşitli akışlarda yükleri ve çekirdek yürütmelerini zamanlarsanız, bir akış yükleme verisine sahip olabilirken, diğeri karttaki bir çekirdeği yürütür, böylece verilerinizin aktarım süresinin bir kısmını çekirdek çekirdeğinde saklar.

Öğe boyutu büyüklüğünüzün kaç olduğu bir arabelleği bildirmeniz gerekir, ancak bildirdiğiniz birçok akış (en fazla 16, bilgi işlem için bildiğim kadarıyla 1.x).