新手问下关于CUDA效率的问题

a5680737 2015-04-09 06:53:14
试了一下一个简单的矩阵相加的并行程序 感觉效率非常低下 主要是memcpy和malloc太费时间了 求教一下各位大神这种问题怎么解决?是由于计算量太少还是我代码的问题?
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = blockIdx.x;
int j = threadIdx.x;
int idx = i*blockDim.x+j;
c[idx] = a[idx] * b[idx];
c[idx] += a[idx] * b[idx];
}
const int arraySize = 100;
int main()
{
int a[arraySize][arraySize];
int b[arraySize][arraySize];
int c[arraySize][arraySize];
int c1[arraySize][arraySize];

for(int i = 0;i<arraySize;i++)
{
for(int j = 0;j<arraySize;j++)
{
a[i][j] = i;
b[i][j] = 2*i;
}
}
cudaError_t cudaStatus;
// Choose which GPU to run on, change this on a multi-GPU system.
cudaStatus = cudaSetDevice(0);

clock_t t1 = clock();

int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
// Allocate GPU buffers for three vectors (two input, one output) .
cudaStatus = cudaMalloc((void**)&dev_c, arraySize * arraySize * sizeof(int));

cudaStatus = cudaMalloc((void**)&dev_a, arraySize * arraySize * sizeof(int));

cudaStatus = cudaMalloc((void**)&dev_b, arraySize * arraySize * sizeof(int));

// Copy input vectors from host memory to GPU buffers.
cudaStatus = cudaMemcpy(dev_a, a, arraySize * arraySize * sizeof(int), cudaMemcpyHostToDevice);

cudaStatus = cudaMemcpy(dev_b, b, arraySize * arraySize * sizeof(int), cudaMemcpyHostToDevice);

// Launch a kernel on the GPU with one thread for each element.
addKernel<<<arraySize, arraySize>>>(dev_c, dev_a, dev_b);


// Check for any errors launching the kernel
cudaStatus = cudaGetLastError();

// cudaDeviceSynchronize waits for the kernel to finish, and returns
// any errors encountered during the launch.
cudaStatus = cudaDeviceSynchronize();

// Copy output vector from GPU buffer to host memory.
cudaStatus = cudaMemcpy(c, dev_c, arraySize * arraySize * sizeof(int), cudaMemcpyDeviceToHost);

clock_t t2 = clock();
cout<<"time:"<<t2-t1<<endl;

for(int i = 0;i<arraySize;i++)
{
for(int j = 0;j<arraySize;j++)
{
c1[i][j] = a[i][j] + b[i][j];
c1[i][j] += a[i][j] * b[i][j];
c1[i][j] += a[i][j] * b[i][j];
c1[i][j] += a[i][j] * b[i][j];
}
}
t1 = clock();
cout<<"time:"<<t1-t2<<endl;
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
cudaStatus = cudaDeviceReset();

return 0;
}



以上是代码和运行截图 谢谢各位大神了!
...全文
387 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spidey212 2015-05-05
  • 打赏
  • 举报
回复
在实际的项目中,通过CUDA获得十几的加速比是常有的事,几十到一百的加速比也不是没有,矩阵相乘这样的高并行性问题当数据达到一定规模时,就很容易达到硬件加速的阈值,这时,对显卡资源的利用就很充分了,LZ可以测试一下
Spidey212 2015-05-05
  • 打赏
  • 举报
回复
CudaMalloc基本不耗时,都是1ms以内完成,主要是CudaMemcpy,内存显存之间单向拷贝一般几十兆的数据在20ms左右。 而核函数的运行效率又跟很多因素有关,如访存延时,线程束的调度等。 GPU和CPU对比来看,一般高并行大密度的计算用GPU加速才能得到可观的加速比,楼主这个运算CPU都只需要2ms,数据规模应该不大,加上数据拷贝额外耗时,CPU比GPU处理得快很正常。
YCMyTot 2015-04-10
  • 打赏
  • 举报
回复
数据量太少,还有就是每存取一次内存只进行了一次加法运算,运算较为简单。 可以试着扩大一下矩阵的大小,看看是否有性能的提升。 还有: c[idx] = a[idx] * b[idx]; c[idx] += a[idx] * b[idx]; 没有搞懂第二句代码的意思
a5680737 2015-04-10
  • 打赏
  • 举报
回复
引用 1 楼 u014693181 的回复:
数据量太少,还有就是每存取一次内存只进行了一次加法运算,运算较为简单。 可以试着扩大一下矩阵的大小,看看是否有性能的提升。 还有: c[idx] = a[idx] * b[idx]; c[idx] += a[idx] * b[idx]; 没有搞懂第二句代码的意思
开始写的相加 后来想着增加计算量 多弄了两行

581

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧