CUDA 8.0,GTX 1080,为什么向量相加比矩阵相乘慢5倍?

CUDA 8.0,GTX 1080,为什么向量相加比矩阵相乘慢5倍?,cuda,gpu,Cuda,Gpu,我正在使用最新的CUDA 8.0和GTX 1080,并运行样本来测试速度。(我知道它们不能反映最佳速度,但我只想横向比较。) 在0\u Simple/matrixMul中,速度由代码测量,代码给出: Performance= 1029.91 GFlop/s, Time= 0.127 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block 然后我运行了0\u Simple/vectorad,并从上面的示例中复制了速度测试代码。i、

我正在使用最新的CUDA 8.0和GTX 1080,并运行样本来测试速度。(我知道它们不能反映最佳速度,但我只想横向比较。)

0\u Simple/matrixMul
中,速度由代码测量,代码给出:

Performance= 1029.91 GFlop/s, Time= 0.127 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
然后我运行了
0\u Simple/vectorad
,并从上面的示例中复制了速度测试代码。i、 e:

// 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);
这几乎慢了5倍

我知道示例代码可能不太理想,所以有人能告诉我为什么vectorAdd代码如此缓慢,以及如何优化它吗


我使用的是CUDA 8.0和GTX 1080。与矩阵乘法不同,向量加法是内存带宽受限的操作。测量其性能的正确方法是测量全局内存访问的带宽。对于矢量加法,它包括2个输入矢量和1个输出矢量,可按如下方式计算

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

您可以将其与一个简单的D2D拷贝的带宽进行比较,看看您是否达到了峰值。

编辑:添加了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];
}
\uuuu全局\uuuuu无效添加(浮点*a,浮点*c,大小\u t N)
{
int tid=blockIdx.x*blockDim.x+threadIdx.x;
如果(tid
***CPU初始版本(基线)

void添加(float*h\u a,float*h\u c,size\t N)
{

对于(size_t i=0;我的编号是
numElements
?@kangshiyin,我在帖子中说,它是67108864,也就是64M。你能显示你的vectorAdd内核的代码吗?你编译时启用了优化吗?@X3liF,代码是安装Cuda的示例代码,我使用了示例提供的Makefile…你有权访问t吗不知道你测量了什么和如何测量。考虑添加完整的代码来显示代码,以及用于构建代码的NVCC命令和来自运行的原始数据(显示经过时间而不是加速)。。我在使用Visual Studio时遇到了相关问题。使用CUDA Toolkit 7.5+VS2013编译的代码比CUDA Toolkit 8+VS2015快两倍左右。
__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];
}
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];
}