cuda改写C++代码,进行移植GPU上优化速度反而变慢?

-阿白- 2015-11-04 11:58:16
将一个C++代码进行移植到GPU上,为了并行计算,实现运行时间减少加速。

但是在运行过程中,发现:移植到GPU反而耗时更长,后面检索了一下资料和进行测试,发现应该是cudaMemcpy这部分耗时了,计算部分在GPU上很快便执行了,求各路大神,提点意见,如何让我的代码移植到GPU上并行计算,且加速!谢谢!

以下是改写前的部分代码:


mat2D<int>* s::GetResidual(mat2D<int> *img, mat2D<int>* kernel)
{
mat2D<int> *residual = new mat2D<int>(img->rows-kernel->rows+1, img->cols-kernel->cols+1);
for (int ir=0; ir < (img->rows - kernel->rows + 1); ir++)
{
for (int ic=0; ic < (img->cols - kernel->cols + 1); ic++)
{
int convVal = 0;
for (int kr=0; kr < kernel->rows; kr++)
{
for (int kc=0; kc < kernel->cols; kc++)
{
convVal = convVal + img->Read(ir+kr, ic+kc) * kernel->Read(kr, kc);
}
}
residual->Write(ir, ic, convVal);
}
}
return residual;
}


改写为cuda的代码:

__global__ void GPU_GetResidual(int *img_arr, int img_cols, int *kernel_arr, int kernel_rows, int kernel_cols, int *res_arr, int res_cols)
{
int ir = blockIdx.x;
int ic = blockIdx.y;

int convVal = 0;

for (int kr=0; kr < kernel_rows; kr++)
{
for (int kc=0; kc < kernel_cols; kc++)
{
convVal = convVal + img_arr[(ir+kr)*img_cols+(ic+kc)] * kernel_arr[kr*kernel_cols+kc];
}
}

res_arr[ir*res_cols+ic] = convVal;
}

mat2D<int>* s::GetResidual(mat2D<int> *img, mat2D<int>* kernel)
{
mat2D<int> *residual = new mat2D<int>(img->rows-kernel->rows+1, img->cols-kernel->cols+1);

std::vector<int> img_ve = img->getVector();
std::vector<int> kernel_ve = kernel->getVector();
std::vector<int> res_ve = residual->getVector();

int *img_arr;
cudaMalloc((void**) &img_arr, img_ve.size()*sizeof(int));
cudaMemcpy(img_arr, &img_ve[0], img_ve.size()*sizeof(int), cudaMemcpyHostToDevice);

int *kernel_arr;
cudaMalloc((void**) &kernel_arr, kernel_ve.size()*sizeof(int));
cudaMemcpy(kernel_arr, &kernel_ve[0], kernel_ve.size()*sizeof(int), cudaMemcpyHostToDevice);

int *res_arr;
cudaMalloc((void**) &res_arr, residual->rows * residual->cols * sizeof(int));

dim3 blocks(img->rows - kernel->rows + 1, img->cols - kernel->cols + 1);

GPU_GetResidual<<<blocks, 1>>>(img_arr, img->cols, kernel_arr, kernel->rows, kernel->cols, res_arr, residual->cols);

cudaMemcpy(&res_ve[0], res_arr, residual->rows * residual->cols * sizeof(int), cudaMemcpyDeviceToHost);

residual->setVector(res_ve);

cudaFree(res_arr);
cudaFree(kernel_arr);
cudaFree(img_arr);

return residual;
}
...全文
885 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
stellarman 2015-11-15
  • 打赏
  • 举报
回复
内存的读写img_arr[(ir+kr)*img_cols+(ic+kc)] 跨行超过cache了,这个CUDA肯定很慢

581

社区成员

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

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