CUDA 8.0,GTX 1080,为什么向量相加比矩阵相乘慢5倍?
我正在使用最新的CUDA 8.0和GTX 1080,并运行样本来测试速度。(我知道它们不能反映最佳速度,但我只想横向比较。) 在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、
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];
}