2016-07-29 71 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快两倍。 –