2012-11-09 56 views
3

我從我的MATLAB實現中調用了CUDA內核;但是我的CPU結果比我的GPU實現更快。我知道更大的矩陣可以獲得更好的性能,但是當我嘗試大尺寸時,我的GPU性能也很低。從MATLAB調用內核低性能

的結果是: CPU:0.000006 GPU:0.00134 我的內核和MATLAB代碼如下:提前

謝謝!

matrix.cu 

__global__ void matrix_mult2(double *A, double *B, double * C) { 
    int x = threadIdx.x; 

C[x] = A[x] * B[x]; 


} 



main.m 
kernel = parallel.gpu.CUDAKernel('matrix_mult2.ptx', ... 
           'matrix_mult2.cu'); 


kernel.ThreadBlockSize = [25,1,1]; 
kernel.GridSize = [1,1]; 


A = parallel.gpu.GPUArray.rand(5,5,'double'); 
B = parallel.gpu.GPUArray.rand(5,5,'double'); 
C = parallel.gpu.GPUArray.zeros(5,5); 

C = feval(kernel,A,B,C); 
+0

結果的尺寸是多少? – talonmies

+0

我試圖確定是否對於相對較小的矩陣我是否收到較低的性能,並且還試圖確定cuda線程的最佳配置,因爲這可能會影響性能。 –

+0

謝謝您的回覆! 我也嘗試過大矩陣621 x 1176,而GPU(0.00834)的性能仍然比CPU慢(0.001513) Where, kernel.ThreadBlockSize = [1024,1,1]; kernel.GridSize = [713,1]; tic C = feval(kernel,A,B,C); wait(gpuDevice(1)); C = gather(C) time = toc 我的CPU版本: 是A = rand(621,1176); B = rand(621,1176); C = rand(621,1176); 抽動 C = A. * B TOC 在先進的感謝 –

回答

1

您需要給GPU一些真正的工作。在您當前的示例中,唯一耗時的操作是將數據複製到GPU並返回。由於CPU不必執行這些步驟,因此它在這裏具有明顯的優勢。嘗試大矩陣的實數矩陣乘法(不是元素乘法)。

用稍微更正式的術語來說,你的內核是PCIe帶寬限制的。爲了分攤前後複製元素的時間,你需要做一些比數據複製昂貴得多的操作。元素相乘是便宜的,並且與N成線性比例。的乘法N×N -matrices秤與Ñ 而數據傳輸僅與Ñ 磅秤,因此對於足夠大的矩陣在GPU矩陣乘法會比在CPU上更快。