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);
Bu bölümü zaten planlıyordum, ama giriş verilerinin parçaları ne kadar büyüklükte olmalı? – sj755
Cihazda ayırabileceğiniz en büyük dizinin boyutu. –
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