2012-10-09 72 views
1

Ich想比較我的cuda代碼在GPU上的速度(數據已被複制)以及我的代碼在CPU上的速度有多快。時間測量CUDA和C#

在CUDA代碼的測量如下

cudaEvent_t start, stop; 
    cudaEventCreate(&start); 
    cudaEventRecord(start,0); 

    //Kernel Execution 
    transformKernel7<<<grid,threads>>>(dev_result, width, height, angle, N); 

    cudaEventCreate(&stop); 
    cudaEventRecord(stop,0); 
    cudaEventSynchronize(stop); 
    cudaEventElapsedTime(&cuTime, start,stop); 

現在我想衡量我在C#代碼完成。 我有以下代碼

var sw = Stopwatch.StartNew(); 

//making some calculation.... 

var elapsed = sw.ElapsedMilliseconds; 

我的問題是,sw.ElapsedMilliseconds不夠精確。它給我的0時間0.02490834。

我會使用蜱但我不知道如何重新計算蜱到正確的結果。在我的Cuda代碼中的時間可以給我的值,如0.058938483。秒錶不夠精確。

任何想法?

+0

使用'StopWatch.ElapsedTicks',如果是這樣的粒度不夠細做比較,http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks更多的工作。 aspx,如果你想知道tick屬性在頻率屬性看起來有多久,它會因系統而異,http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.frequency.aspx – Jodrell

+0

@ Silve2611您應該將第二個cudaEventCreate()移到第一個cudaEventRecord()之前,以避免可能增加第二個cudaEventRecord()的提交延遲。 –

+0

謝謝我會試試看 – Silve2611

回答

2

ElapsedMilliseconds爲您提供已經過的整數時間。所以你不能通過該屬性獲得小數部分。你需要自己計算一下。

如果您想要更精確的時間,請將ElapsedTicks除以Stopwatch.Frequency以獲得時間,以秒爲單位。然後轉換爲你想要的時間單位。

var elapsedMilliseconds = (double)(sw.ElapsedTicks * 1000L)/Stopwatch.Frequency; 
0

根據MSDN,Ticks是一種很長的類型,每毫秒有10,000個。所以,你可以手動做這個數學。

sw.ElapsedMilliseconds屬性的部分問題可能是您對var數據類型的使用。你的輸出表明var正在被編譯爲一個int。定義變量的類型,編譯器不會給它錯誤的類型。 http://msdn.microsoft.com/en-us/library/bb383973.aspx

+0

我很好奇你是如何推斷變量被設置爲int的?從我可以告訴編譯器將變量設置爲Int64(long),因爲這是表達式右側的數據類型。 – wtaniguchi

+0

海報表示它是一個小於1的十進制值,它被截斷爲0.聽起來像一個float開始投射到一個int。不過,你所說的話聽起來很正確。 –