1

GPUをCPUと同時に使用しています。メモリ転送のプロファイルを作成すると、cuBLASの非同期呼び出しが非同期で動作しないことがわかりました。

私は次のようなことをするコードを持っています

cudaEvent_t event;
cudaEventCreate(&event);
// time-point A
cublasSetVectorAsync(n, elemSize, x, incx, y, incy, 0);
cudaEventRecord(event);
// time-point B
cudaEventSynchronize(event);
// time-point C

私はプロファイリングに使用sys/time.hしています(わかりやすくするためにコードは省略されています)。cublasSetVectorAsync呼び出しが同期して動作しているかのように時間を支配していることがわかりました。つまり、期間ABは期間BCよりもはるかに長く、転送のサイズを大きくすると長くなります。

これにはどのような理由が考えられますか?どこかに設定する必要のある環境変数や、使用する必要のある更新されたドライバーはありますか?

GeForce GTX285とCudaコンパイルツールリリース4.1、V0.2.1221を使用しています

4

2 に答える 2

3

cublasSetVectorAsyncの周りの薄いラッパーcudaMemcpyAsyncです。残念ながら、状況によっては、この関数の名前は、CUDAリファレンスマニュアルのこのページで説明されているように、誤った名前になっています。

特に:

ページング可能なホストメモリからデバイスメモリへの転送では、コピーが開始される前にストリーム同期が実行されます。デバイスメモリへのDMA転送のためにページング可能バッファがステージングメモリにコピーされると、関数は戻りますが、最終的な宛先へのDMAが完了していない可能性があります。

ページング可能なホストメモリからデバイスメモリへの転送の場合、ホストメモリはすぐにステージングバッファにコピーされます(デバイスの同期は実行されません)。ページング可能バッファがステージングメモリにコピーされると、関数は戻ります。最終宛先へのDMA転送が完了していない可能性があります。

したがって、問題の解決策は、標準(またはC ++ )ではなくx、を使用してホストデータ配列を割り当てるだけである可能性があります。cudaHostAllocmallocnew

または、GPUとCUDAのバージョンでサポートされている場合は、-edポインターを使用mallocして呼び出すことができます。ドキュメントでは、効果を発揮するためにフラグを使用してCUDAコンテキストを作成する必要があるという条件に注意してください(のドキュメントを参照してください。cudaHostRegistermalloccudaDeviceMapHostcudaHostRegistercudaSetDeviceFlags

于 2012-09-25T23:56:10.837 に答える
-1

cuBLAS / cuSPARSEでは、別のストリームを指定しない場合、ストリーム0で処理が行われます。ストリームを指定するには、cublasSetStreamを使用する必要があります(cuBLASのドキュメントを参照)。

于 2012-09-24T20:42:37.657 に答える