2016-10-24 75 views
-1

我已經在CUBLAS中編寫了與CUDA函數cublasSdgmm相同的CUDA函數,並且我發現當我增加塊號時,函數性能可能會變差甚至失敗。當塊號小於最大值時,cuda內核失敗

下面是代碼,M = 9.6e6,S = 3,最佳性能塊數爲320,我的GPU爲GTX960,並且X維中的最大塊大小爲2147483647。

__global__ void DgmmKernel(float *d_y, float *d_r, int M, int S){ 
    int row = blockIdx.x*blockDim.x + threadIdx.x; 
    int col = blockIdx.y*blockDim.y + threadIdx.y; 
    while(row < M){ 
    d_y[row + col * M] *= d_r[row]; 
    row += blockDim.x * gridDim.x; 
    } 
} 
void Dgmm(float *d_y, float *d_r, int M, int S){ 
    int xthreads_per_block = 1024;                 
    dim3 dimBlock(xthreads_per_block, 1);           
    dim3 dimGrid(320, S);            
    DgmmKernel<<<dimBlock, dimGrid>>>(d_y, d_r, M, S);     
}  

我想原因是可能是GPU的資源限制,是不是?

如果是正確的,特定的資源會限制性能,那麼內核函數只會讀取兩個向量並執行乘法操作。有沒有什麼方法來提高我的GPU的性能。

回答

2

您在內核啓動時反轉了塊和網格維度參數,並且內核不應該運行。你應該做這樣的事情:

dim3 dimBlock(xthreads_per_block, 1);           
    dim3 dimGrid(320, S);            
    DgmmKernel<<<dimGrid, dimBlock>>>(d_y, d_r, M, S); 

如果你的代碼包含appropriate runtime error checking,你應該已經知道,內核啓動與對S> 3的任何值無效配置錯誤而失敗。

相關問題