2016-05-16 4 views
0

私はCUDAのイメージフィルタを使っています。画像処理はCPUよりもはるかに高速です。しかし問題は、画像の割り当てが本当に遅いことです。CUDAメモリ割り当てのパフォーマンス

これは、私がメモリを割り当ててイメージを設定する方法です。

hr = cudaMalloc(&m_device.originalImage, size);                   
hr = cudaMalloc(&m_device.modifiedImage, size);                   
hr = cudaMalloc(&m_device.tempImage, size);                 
hr = cudaMemset(m_device.modifiedImage, 0, size);                   
hr = cudaMemcpy(m_device.originalImage, host.originalImage, size, cudaMemcpyHostToDevice); 

これはプログラムを実行した結果です。

C:\cpu_gpu_filters(GPU)\x64\Release>cpu_gpu_filters test-case.txt 
C:\Users\Max\Desktop\test_set\cheshire_cat_1280x720.jpg 
Init time: 519 ms 
Time spent: 2.35542 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_1366x768.jpg 
Init time: 31 ms 
Time spent: 2.68595 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_1600x900.jpg 
Init time: 44 ms 
Time spent: 3.54835 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_1920x1080.jpg 
Init time: 61 ms 
Time spent: 4.98131 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_2560x1440.jpg 
Init time: 107 ms 
Time spent: 9.0727 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_3840x2160.jpg 
Init time: 355 ms 
Time spent: 20.1453 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_5120x2880.jpg 
Init time: 449 ms 
Time spent: 35.815 ms 
C:\Users\Max\Desktop\test_set\cheshire_cat_7680x4320.jpg 
Init time: 908 ms 
Time spent: 75.4647 ms 

時間測定とUPDコード:

start = high_resolution_clock::now(); 
Initialize(); 
stop = high_resolution_clock::now(); 
long long ms = duration_cast<milliseconds>(stop - start).count(); 
long long us = duration_cast<microseconds>(stop - start).count(); 
cout << "Init time: " << ms << " ms" << endl; 


start = high_resolution_clock::now(); 
GpuTimer gpuTimer; 
gpuTimer.Start(); 
RunGaussianBlurKernel(
    m_device.modifiedImage, 
    m_device.tempImage, 
    m_device.originalImage, 
    m_device.filter, 
    m_filter.width, 
    m_host.originalImage.rows, 
    m_host.originalImage.cols 
    ); 
gpuTimer.Stop(); 

最初の画像は最小であるが、初期化は、519ミリ秒を要します。たぶん、それはドライバや何かをロードする必要があるからです。そして、画像のサイズが大きくなると、初期化時間も長くなる。実際は、これは論理的に見えますが、私はまだ初期化プロセスが遅いことを確認していません。私は何か間違っているのですか?

+1

あなたのコードでは、開始時間と終了時間を測定していますか? – Makketronix

+0

@Makketronix、私は時間を測定する方法は正しいと確信していますが、質問を更新しました。問題は、初期化に時間がかかりすぎるのが正常かどうかです。 – Max

+0

Hmm。あなたは "Debug"または "Release"をビルドしていますか?私は "Debug"ビルドの前にパフォーマンス上の問題がありました。 – Makketronix

答えて

2

ユニットコードには、実行時間がサイズに依存するcudaMemsetがあります。また、cudaMemcpyもあります。この実行時間は、memコピーサイズ(バイト数)をPCI Expressの帯域幅で割ったものです。この部分はinitの時間の増加を引き起こす可能性が非常に高いです。 NSIGHTで実行すると、実行時間に関するより正確な数値が表示されます。しかし、MCVEがなければ、確かに答えにくいです。

+0

よく見つかる。初期化の時間は、memset呼び出しのためにイメージの大きさとほぼ線形にスケーリングされています。 – talonmies

+0

私は、初期化の時間は画像のサイズによって異なることを知っています。私はちょうど初期化がそれを長く取ることができるとは思わなかった。 – Max

+0

@Maxピクセルがchar [3]の場合、initの速度は100M/sです。これは、H2DのmemコピーやcudaMemsetではなくディスクの読み込みのように見えます。 – kangshiyin