2012-03-16 10 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

+0

デバイスに割り当てることができる最大の配列のサイズ。 –

+5

チャンク 'k-1'をホストに送り返し、チャンク' k + 1'をから転送するのと並行して、チャンク 'k'をメモリに(半分以下で)適合させるよりも少し小さいチャンクの非同期memcopiesを使用することを検討できますホストからデバイスへ。双方向のオーバーラップにはTesla GPUが必要ですが、GeForceでも1つの方向を重ねることができます。 – harrism

0

、あなたが使用してストリーム(cudaStream_t)になっているはずです。

複数のストリームでロードとカーネルの実行をスケジュールすると、あるストリームがデータをロードし、別のストリームがカード上でカーネルを実行することで、カーネルの実行時にデータの転送時間を隠すことができます。

あなたのチャンクサイズは何時でもあなたが宣言する多くのストリーム(私が知っている限り計算能力1.xに対して最大16)のバッファを宣言する必要があります。

関連する問題