581
社区成员
发帖
与我相关
我的任务
分享
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;
}
__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;
}