Je travaille sur un petit projet de traitement d'image. Je veux lancer un programme CUDA qui effectue une soustraction d'image. Vous avez donc le fond de l'image et une image avec le même arrière-plan, mais avec d'autres éléments. Une fois que vous soustrayez les images, vous obtiendrez ce qui reste. Les deux images sont toutes deux de taille 480 * 360 et mon GPU est GTX780. Mon programme génère une erreur ./main': free(): invalid next size (normal): 0x000000000126bd70 *** Aborted (core dumped)
et l'image de sortie est erronée. Je me suis cassé la tête pour résoudre ce problème. Voici le code:Erreur de traitement d'image CUDA
Le noyau:
__global__ void add(unsigned char* a, unsigned char* b, unsigned char* c, int numCols, int numWidth) {
int i = blockIdx.x * blockDim.x + threadIdx.x; //Column
int j = blockIdx.y * blockDim.y + threadIdx.y; //Row
if(i < numWidth && j < numCols)
{
int idx = j * numCols + i;
c[idx] = b[idx] - a[idx];
}
}
et la fonction principale:
int main() {
CImg<unsigned char> img1("1.bmp");
CImg<unsigned char> img2("2.bmp");
//both images have the same size
int width = img1.width();
int height = img1.height();
int size = width * height * 3; //both images of same size
dim3 blockSize(16, 16, 1);
dim3 gridSize((width + blockSize.x - 1)/blockSize.x, (height + blockSize.y - 1)/blockSize.y, 1);
unsigned char *dev_a, *dev_b, *dev_c;
cudaMalloc((void**)&dev_a, size * (sizeof(unsigned char)));
cudaMalloc((void**)&dev_b, size * (sizeof(unsigned char)));
cudaMalloc((void**)&dev_c, size * (sizeof(unsigned char)));
cudaMemcpy(dev_a, img1, size * (sizeof(unsigned char)), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, img2, size * (sizeof(unsigned char)), cudaMemcpyHostToDevice);
add<<<gridSize, blockSize>>>(dev_a, dev_b, dev_c, height, width);
cudaMemcpy(img2, dev_c, size * (sizeof(unsigned char)), cudaMemcpyDeviceToHost);
img2.save("out.bmp");
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
return 0;
}
L'image est chargée avec la bibliothèque CImg.
La ligne 'int idx = j * i + de numCols,' 'j précédé par
@mman sans erreur – KostasRim
@mman non pour l'appareil. Si c'était sur l'hôte ce serait malloc ou nouveau. Le problème est en octets je pense que peu d'octets sont alloués – KostasRim