Tesi di laurea specialistica di Alessandro Bria Anno Accademico Relatore: Prof. Alfredo GermaniCorrelatore: Prof. Giulio Iannello
2/33 Sommario Il progetto Obiettivi del lavoro di tesi Introduzione al problema Architettura Diagramma delle classi Fase di importazione dei dati Fase di allineamento Fase di fusione Implementazione sequenziale Architettura Ipotesi di lavoro Parallelizzazione dell’importazione dei dati Parallelizzazione dell’allineamento Parallelizzazione della fusione Risultati Implementazione parallela
3/33 Il progetto (1/2) Rete neurale in formato vettoriale ACQUISIZIONE campione di tessuto di cervelletto murino ELABORAZIONE Obiettivo del progetto: combinare le metodiche più avanzate di microscopia ottica e di analisi di immagine per sviluppare un'innovativa tecnica ad alta risoluzione, capace di risolvere piccoli dettagli neuroanatomici del cervelletto murino e ricostruirne la rete neurale. ricostruzione deconvoluzione visualizzazione 3D riconoscimento sbiancamento dei tessuti fluorescenza ultramicroscopia costruzione dell’ultramicroscopio
ELABORAZIONE 4/33 Il progetto (2/2) Ricostruzione (allineamento + fusione) Ricostruzione (allineamento + fusione) Deconvoluzione Visualizzazione 3D Segmentazione e riconoscimento ACQUISIZIONE Z Y X Stato attuale di avanzamento Disallineamenti sovrapposizione Disallineamenti e sovrapposizione convenzione stack slice
5/33 Obiettivi del lavoro di tesi RICOSTRUZIONE FusioneFusione sequenziale 1. Implementazione sequenziale della fase di ricostruzione gestione dell’occupazione spaziale in RAM delle immagini 3D (un singolo stack occupa 1-10 GB) minimizzazione dell’I/O minimizzazione del tempo di esecuzione dei calcoli in virgola mobile parallela 2. Implementazione parallela della fase di ricostruzione scalabilità dell’applicazione architettura gestione della comunicazione tra i processi per lo scambio di dati AllineamentoAllineamento CROSS CORRELAZIONE CONTROLLO COORDINATE ASSOLUTE ACQUISIZIONE DECONVOLUZIONE Importazione dei dati
6/33 Implementazione sequenziale: architettura software Un solo modulo eseguibile che funziona secondo due modalità: 1) interattiva 1) interattiva: possibilità di eseguire singolarmente ciascuna sottofase della ricostruzione e di personalizzare alcuni parametri; 2) parametrica 2) parametrica: si esegue l’intera ricostruzione a partire da un file dei parametri fornito dall’utente. 1 2
7/33 Implementazione sequenziale: diagramma delle classi N ROW x N COL memorizza 1 usa triple +x: int +y: int +z: int memorizza 1 * StackOrganizer +StackOrganizer(path): StackOrganizer +getMACHINE(): string +[…] +getSTACK_2DARRAY(): stack** +print(): void +loadStackFromDIR(dir_path): void +loadStackFromXML(xml_file_path): void +saveStackToXML(xml_file_path): void +insertCorrespondence(…): void +loadAllTIFFFilesLists(…): void +clearAllTIFFFilesLists(…): void +checkAlignments(…): bool +computeAllAbsCoordinates(): void -MACHINE: string -ID: int -CREATION_DATE: string -DESCRIPTION: string -ABS_REF_X, ABS_REF_Y, ABS_REF_Z: string -VOXEL_X, VOXEL_Y, VOXEL_Z: string -N_PIXEL_X, N_PIXEL_Y: string -N_STACK_ROWS, N_STACK_COLUMNS: int -N_SLICES: int -STACK_2dARRAY: stack** -TOP_X_COORD, BOTTOM_X_COORD, LEFT_Y_COORD, RIGHT_Y_COORD, START_Z_COORD, END_Z_COORD: int #RC: 1174 StackProcessor -generateHomotheticTriple(…): triple -smooth(…): REAL_T +processStacks(…): void +computeParallelepipedonCoordinates(…): void +mergeSlicesRow(…): REAL_T* +mergeAllStacks(): void #RC: 816 Stack +Stack(…): Stack +getCONTAINER(): void* +[…] +getIMAGE_STACK(): REAL_T* +insertToNORTH(…): void +insertToEAST(…): void +insertToSOUTH(…): void +insertToWEST(…): void +loadTIFFFilesList(): void +clearTIFFFileList(): void +load3DStack(first_file, last_file): REAL_T* +deallocate3DStack(): void +computeAbsoluteCoordinates(): void -CONTAINER: StackOrganizer* -ROW_INDEX, COLUMN_INDEX: int -DIR_name: string -ABS_PATH: string -NORTH,EAST,SOUTH,WEST: list -FILES: vector -ABS_X_COORDINATE, ABS_Y_COORDINATE, ABS_Z_COORDINATE: int -IMAGE_STACK: REAL_T* #RC: 347 TIFFManager +save16bitGrayscaleTIFF (…): void +savePortion16bitGrayscaleTIFF (…): void +loadTIFFStackToREAL_T (…): REAL_T* #RC: 404 libcrossmips #RC: 645 usa tinyxml libtiff
8/33 Implementazione sequenziale: importazione dei dati (1/2) Obiettivo primario Obiettivo primario: passare da un’organizzazione dell’input in cartelle e file ad una gerarchia di oggetti predisposti per le fasi successive di allineamento e fusione. StackOrganizer StackOrganizer -rappresenta l’intera acquisizione -gestisce importazione ed esportazione dei metadati (globali + locali dei singoli stack) Stack Stack -rappresenta il generico stack metadati locali -contiene metadati locali (nomi dei file, percorsi delle cartelle, coordinate, liste di allineamenti con stack adiacenti, ecc.) TIFFManager -gestisce lettura in RAM delle immagini dello stack interfacciandosi con TIFFManager StackOrganizer TIFFManager N ROW x N COL Stack 1 usa memorizza libtiff usa
9/33 Implementazione sequenziale: importazione dei dati (2/2) Obiettivo secondario XML Obiettivo secondario: consentire in qualunque momento (soprattutto tra le sottofasi di allineamento e fusione) di esportare/importare i metadati in formato XML StackOrganizer TIFFManager N ROW x N COL Stack 1 usa memorizza libtiff usa DTDXML liste di allineamenti metadati globali metadati locali
10/33 Implementazione sequenziale: allineamento (1/7) Il problema ΔxΔyΔz Trovare i posizionamenti Δx, Δy e Δz per ogni coppia di stack adiacenti posizionamenti tra due immagini 3D O 1)Primo sottoproblema: trovare i posizionamenti tra due immagini 3D parzialmente sovrapposte di circa O (fattore di sovrapposizione) sul piano XY ; occupa- zione in memoria caricare 1 sola volta in RAM ciascuna immagine 2D 2)Secondo sottoproblema: gestire l’occupa- zione in memoria (un singolo stack occupa 1-10 GB) avendo la possibilità di caricare 1 sola volta in RAM ciascuna immagine 2D.
Maximum Intensity Projection 11/33 Implementazione sequenziale: allineamento (2/7) cross-correlazione tra due stack sottoproblema #1: cross-correlazione tra due stack libcrossmips #RC: 645 Y Z X MIP XZ MIP YZ MIP XY delay(Δ) regione di ricerca
Implementazione sequenziale: allineamento (3/7) strategia di caricamento degli stack sottoproblema #2: strategia di caricamento degli stack Y X E-W S-N E-W S-N E-W S-N E-W Occupazione spaziale massima 12/33 Numero di caricamenti in RAM per ciascuna immagine Numero di caricamenti in RAM per ciascuna immagine : E-W S-N
1)Per ogni coppia di stack adiacenti ci sono più posizionamenti, che dovrebbero essere coerenti fra di loro (ridondanza in Z) 2)In ogni quadrato di stack adiacenti, i posizionamenti reciproci non sono indipendenti fra di loro (ridonzanza in XY) Implementazione sequenziale: allineamento (4/7) Controllo degli allineamenti W-E /33
Y X 2 Implementazione sequenziale: allineamento (5/7) Calcolo delle coordinate assolute in pixel 14/33 1)livello locale: ogni oggetto Stack calcola le sue coordinate assolute a partire da quelle del vicino di sinistra (se esiste, oppure di quello a nord) e dai posizionamenti relativi. Per lo stack (0,0) si fissa X=Y=Z=0. 2)livello globale: si scansiona la matrice di oggetti Stack per righe successive, in maniera tale che a livello locale sia sempre possibile accedere al vicino di sinistra oppure a quello a nord (se siamo sulla prima colonna). 1
1) Il modello di costo adottato approssima bene il tempo totale di esecuzione: 2) La strategia di caricamento degli stack, su dataset reali, satura la RAM per n z >300 Implementazione sequenziale: allineamento (6/7) Risultati (1/2) 15/ Pericolo saturazione RAM
trade-off 3)Il tempo di esecuzione dei calcoli in virgola mobile ( T FP ) è inversamente proporzionale ad n z, ma per n z >300, con dataset reali, si può saturare la RAM (trade-off) 4) Il parametro Δ è quello a cui T FP è maggiormente sensibile, con un andamento di ordine quadratico Implementazione sequenziale: allineamento (7/7) Risultati (2/2) 16/33 4 3
Implementazione sequenziale: fusione (1/8) Il problema 17/33 allineare salvare l’acquizione 1)Noti gli allineamenti, è necessario allineare le immagini e salvare l’acquizione senza zone di sovrapposizione -minimizzazione dell’I/O -gestione della RAM -gestione di tutte le possibili configurazioni di posizionamento smoothing 2)A causa di differenze di luminosità, contrasto, messa a fuoco, ecc., è necessario operare uno smoothing per rendere graduale il passaggio da un’immagine all’altra lungo la direzione di sovrapposizione 1 2
Implementazione sequenziale: fusione (2/8) Lo smoothing lineare 18/33
Implementazione sequenziale: fusione (3/8) Soluzione semplificata 19/33 smoothing bidimensionale -alcune aree necessitano di smoothing bidimensionale -difficile gestire tutte le possibili configurazioni per piani XY lungoZ 1)si procede per piani XY successivi lungo Z smoothing lineari 2)si eseguono solo smoothing lineari in Y (creazione delle stripe) ed X (fusione tra stripe)
Implementazione sequenziale: fusione (4/8) Smoothing lungo Y: creazione di una stripe 20/33 1. si alloca una tantum l’intero spazio di memoria per la stripe, di cui si conoscono larghezza (uguale per tutte) ed altezza calcolata come x min -x max 2. si carica in memoria la prima slice e si copia la sua zona di non sovrapposizione nella stripe risultato; 3. si carica in memoria la seconda slice; 4. per la coppia di slice in memoria si considerano due differenti zone: zona di sovrapposizione: si esegue lo smoothing lineare lungo Y; zona di non sovrapposizione: si copiano semplicemente i pixel della seconda immagine. 5. si dealloca la prima slice; 6. si carica in memoria la terza slice; 7. per la coppia di slice in memoria si procede come al punto 4; 8. …e così via
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 1. si alloca un buffer di larghezza pari a quella di tutte le stripe ad altezza pari a quella delle nuove immagini da salvare; Ci troviamo ad un generico livello Z: il procedimento va quindi ripetuto per tutti i livelli Z significativi.YX
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 2. si carica stripe 1 come fusione della prima riga e si copia la sua zona di non sovrapposizione nel buffer;
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 3. si carica stripe 2 come fusione della seconda riga;
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 4. si esegue lo smoothing lungo X della zona di sovrapposizione di stripe 1 con stripe 2 e si trasferisce il risultato nel buffer
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 5. Si trasferisce nel buffer la zona di non sovrapposizione tra stripe 1 e stripe 2
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 6. Quando il buffer è pieno, viene diviso per la larghezza delle nuove immagini e si salvano le immagini così ottenute rispettando la convenzione adottata;
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 7. Si riparte dal punto in cui ci si era interrotti, sovrascrivendo i vecchi valori dello stesso buffer;
Implementazione sequenziale: fusione (5/8) Smoothing lungo X: fusione tra stripe e salvataggio 21/33 8. Si dealloca stripe 1 e si carica stripe 3 come fusione della terza riga; …e così via Occupazione spaziale massima Numero di caricamenti in RAM per ciascuna immagine Numero di caricamenti in RAM per ciascuna immagine : 1
Implementazione sequenziale: fusione (6/8) Risultati (1/3) 22/33
Implementazione sequenziale: fusione (7/8) Risultati (2/3) 23/33 1) Il modello di costo adottato non tiene conto delle copie delle zone di non sovrapposizione, tuttavia la maggior parte del tempo è ancora speso per l’I/O e per le operazioni floating point; 2) L’occupazione spaziale massima di memoria è molto ridotta e decresce lentamente all’aumentare di O; 1 2
Implementazione sequenziale: fusione (8/8) Risultati (3/3) 24/33 3) Il tempo di esecuzione dei calcoli in virgola mobile è sostanzialmente proporzionale ad O, nonostante la presenza del termine quadratico nella formula di costo: 3a 3b
Implementazione parallela: architettura 25/33 MIMD 1) Architettura MIMD (Multiple Instruction stream Multiple Data): ogni processore legge le proprie istruzioni ed opera sui propri dati multicomputer a memoria distribuita message passing - sottoclasse multicomputer a memoria distribuita: ogni processore ha la sua memoria e comunica con gli altri mediante message passing COW - sottoclasse COW (Cluster Of Workstations): computer commerciali separati collegati in rete SPMD 2) Modello SPMD (Single Program Multiple Data): stesso programma per tutti i processi
Implementazione parallela: ipotesi di lavoro 26/33 distribuzione dei dati 1) La distribuzione dei dati è ottenuta mediante suddivisione dell’acquisizione lungo l’asse Z in tanti sottovolumi quante sono le workstation; ordinamento tra i processi 2) Esiste un ordinamento tra i processi, ovvero il processo P i possiede il sottovolume i+1 dell’acquisizione; API standard MPI-1 3) Si utilizza l’API standard MPI-1 per il message passing, in particolare attraverso l’implementazione MPICH2.
Implementazione parallela: importazione dei dati 27/33 Il generico processo P i sa di possedere il sottovolume i+1 dell’acquisizione, ma non conosce esattamente l’intervallo Z di slice a cui fa riferimento, perché non conosce il numero esatto di slice degli altri processi. comunicazione collettiva Una comunicazione collettiva rende ogni processo consapevole del numero di slice degli altri processi, per cui ciascuno può calcolare l’intervallo Z di slice a cui fa riferimento. La versione parallela dell’importazione dei dati consiste nella corrispondente versione sequenziale più una piccola porzione di codice in cui si utilizzano le funzioni MPI per rendere ogni processo consapevole dell’esatta porzione di dati a cui fa riferimento.
Implementazione parallela: allineamento 28/33 controllo locale Ogni processo esegue un controllo locale degli allineamenti e calcola le coordinate assolute nello spazio globale, ma non è assicurato che queste siano uguali per tutti i processi. comunicazione molti-a-uno master 1)tramite una comunicazione molti-a-uno, tutti i processi inviano ad un processo master le loro coordinate assolute, il quale controlla che siano uguali; comunicazione uno-a-molti master 2)tramite una comunicazione uno-a-molti, il processo master comunica agli altri processi l’esito del suo controllo. La versione parallela dell’allineamento consiste nella corrispondente versione sequenziale con l’aggiunta di un controllo globale delle coordinate assolute. 1 2
Implementazione parallela: fusione (1/2) 29/33 Punto di vista del singolo processo
Implementazione parallela: fusione (2/2) 30/33 Punto di vista dell’insieme dei processi
1)Singola workstation con 8 processori ed unico hard disk - Conflitti in I/O → aumento dell’I/O al crescere del numero dei processi - Interferenze tra i processi - Interferenze tra i processi nell’accesso al sottosistema di memoria → sincronizzazione nelle regioni di processamento dei dati mediante inserimento di barriere valutazione preliminare scalabilità 2)Possibilità di dare una valutazione preliminare alla scalabilità dell’applicazione 3)Suddivisione bilanciata dei dati tra i processi e test con 2 fino ad 8 processori Implementazione parallela: risultati (1/3) 31/33 Ipotesi di lavoro ed obiettivi dei test PN z (P 1 )N z (P 2 )N z (P 3 )N z (P 4 )N z (P 5 )N z (P 6 )N z (P 7 )N z (P 8 )
Implementazione parallela: risultati (2/3) 32/33 Valutazione preliminare della scalabilità dell’applicazione 1 2
Implementazione parallela: risultati (3/3) 33/33 Conclusioni 1. alla luce dell’interferenza che esiste tra i processi in esecuzione sulla stessa macchina, con la parallelizzazione della fase di allineamento abbiamo ottenuto l’effetto desiderato dal punto di vista della scalabilità. del 90% rispetto alla versione sequenziale I risultati sono incoraggianti per il futuro e rendono concreta la possibilità di abbattere il tempo di esecuzione dell’allineamento tra stack anche oltre del 90% rispetto alla versione sequenziale, utilizzando un numero relativamente basso di workstation (6-8). 2. la parallelizzazione della fase di fusione mostra, in assenza di comunicazioni tra i processi, effetti positivi dal punto di vista della scalabilità.