gpt4 book ai didi

image-processing - 使用CUDA反转图像时出现未知错误

转载 作者:行者123 更新时间:2023-12-02 16:50:11 25 4
gpt4 key购买 nike

我开始使用cuda实现一些简单的图像处理,但是我的代码有错误
当我将像素从设备复制到主机时会发生错误

这是我的尝试

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <stdio.h>
using namespace cv;

unsigned char *h_pixels;
unsigned char *d_pixels;
int bufferSize;
int width,height;

const int BLOCK_SIZE = 32;
Mat image;

void get_pixels(const char* fileName)
{
image = imread(fileName);
bufferSize = image.size().width * image.size().height * 3 * sizeof(unsigned char);
width = image.size().width;
height = image.size().height;
h_pixels = new unsigned char[bufferSize];
memcpy(h_pixels,image.data,bufferSize);
}

__global__ void invert_image(unsigned char* pixels,int width,int height)
{
int row = blockIdx.y * BLOCK_SIZE + threadIdx.y;
int col = blockIdx.x * BLOCK_SIZE + threadIdx.x;
int cidx = (row * width + col) * 3;
pixels[cidx] = 255 - pixels[cidx];
pixels[cidx + 1] = 255 - pixels[cidx + 1];
pixels[cidx + 2] = 255 - pixels[cidx + 2];

}
int main()
{
get_pixels("D:\\photos\\z.jpg");

cudaError_t err = cudaMalloc((void**)&d_pixels,bufferSize);
err = cudaMemcpy(d_pixels,h_pixels,bufferSize,cudaMemcpyHostToDevice);
dim3 dimBlock(BLOCK_SIZE,BLOCK_SIZE);
dim3 dimGrid(width/dimBlock.x,height/dimBlock.y);

invert_image<<<dimBlock,dimGrid>>>(d_pixels,width,height);

unsigned char *pixels = new unsigned char[bufferSize];


err= cudaMemcpy(pixels,d_pixels,bufferSize,cudaMemcpyDeviceToHost);// unknown error
const char * errStr = cudaGetErrorString(err);
cudaFree(d_pixels);
image.data = pixels;
namedWindow("display image");
imshow("display image",image);
waitKey();
return 0;
}

也如何找出在cuda设备中发生的错误
谢谢你的帮助

最佳答案

  • 首先,请确保正确读取了图像文件。
  • 检查是否使用CUDA_SAFE_CALL(cudaMalloc(..))
  • 分配了设备内存
  • 检查图像的尺寸。如果图像的尺寸不是BLOCKSIZE的倍数,则可能会缺少一些索引,并且图像没有完全反转。
  • 在内核调用之后调用cudaDeviceSynchronize并检查其返回值。
  • 在运行代码而未调用内核时是否出现任何错误?
  • 您没有释放h_pixels,可能会发生内存泄漏。
  • 您可以使用“blockDim.x”而不是在内核中使用BLOCKSIZE。因此计算索引,例如“blockIdx.x * blockDim.x + threadIdx.x”
  • 尽量不要触摸内核代码中的内存区域,即注释掉内核处的内存更新(访问像素数组的行),并检查程序是否继续失败。如果它没有继续失败,则可能是您无法访问。
  • 关于image-processing - 使用CUDA反转图像时出现未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483321/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com