2016-09-16 186 views
0

我正在處理一個代碼,我必須對一塊數據執行向量 - 矩陣乘法,將結果複製回CPU,然後開始乘其他塊。我使用cublas庫執行向量到矩陣乘法(以下代碼)。測量準確的GPU計算時間

clock_t a,b; 
a = clock(); 
    for(int i=0;i<n;i++) 
    { 
    cublasSgemv(handle,CUBLAS_OP_T,m,k,&alpha, dev_b1+((i+1)*m), m, dev_b1+(i*m),1, &beta,out,1); 
    out+=(n-(i+1)); 
    cudaMemcpy(b3,dev_b3, sizeof(float)*(cor_size), cudaMemcpyDeviceToHost); 
    } 
b = clock(); 
cout<<"Running time is: "<<(double)(b-a)/clocks_per_sec; 

我必須測量這個循環的運行時間。我讀了一些關於CudaEvent的內容,但在我的情況下,我想測量整個循環的時間而不是內核,所以我使用了時鐘函數。我想知道這是一個正確的方法來衡量這段代碼的時間或有更準確的方法來做到這一點? 我知道,爲了測量已用時間,我們必須多次重複運行代碼,並取所有運行時間的平均值,所以另一個問題是,是否應該重複運行代碼的重複次數?

由於

回答

1

cudaMemcpy同步主機和設備,所以CPU計時器如clock_t表示應該給得到了與那些由CUDA計時器產生的相同,使得對於粒度/分辨率clock_t表示的必要的津貼。

至於測量的準確性,從我所看到的情況來看,第一次迭代的時間可以在計算中被忽略。隨後的時間測量應該根據運行算法中的負載不平衡等因素產生數字,這可能決定我們是否在每次迭代中獲得相同的數字。我認爲這與Sgemm沒有關係。

1

您仍然可以使用CUDA事件來測量整個循環運行時間,方法是記錄兩個事件(一個在循環開始之前,一個在結束之後,即在當前使用的位置clock()),同步第二個事件然後使用cudaEventElapsedTime()獲取已用時間。這應該具有比clock()更準確的優點。