2016-07-29 76 views
1

我正在使用最新的CUDA 8.0與GTX 1080,並運行示例以測試速度。 (我知道他們不反映最佳的速度,但我只想水平進行比較。)CUDA 8.0,GTX 1080,爲什麼矢量加法比矩陣乘法慢5倍?

0_Simple/matrixMul,速度由代碼,這給衡量:

Performance= 1029.91 GFlop/s, Time= 0.127 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block 

然後我跑0_Simple/vectorAdd,並從上面的示例複製速度測試代碼。即:

// Measure speed 
    cudaEvent_t start; 
    cudaEventCreate(&start); 
    cudaEvent_t stop; 
    cudaEventCreate(&stop); 

    cudaEventRecord(start, NULL); 
    int nIter = 300; 
    for (int i = 0; i < nIter; i++) { 
     vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements); 
    } 
    cudaEventRecord(stop, NULL); 

    cudaEventSynchronize(stop); 
    float msecTotal = 0.0f; 
    cudaEventElapsedTime(&msecTotal, start, stop); 
    float msecPerAdd = msecTotal/nIter; 
    double flopsPerAdd = numElements; 
    double gigaFlops = (flopsPerAdd * 1.0e-9f)/(msecPerAdd/1000.0f); 
    printf("Performance= %.2f GFLOPS, Time= %.3f ms, Size= %.0f Ops\n", gigaFlops, msecPerAdd, flopsPerAdd); 

我也放大從50000numElements67108864。速度結果是:

Performance= 19.85 GFLOPS, Time= 3.380 ms, Size= 67108864 Ops 

這幾乎慢了5倍。

我知道示例代碼可能不是最優的,所以任何人都可以告訴我爲什麼vectorAdd代碼太慢,以及如何優化它?

我使用CUDA 8.0,GTX 1080

+0

'numElements'是什麼數字? – kangshiyin

+0

@ kangshiyin,我在帖子中說是67108864,這是64M。 – HanXu

+0

你可以顯示你的vectorAdd內核的代碼嗎?你是否編譯過啓用優化? – X3liF

回答

3

不同於矩陣乘法,向量加法是存儲器帶寬的限制操作。衡量其性能的正確方法是測量全局內存訪問的帶寬。對於矢量加法,它包括2個輸入和1個輸出矢量,可按如下方式計算。

3 * numElements * sizeof(d_A[0])/kernel_running_time 

你可以用一個簡單的D2D複製帶寬進行比較,以查看是否已達到高峯。

+0

我會試試這個,thx先! – HanXu

-1

編輯:用於GPU和CPU

我運行下面的實驗添加的代碼

*** Cuda的內核

__global__ void add(float *a, float *c , size_t N) 
{ 
    int tid = blockIdx.x*blockDim.x + threadIdx.x;  
    if(tid < N) a[tid] += c[tid]; 
} 

*** CPU幼稚版本(基線)

void naiveAdd(float *h_a, float *h_c, size_t N) 
{ 
    for (size_t i=0; i<N; i++) 
     h_a[i] += h_c[i]; 
} 

用於在同一機器(740M GPU,第4代i7)中添加兩個向量的性能比較,其中dif不同的CUDA GCC版本。

在CUDA 8.0,GCC 5 GPU版本是慢 enter image description here

在CUDA 7.5,GCC 4.8的GPU版本是快 enter image description here

有了這個證據,我可以斷定,這是更好地暫時避免CUDA 8.0。

+0

目前還不清楚你測量了什麼和如何。考慮添加完整的代碼,以及用於構建代碼的nvcc命令以及來自運行的原始數據(顯示經過的時間而不是加速)。 – njuffa

+0

我有使用Visual Studio的相關問題。使用CUDA Toolkit 7.5 + VS2013編譯的相同代碼比CUDA Toolkit 8 + VS2015快兩倍。 –