2012-07-28 37 views
1

當我評估我的程序時,我發現在某個時間點,我的時間間隔達到100毫秒。我已經搜查了每一個手術,但這次沒有手術。然後我注意到,無論我在哪裏放置cudaThreadSynchronize調用,第一個調用都需要100毫秒。然後我寫下了這樣一個例子。在第一行調用cudaThreadSynchronize時,結束時的經過時間值小於1毫秒。但如果沒有調用,則平均需要110毫秒。CUDA:CUtil定時器 - 經過時間的混淆

int main(int argc, char **argv) 
{ 
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time.. 

    unsigned int timer; 
    cutCreateTimer(&timer); 
    cutStartTimer(timer); 

    float *data; 
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024)); 

    cutStopTimer(timer); 
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer)); 

    cutDeleteTimer(timer); 

    return EXIT_SUCCESS; 
} 

我覺得在開始時cudaThreadSynchronize()處理CUDA庫的初始化。這是否是完全初始化內核的正確方法,因此它不會影響其他操作的時間評估?是否足夠,並且在開始時調用cudaThreadSynchronize是正確的,或者是否有任何正確的方法。

+1

[與第三方CUDA庫鏈接會減慢cudaMalloc的可能的重複](http://stackoverflow.com/questions/11664627/linking-with-3rd-party-cuda-libraries-slows-down-cudamalloc) – talonmies 2012-07-29 05:51:10

回答

1

爲了使用CUDA,必須首先在GPU上創建'CUDA上下文',這大約需要70-100ms 。在你的示例中,cudaThreadSynchronize();正在創建上下文。上下文僅爲您的應用程序創建一次。在進行時序分析時,我還會創建一個虛擬內存副本來創建上下文(如上面使用cudaThreadSynchronize();所做的那樣)。

+2

在代碼的定時部分之前強制創建CUDA上下文的「經典」方法是調用cudaFree(0)。 – njuffa 2012-07-29 00:06:39