2012-03-16 132 views
6

我正在研究GPU加速程序,它需要讀取整個可變大小的文件。我的問題是,從文件讀取並傳輸到協處理器(CUDA設備)的最佳字節數是多少?將大文件(最多2GB)有效地傳輸到CUDA GPU?

這些文件可能與2GiB一樣大,因此創建該大小的緩衝區似乎不是最好的主意。

回答

4

您可以將cudaMalloc設備上的最大尺寸的緩衝區分配給您。在此之後,將這種大小的輸入數據塊從主機複製到設備,處理它,複製結果並繼續。

// 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

那部分我已經在計劃,但輸入數據塊應該是多大? – sj755 2012-03-16 03:15:27

+0

您可以在設備上分配的最大陣列的大小。 – 2012-03-16 03:29:54

+5

您可以考慮使用比適合內存(最多一半)更小的塊的異步存儲器,並且將塊k'1傳輸回主機並將塊k'1從主機到設備。雙向重疊需要Tesla GPU,但即使在GeForce上也可以重疊一個方向。 – harrism 2012-03-16 04:07:34

0

如果你可以分割你的功能,以便您可以在工作塊的卡上,你應該考慮使用流(cudaStream_t)。

如果您在多個流中計劃加載和內核執行,您可以讓一個流加載數據,而另一個流則在卡上執行內核,從而隱藏數據在執行內核時的一些傳輸時間。

無論你的塊大小是多少倍,你需要聲明一個緩衝區,儘管你聲明瞭很多流(根據我的理解,對於計算能力1.x,最多爲16)。