2016-03-31 2 views
2

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.

+1

La ligne 'int idx = j * i + de numCols,' 'j précédé par

+0

@mman sans erreur – KostasRim

+0

@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

Répondre

1

Le problème résidait dans l'utilisation incorrecte des conteneurs cimg dans le code hôte. Selon le documentation, le pointeur de données d'image est accessible via la méthode data(), ce qui signifie que les appels cudaMemcpy dans le code hôte doivent être fournis avec img1.data() et img2.data().

[cette réponse a été assemblé à partir des commentaires et ajouté en tant qu'entrée communauté wiki]