L’algoritmo delle componenti connesse è un algoritmo che individua all’interno di una macroimmagine tutte le sottoimmagini presenti all’interno, etichettandole con una label. L’algoritmo sequenziale esisteva già e si è provato a implementare l’algoritmo in parallelo.
1. Facoltà degli studi
di Modena e Reggio Emilia
Facoltà di ingegneria
Impatto prestazionale delle GPU relativamente
all'ambito del connected components labeling
Relatore: Studente:
Prof. Costantino Grana Riccardo Galanti
A.A 2015 - 2016
2. Contributo del lavoro di tesi / Sommario
Studio dell'algoritmo delle componenti connesse operante
esclusivamente su CPU in modo sequenziale
Studio delle differenze architetturali CPU / GPU
Implementazione dell'algoritmo delle componenti
connesse utilizzando linguaggio CUDA su GPU
3. OBIETTIVO
Il riadattamento su GPU con
architettura Cuda dell'algoritmo sequenziale
del labeling delle componenti connesse
4. Labeling delle componenti connesse
Usato in visione artificiale per rilevare regioni connesse in
immagini digitali binarie
Raggruppa i pixel di un'immagine in componenti basati
sulla connettività dei pixel
Ogni pixel sarà marcato con un numero o con un colore
diverso in base al diverso gruppo di appartenenza
6. Implementazione sequenziale
Ricorsiva
Ogni pixel analizza se non è già stato marcato e se non fa
parte dello sfondo
Se la risposta è positiva si marca il pixel e si procede ad
analizzare ricorsivamente i vicini per vedere se fanno parte
di un'unica componente connessa
La connettività dei vicini può essere 4-way o 8-way
Si deve usare uno stratagemma per non riempire lo stack
con le varie chiamate ricorsive
7. Implementazione sequenziale (2)
image
Scan pixel by pixel
Pixel is not background
Check neighbours
Neighbours already labelled
Assign min label to main label
None of neighbours is labelled
Assign new label to pixel
9. CUDA
Compute Unified Device Architecture
Architettura hardware incentrata sul calcolo parallelo e
rivolta in particolare alla programmazione general-purpose
Parallelismo implementato suddividendo ogni processo in
thread, eseguibili in parallelo
I thread vengono eseguiti e schedulati a gruppi di 32
(warp)
I thread possono essere raggruppati in blocchi, che a loro
volta possono essere raggruppati in griglie
14. Implementazione parallela (3)
Passaggi restanti da fare:
Allocare spazio per l'immagine sulla GPU
Spostare l'immagine dalla CPU alla GPU
Lanciare il kernel, che sarà il cuore vero e proprio della
nostra applicazione in CUDA
Spostare l'immagine elaborata dalla GPU alla CPU
15. Implementazione parallela (4)
1) cudaMalloc((void**)&inputdevice, sizeof(int)* N);
2) cudaMemcpy(inputdevice, img.data, sizeof(int)* N,
cudaMemcpyHostToDevice);
3) kernel <<<grid,threads>>> (inputdevice,md, N, img.width);
4) cudaMemcpy(img.data, inputdevice, sizeof(int)* N,
cudaMemcpyDeviceToHost);
19. Conclusioni
Implementato efficacemente algoritmo in CUDA
Algoritmo parallelo notevolmente più lento
Evitare pre-labeling farebbe risparmiare tempo
Algoritmo sequenziale 8-way più lento di 4-way
Tempo algoritmo parallelo spirale 8-way molto inferiore a
4-way, altri tempi uguali
Immagine di input notevolmente più grande porterebbe
molti vantaggi all'algoritmo in CUDA