2011-08-03 14 views
2

異なるサイズのデータ​​に対してホストから帯域幅テストを実行していますが、ホストメモリがページング可能に固定されているときに帯域幅が増加しています。以下は私のMB/s単位の帯域幅とバイト単位のデータ転送サイズのプロットです。 1つは、小さな量のデータ(< 300K)のページング可能な運賃が固定された運賃よりも優れていることに気付くでしょう... O/Sによるメモリ割り当てに関連していますか? このバンド幅テストプログラムは、NVidiaのコードサンプルsdk(私の側からわずかな変更が加えられています)からのもので、CUDA 4.0を使用してTesla C2050に対してテストしています。 O/Sは64ビットLinuxです。CUDA小さなデータ用の固定メモリ

enter image description here

答えて

1

cudaMemcpyの実装では、可能な限り高いスループットを達成するために、さまざまなデバイス、送信元と送信先のロケーション、およびデータサイズに異なるコードパスがあります。

表示されているレートが異なるのは、おそらくアレイのサイズが変わると実装が切り替わるためです。

たとえば、フェルミGPUには専用のコピーエンジン(SM上で実行されているカーネルと並行して実行できる)と、PCI-e経由でホストメモリにアクセスできるSMの両方があります。より小さいアレイでは、cudaMemcpyをSM上で動作するカーネルとして実装する方が、ホストメモリを直接読み込み、読み込んだデータをデバイスメモリに格納する方が効率的です(逆も同様です)。または、コピーエンジンを使用する方が効率的かもしれません。実際にはどちらが起きているのかはわかりませんが、グラフを切り替えることがグラフのクロスオーバーの原因です。

0

テストが浮気している可能性があります。そのテストは、メモリの異なる種類のためのmemcpyを行うためにさまざまな機能を使用して、

cutilSafeCall(cudaEventRecord(start, 0)); 
if(PINNED == memMode) 
{ 
    for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++) 
    { 
     cutilSafeCall(cudaMemcpyAsync(h_odata, d_idata, memSize, 
           cudaMemcpyDeviceToHost, 0)); 
    } 
} 
else 
{ 
    for(unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++) 
    { 
     cutilSafeCall(cudaMemcpy(h_odata, d_idata, memSize, 
           cudaMemcpyDeviceToHost)); 
    } 
} 
cutilSafeCall(cudaEventRecord(stop, 0)); 

注:ここ

は時限コードの一つです。私は、モード間の主な違いはメモリがどのように割り当てられているのか、固定されている場合はcudaHostAlloc、固定されていない場合はmallocであるため、これは不正だと思います。

異なるMemcpy関数は、エラーチェックと転送設定のパスを変えることができます。

したがって、テストを修正し、両方のモードでcudaMemcpy()でコピーしてください。 cudeEventRecord(...)からif(0 && (PINNED == memMode))

+0

ありがとうございますが、私は 'cudaMemcpy(...)'を固定とページングの両方の割り当てに使用しています。 – Sayan

+0

オリジナルの "不正な"コードの場合、結果は何ですか? – osgx

+3

上記のコードはテストのものですが、最後の行の後には、ホストタイマーを停止する前にcudaDeviceSynchronize()を呼び出しています。これにより、コピーコスト全体がタイムアウトされ、bandwidthTestが「不正行為」しないことが保証されます。 – harrism

関連する問題