2010-06-05 3 views
2

J'écris un noyau CUDA pour Histogram sur une image, mais je n'avais aucune idée comment retourner un tableau depuis le noyau, et le tableau va changer quand un autre thread le lira. Une solution possible pour cela?comment créer un noyau d'histogramme CUDA?

__global__ void Hist(
    TColor *dst, //input image 
    int imageW, 
    int imageH, 
int*data 
){ 
    const int ix = blockDim.x * blockIdx.x + threadIdx.x; 
    const int iy = blockDim.y * blockIdx.y + threadIdx.y; 

if(ix < imageW && iy < imageH) 
{ 
    int pixel = get_red(dst[imageW * (iy) + (ix)]); 
        //this assign specific RED value of image to pixel 

    data[pixel] ++; // ?? problem statement ... 
} 
} 

@para d_dst: l'image d'entrée TColor est égale à float4.

données @para: le tableau pour la taille de l'histogramme [255]

extern "C" void 
cuda_Hist(TColor *d_dst, int imageW, int imageH,int* data) 
{ 
    dim3 threads(BLOCKDIM_X, BLOCKDIM_Y); 
    dim3 grid(iDivUp(imageW, BLOCKDIM_X), iDivUp(imageH, BLOCKDIM_Y)); 
    Hist<<<grid, threads>>>(d_dst, imageW, imageH, data); 
} 

Répondre

5

Avez-vous regardé l'exemple SDK? L'exemple «histogramme» est disponible dans le SDK CUDA (actuellement la version 3.0 sur la version bêta de NVIDIA developer site, version 3.1 disponible pour registered developers). La documentation avec l'exemple explique bien comment gérer votre sommation, soit en utilisant des atomiques de mémoire globale sur le GPU, soit en collectant les résultats pour chaque bloc séparément et ensuite en effectuant une réduction séparée (sur l'hôte ou le GPU).

2

histogrammes est pas particulièrement efficace lorsque mis en œuvre avec CUDA (ou GPGPU en général) - En général, vous devez générer beaucoup d'histogrammes partiels mémoire partagée, puis les additionner. Vous pourriez envisager de garder cette tâche particulière sur le CPU.

+0

Cependant, Ma tâche consiste à utiliser CUDA pour appliquer un histogramme. Et je ne peux pas le finir. Les données ne peuvent pas atteindre – kitw

0

Vous devrez soit utiliser la fonction atomique pour bloquer d'autres threads en utilisant la même mémoire, soit utiliser l'histogramme partiel. Dans tous les cas, ce n'est pas efficace à moins que l'image d'entrée soit très grande.