2016-05-16 104 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

嗯。你在「調試」還是「發佈」中構建? 「調試」構建之前,我遇到了性能問題。 – Makketronix

回答

2

在你的單元代碼中,你有一個cudaMemset,執行時間取決於大小。還有cudaMemcpy,其執行時間大約由單位字節的內存副本大小除以PCI-Express的帶寬得出。這部分很可能是初始時間增加的原因。通過NSIGHT運行它可以爲您提供更精確的執行時間數據。但是,沒有MCVE,很難肯定地回答。

+0

斑點。由於memset調用,初始化時間與圖像大小几乎呈線性關係。 – talonmies

+0

我知道初始化時間取決於圖像大小。我只是沒想到初始化可能需要很長時間。 – Max

+0

@Max如果像素爲char [3],則初始速度僅爲100M/s。它看起來像H2D mem複製或磁盤加載,而不是cudaMemset。 – kangshiyin