---+++ A.A. 2018-2019, primo semestre $ style="border-left: 1px solid #999999; "><br />%TOC% | | <font color="#AF0F0F" size="+1"> *Docente: [[http://www.dsi.uniroma1.it/~finocchi][Irene Finocchi]]* </font> <p> </p> *Ricevimento*: mercoledì 9:30-10:30 (oppure in altri giorni/orari da concordare via e-mail) durante il corso; per appuntamento al termine del corso.<br />Ufficio: Dipartimento di Scienze Statistiche, Città Universitaria, quarto piano, stanza 21. Tel: 06-49910384. <br />E-mail: irene.finocchi AT uniroma1.it <p> </p> | | <div align="left"> </div> <div align="left"> *Orario delle lezioni* </div> <p> </p> <table border="1" cellpadding="0" cellspacing="1"> <tbody> <tr><th>Giorno</th><th>Ore</th><th>Aula</th></tr> <tr> <td>Lunedì</td> <td>8:00-10:30</td> <td>Aula 2 - Via del Castro Laurenziano 7A</td> </tr> <tr> <td>Martedì</td> <td>8:00-10:30</td> <td>Aula 2 - Via del Castro Laurenziano 7A</td> </tr> </tbody> </table> | | ---++++ Avvisi * *Appello di settembre*: 5 settembre, ore 9:00, aula 34, Dipartimento di Statistica (quarto piano). <p> </p> * [[https://drive.google.com/file/d/12sSg7yEMfDXyBjjDmF0DQuOD_qoELAqv/view?usp=sharing][Risultati e voti finali]] per coloro che hanno ultimato l'esame nell'appello di febbraio. Procederò d'ufficio alla verbalizzazione su Infostud, salvo diversa comunicazione da parte vostra entro sabato 16 marzo. <p> </p> * [[https://drive.google.com/file/d/1JsLIFqs_ZBKUgSUw8c5Uz3yezwue8J5j/view?usp=sharing][Voti finali proposti]] per coloro che hanno ultimato l'esame svolgendo gli esoneri o il primo appello. Procederò d'ufficio alla verbalizzazione su Infostud, salvo diversa comunicazione da parte vostra entro lunedì 11 febbraio. <p> </p> * [[https://drive.google.com/file/d/1c918Ioo7wdr19Ya3EMo-YwUo9OCShpqP/view?usp=sharing][Risultati appello 14 gennaio]]. A breve i voti finali inclusi gli homework. <p> </p> * *Appello 14 gennaio 2019*: l'esame si svolgerà in <b>aula P2</b> (Città universitaria). Prima parte: ore <b>9:00</b>. Seconda parte: ore <b>10:30</b>. <p> </p> * [[https://drive.google.com/file/d/18MzMkieSEBytWJKkz5uzJsz_cNHKfBFO/view?usp=sharing][Risultati seconda prova intermedia]]. Sarà possibile visionare il compito giovedì 10 gennaio dalle 9:30 alle 11:00. Per coloro che abbiano superato entrambi gli esoneri, dopo la data di consegna degli homework prevista per il primo appello e la relativa valutazione, pubblicherò il voto finale, ottenuto come descritto nelle modalità d'esame. Per poter verbalizzare, ricordatevi di prenotarvi su Infostud. <p> </p> * [[https://drive.google.com/file/d/1B2VaaSCXSG6tP4ongO4xLAhKpFuNHRbz/view?usp=sharing][Risultati prima prova intermedia]] <p> </p> * <font color="#AF0F0F"><b>Seconda prova intermedia</b> </font>: martedì <b>18 dicembre</b>, ore <b>8:00 - 10:30</b>, Aula 6. La [[Prenotazioni.2019_12_18_PSMCSecondaProvaIntermedia][prenotazione]] è obbligatoria. <p> </p> * [[%PUBURL%/PSMC/WebHome/homework_novembre2018.pdf][Homework 2018]]: Sudoku in parallelo. [[%PUBURL%/PSMC/WebHome/testSetsHomework.zip][A questo link]] trovate alcuni benchmark su cui testare la vostra applicazione. <p> </p> * Per un problema di salute la lezione del 26 novembre è annullata. Verificherò in settimana se c'è uno slot libero in modo da poterla recuperare. <p> </p> * [[https://drive.google.com/file/d/1Cbi-2qBDhq_MSB5kO00vhJHEeB8VENxr/view?usp=sharing][Presentazione LVenture Group]] <p> </p> * <font color="#AF0F0F"><b>Sospensione attività didattica 30 ottobre</b> </font>: a valle della decisione del Comune di chiudere tutte le scuole di ogni ordine e grado causa maltempo, il Rettore ha disposto la sospensione dell'attività didattica. La lezione del 30 ottobre non avrà quindi luogo. Di conseguenza, la <b>data della prova intermedia</b> è posticipata dal 5 al <b>12 novembre</b>. <p> </p> * <font color="#AF0F0F"><b>Sospensione attività didattica 29 ottobre</b> </font>: a valle della decisione del Comune di chiudere tutte le scuole di ogni ordine e grado causa maltempo, il Rettore ha disposto la sospensione dell'attività didattica. La lezione del 29 ottobre non avrà quindi luogo. <p> </p> * <font color="#AF0F0F"><b>Prima prova intermedia</b> </font>: lunedì <b>12 novembre</b>, ore <b>8:00 - 10:30</b>, Aula 6. La [[Prenotazioni.2018_11_05_PSMCProvaIntermedia][prenotazione]] è obbligatoria. <p> </p> * *Cambio aula*: <b>tutte</b> le lezioni del <b>terzo anno</b> sono state spostate dall'aula L2 all'aula <b>L6</b>, sempre in Via del Castro Laurenziano. <p> </p> * Iscrivetevi al <font color="#AF0F0F"> [[http://groups.google.com/group/programmazione-di-sistemi-multicore][Google group]]</font> per avvisi, notizie last-minute e discussioni sugli argomenti del corso. <p> </p> <!--<br /><br /> * <b>Risultati secondo appello sessione estiva</b>: [[https://drive.google.com/file/d/1z8oc9YuMbDarBE6nWhm-c5fzsBntkLTu/view?usp=sharing][voti]]. Chiuderò il secondo appello all'inizio della prossima settimana, quindi avete tempo fino al weekend per consegnarmi gli homework. Se non riuscite, potete consegnarli in settembre, prenotandovi su Infostud e ricordandomi per email la vostra situazione. Lo studente 1610406, che ha completato l'esame, è pregato di confermarmi l'accettazione del voto per email in modo da procedere alla verbalizzazione. <br /><br /> * Tutti gli studenti che devono sostenere l'esame di PSMC il giorno <b>5 giugno</b>, sia prima che seconda parte, possono presentarsi alle <b>ore 9:00</b> in aula alfa. <br /><br /> * [[https://drive.google.com/file/d/1XuraKR5ORaPl8xyECVFl0yY_4n-PDqSG/view?usp=sharing][Proposte di voto]] per gli studenti che hanno superato lo scritto nell'appello del 29 gennaio e consegnato entrambi gli homework. Contattatemi entro venerdì 23 febbraio se non intendete accettare il voto. Se non ricevo mail entro venerdì, procederò con la verbalizzazione su Infostud. <br /><br /> * [[https://drive.google.com/file/d/1FYOPJZTwnwKOaAHJhzvxELcb6rvmX4Pq/view?usp=sharing][Voti appello 29 gennaio 2018]]. A breve pubblicherò le proposte di voto per gli studenti del secondo appello che hanno consegnato entrambi gli homework. Per eventuali domande sul compito, ho fissato un ricevimento per mercoledì 21 febbraio dalle 9:30 alle 11:00.<br /><br /> * [[https://drive.google.com/file/d/12mOXbdmb59jt2WL_fQMDasFAX6dCtss0/view?usp=sharing][Proposte di voto]] per gli studenti che hanno superato entrambe le parti scritte entro il primo appello (8 gennaio) e consegnato entrambi gli homework. Contattatemi entro venerdì 9 febbraio se non intendete accettare il voto. Se non ricevo mail entro venerdì, procederò con la verbalizzazione su Infostud. <br /><br /> * L'homework 2 è disponibile [[https://drive.google.com/file/d/1uAwH9w9pUi_qndzi6Y1pdw_tH4FEfbcO/view?usp=sharing][a questo link]], insieme ad alcune [[https://drive.google.com/file/d/1LY39QbbMSicRxp2J4Ft5QjA9cBzgFuB6/view?usp=sharing][immagini di test]] e [[https://drive.google.com/file/d/1dUsI3X3dUbnoVB43sJ06nD6Hi4iZX9I6/view?usp=sharing][utility per la gestione immagini]] in formato pgm.<br /><br /> * <font color="#AF0F0F"><b>Seconda prova intermedia</b></font>: martedì <b>19 dicembre</b>, ore <b>8:00 - 10:30</b>. La [[Prenotazioni.2017_12_19_ProgrammazioneSistemiMulticoreEsonero2][prenotazione]] è obbligatoria.<br /><br /> * [[https://drive.google.com/file/d/1eWBW6OreqdWt2XToK03KrtCZSqEURNgK/view?usp=sharing][Voti prova intermedia 7 novembre 2017]]. Correzione e visione del compito: in aula, lunedì 27 novembre.<br /><br /> * L'homework 1 è disponibile [[https://drive.google.com/file/d/1xrKUqgSgm7e9OWoBvKJl5u9V_QsUWa38/view?usp=sharing][a questo link]]. Deadline: 30 dicembre 2017.<br /><br /> * <font color="#AF0F0F"> <b>Esame del 13 gennaio</b> </font>: l'esame inizierà alle ore 9:00 (puntuali). La prova sarà divisa in due parti: chi deve sostenere solo la seconda parte può presentarsi direttamente alle 10:30. Non sarà possibile verbalizzare domani i voti dell'esonero: la verbalizzazione avverrà contestualmente a quella della prova d'esame di domani, per cui comunicherò una data a breve. <p> </p><br /><br /> * <font color="#AF0F0F"> <b>Esercizi per la preparazione al secondo esonero</b> </font>: [[http://homes.cs.washington.edu/~djg/teachingMaterials/spac/#exam][concorrenza]] (esercizi da 6 a 9, il file contiene anche le soluzioni), [[%PUBURL%/PSMC/WebHome/eserciziOpenCL.pdf][esercizi OpenCL]]. <p> </p><br /><br /> * <font color="#AF0F0F"><b>Appelli invernali</b></font>: i due appelli si svolgeranno il <b>10</b> e il <b>31 gennaio</b>, alle ore <b>9:00</b>, in <b>Aula 13</b>. E' obbligatoria la prenotazione su Infostud. La prova sarà divisa in due parti: chi deve sostenere solo la seconda parte può presentarsi direttamente alle 10:30. <p> </p><br /><br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReY1RwMnAzcXlHZGM/view?usp=sharing][Voti esonero 2]]. Gli studenti che hanno superato entrambi gli esoneri e hanno consegnato (o sono in procinto di consegnare) gli homework, possono prenotarsi in uno degli appelli aperti su Infostud per la verbalizzazione. Comunicherò dopo la valutazione degli homework i voti definitivi e una data per verbalizzare.<br /><br /> * [[%PUBURL%/PSMC/WebHome/homework2_dicembre2016.pdf][Homework 2]]: descrizione, modalità di svolgimento e di consegna.<br /><br /> * [[%PUBURL%/PSMC/WebHome/homework1_novembre2016.pdf][Homework 1]]. Alcune istanze su cui testare il codice sono le seguenti:<br /> * [[%PUBURL%/PSMC/WebHome/debugInstances.tar.gz][debugInstances.tar.gz]]: istanze di Sudoku utili per il debugging. Le istanze game0.txt, game1.txt e game2.txt hanno una soluzione unica, mentre game3.txt ha 50142 soluzioni<br /> * Screenshot di una esecuzione: [[%PUBURLPATH%/PSMC/WebHome/Screenshot.png][Screenshot game3]]<br /> * [[%PUBURL%/PSMC/WebHome/test1.tar.gz][test1.tar.gz]]: benchmark 1<br /> * [[%PUBURL%/PSMC/WebHome/test2.tar.gz][test2.tar.gz]]: benchmark 2<br /><br /> * [[%PUBURL%/PSMC/WebHome/esercizi_svolti.pdf][Soluzioni degli esercizi]]<br /><br /> * <font color="#AF0F0F"><b>Preparazione esonero</b></font>: in aggiunta a questi [[%PUBURL%/PSMC/WebHome/esercizi.pdf][esercizi]], alla prova intermedia di novembre 2015 (traccia A e B) e alla parte 1 delle prove d'esame di gennaio e febbraio 2016, potete svolgere gli esercizi disponibili sul [[http://homes.cs.washington.edu/~djg/teachingMaterials/spac/grossmanSPAC_exam_unsolved.pdf][sito di Grossman]] (limitandovi alla parte di programma svolta finora nel corso). <p> </p><br /><br />--> ---++++ Obiettivi e programma sintetico Il corso affronta problematiche e tecniche di programmazione delle moderne piattaforme di calcolo parallele, dai sistemi multicore presenti sui più comuni laptop, desktop, server e dispositivi mobili, fino alle moderne GPU. Il parallelismo offre enormi opportunità nello sviluppo di applicazioni con requisiti computazionali stringenti: basti pensare ai benefici in aree come computer graphics e big data computing. Ma un maggior parallelismo nell'hardware risulta inefficace se non è opportunamente sfruttato a livello software. Ciò impone cambiamenti fondamentali nello stile di programmazione e, ad un più alto livello di astrazione, nella progettazione degli algoritmi e delle strutture dati utilizzate. Ad oggi, la maggior parte degli algoritmi sono pensati secondo una visione sequenziale del modello di calcolo soggiacente e i linguaggi di programmazione offrono poche astrazioni per programmare sistemi multiprocessore. Scopo del corso è di insegnare agli studenti a "pensare in parallelo", rivisitando sia il modo in cui i programmi sono espressi che alcune tecniche algoritmiche tradizionalmente pensate per modelli sequenziali. La prima parte del corso utilizza Java come linguaggio di programmazione e si focalizza su un modello a memoria condivisa con thread espliciti. Presenteremo successivamente tecniche di programmazione di GPU (!OpenCL) e - tempo permettendo - di problem solving su cluster a larga scala (!MapReduce). Il corso ha una natura trasversale, coniugando aspetti di algoritmi e linguaggi di programmazione e discutendo le basi teoriche del parallelismo (grafi delle computazioni, parallelismo ideale, speedup, leggi del parallelismo, data race e determinismo delle computazioni). L'homework farà acquisire allo studente un'esperienza diretta scrivendo software parallelo efficiente in alcuni dei modelli presentati a lezione. ---++++ Diario delle lezioni <font color="#AF0F0F"> <b>Lunedì 24 settembre 2018</b> </font>- Introduzione al corso. <b>Legge di Moore</b> e implicazioni sullo sviluppo di software (the free lunch is over). Differenza tra <b>parallelismo e concorrenza</b>. * [[https://drive.google.com/file/d/1fC0PUWJPn0dH0iti8RyoiR22D3xdxjRF/view?usp=sharing][Slide]] della lezione * [[http://www.gotw.ca/publications/concurrency-ddj.htm][The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software]], articolo di Herb Sutter apparso in Dr. Dobb's Journal, 30(3), Marzo 2005. <p> </p> <p> </p> <font color="#AF0F0F"> <b>Martedì 25 settembre 2018</b> </font>- <b>Speedup</b> ed efficienza. Limiti teorici e pratici del parallelismo: <b>legge di Amdahl</b>, <b>legge di Gustafson</b>, overhead di comunicazione e sincronizzazione. * [[https://drive.google.com/file/d/1fCYrMtQhtEiT4zXa5PwENTxDQ1bI6hZ3/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <blockquote> <p><b>Esercizi di riepilogo (A)</b> <i>Prova intermedia del 3 novembre 2015.</i> Traccia A: domanda 1, domanda 2 punti 1 e 2. Traccia B: domanda 2 punto 1 <i>Appello gennaio 2016.</i> Domanda 1 punti a) e c) <i>Appello febbraio 2016.</i> Domanda 1 <i>Prova intermedia novembre 2016.</i> Domanda 1, parte A</p> </blockquote> <p> </p> <font color="#AF0F0F"> <b>Lunedì 1 ottobre 2018</b> </font>- <b>Sistemi paralleli</b>: tassonomia di Flynn, modello di comunicazione (sistemi distribuiti o a memoria condivisa, NUMA vs UMA). <b>Parallelizzazione automatica</b>: storie di successo (vettorizzazione), difficoltà, data dependency. <b>Modelli di programmazione</b>: memoria condivisa con thread espliciti. <b>Java.lang.Thread</b>: nozioni fondamentali, parallel hello world. * [[https://drive.google.com/file/d/1OnnEvYKveAVGHyce-OnD7TMOKAAisTN7/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <font color="#AF0F0F"> <b>Martedì 2 ottobre 2018</b> </font>- Cenni ad altri modelli di programmazione: scambio di messaggi, dataflow e data parallelism (vedere slide del 1 ottobre). Parallelismo <b>fork/join in Java</b>. Un primo esempio: somma degli elementi in un array. <b>Esperimenti al calcolatore</b>. 1) Alcuni problemi pratici: come aumentare la dimensione dell'heap, perché iterare un esperimento, come misurare i tempi di esecuzione <b>real</b>, <b>user</b> e <b>system</b> con il comando time. 2) Un primo esperimento: <i>cosa accade all'aumentare del numero dei thread</i>? Analisi dello speedup ottenuto in pratica: perché all'aumentare del numero di thread i tempi di esecuzione non diminuiscono considerevolmente (anzi, se aumentiamo di molto i thread potrebbero anche aumentare)? <b>Memory bottleneck</b>. 3) Un secondo esperimento: <b>computazioni memory- o CPU-bounded</b>, differenze ottenute in termini di speedup (nel codice per la somma degli elementi di un array, decommentate la linea ans += (long)... nel metodo run). * [[https://drive.google.com/file/d/1h33d8VoApkPPn9FcXxlHhpGFQJ1lOycH/view?usp=sharing][Slide]] della lezione * [[https://drive.google.com/file/d/1asLeslfleOec8ZAC3uibv1oD86eZ-vJd/view?usp=sharing][Parallel sum]]: implementazione, sintesi degli esperimenti e delle analisi svolte <p> </p> <p> </p> <font color="#AF0F0F"> <b>Lunedì 8 ottobre 2018</b> </font>- Scelta del <b>numero di thread</b>: portabilità del codice, thread vs processori: è una buona idea usare tanti thread quanti sono i <i>processori disponibili all'inizio dell'esecuzione</i>? <b>Load balancing</b>. Una diversa soluzione: <b>divide-and-conquer parallelism</b>. Implementazione ricorsiva della somma in un array tramite fork di un nuovo thread per ciascuna chiamata ricorsiva. Quanti thread nell'implementazione ricorsiva? Un semplice conteggio su alberi binari. Due importanti ottimizzazioni: <b>cutoff sequenziale</b> e <b>dimezzamento</b> del numero di thread. * [[https://drive.google.com/file/d/1gAccf-UGXk81Td4EWQmtsfXfFh4zfakp/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <!-- <font color="#AF0F0F"> <b>Martedì 9 ottobre 2018</b> </font> - --> <font color="#AF0F0F"> <b>Lunedì 15 ottobre 2018</b> </font>- La <b>libreria !Java !ForkJoin</b>: !ForkJoinPool, !RecursiveAction e !RecursiveTask<V> 3) Due utili astrazioni: <b>map</b> e <b>reduce</b>, implementazione con thread espliciti tramite !ForkJoin, cenni al framework !MapReduce di !Google. 4) <b>Strutture dati e parallelismo</b>: array, alberi bilanciati, liste collegate. * [[https://drive.google.com/file/d/1xx-sne4GFtw7t6febZcgoVjFGebMD-bv/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <font color="#AF0F0F"> <b>Martedì 16 ottobre 2018</b> </font>- Analisi di algoritmi paralleli: il <b>DAG</b> di esecuzione, <b>work</b> e <b>span</b>, ovvero <i>T<sub>1</sub></i> (numero di nodi) e <i>T<sub>∞</sub></i> (lunghezza del cammino critico). Generalizzazione delle analisi ad un numero arbitrario P di processori. <b>Lower bound</b>: <i>T<sub>P</sub></i> ≥ <i>max{T<sub>1</sub>/P, T<sub>∞</sub>}</i>. Come ottenere un'esecuzione che richiede tempo <i>O(T<sub>1</sub>/P+T<sub>∞</sub>)</i>: l'importanza dello scheduling, gli <b>scheduler greedy</b> funzionano bene! Analisi 2-approssimazione, cenni al work stealing. * [[https://drive.google.com/file/d/1doCxYzhstob1Rz5Zgg18AXoVQ-78fEyB/view?usp=sharing][Slide]] della lezione * L'analisi dello scheduling greedy si basa sul Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (3rd edition). Il capitolo su algoritmi multithreaded può essere scaricato gratuitamente a [[https://mitpress.mit.edu/books/introduction-algorithms-third-edition][questo link]] (Sample chapter). <p> </p> <p> </p> <blockquote> <p><b>Esercizi di riepilogo (B)</b> <i>Prova intermedia del 3 novembre 2015.</i> Traccia A: domanda 3, domanda 2 punto 3. Traccia B: domanda 1, domanda 2 punto 2, domanda 3 <i>Appello gennaio 2016.</i> Domanda 1 punto b), domanda 2 <i>Appello febbraio 2016.</i> Domanda 2 <i>Prova intermedia novembre 2016.</i> Domanda 1, parte B, domanda 2, domanda 4</p> </blockquote> <p> </p> <font color="#AF0F0F"> <b>Lunedì 22 ottobre 2018</b> </font>- <b>Somme prefisse</b>: definizione del problema, work e span dell'algoritmo sequenziale, due algoritmi paralleli con span O(log n). Un'applicazione delle somme prefisse: <b>array packing</b>. Un'applicazione del packing: <b>partitioning</b>. Un'applicazione del partitioning: <b>parallel quicksort</b>. Analisi del quicksort nel caso migliore, <b>equazioni di ricorrenza per work e span</b>. * [[https://drive.google.com/file/d/13m0FpfPUxgH_QrJPwZUJKthQYCi8WDee/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <font color="#AF0F0F"> <b>Martedì 23 ottobre 2018</b> </font>- Calcolo della più lunga sottosequenza iniziale di 1 in un array di bit (esercizio): soluzione basata su !ForkJoin esplicito, soluzione basata sul calcolo del minimo, tecnica delle coppie. <b>Parallel mergesort</b>. Analisi della parallelizzazione naive (con merge sequenziale). Fusione (ricorsiva) di due array in parallelo: analisi di work e span dell'algoritmo merge. Integrazione nel mergesort ed analisi. * [[https://drive.google.com/file/d/1a4_1tm84DSicWvZBP10vcQtwwII3Fpd5/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <blockquote> <p><b>Esercizi di riepilogo (C)</b> <i>Prova intermedia del 3 novembre 2015.</i> Traccia A: domanda 4. Traccia B: domanda 4. <i>Appello gennaio 2016.</i> Domanda 3. <i>Appello febbraio 2016.</i> Domanda 3. <i>Prova intermedia novembre 2016.</i> Domanda 3. <i>Appello 28 giugno 2017.</i> Tutta la parte 1. <i>Appello 10 gennaio 2017.</i> Tutta la parte 1.</p> </blockquote> <p> </p> <font color="#AF0F0F"> <b>Lunedì 29 ottobre 2018</b> </font>- sospensione attività didattica causa maltempo <font color="#AF0F0F"> <b>Martedì 30 ottobre 2018</b> </font>- ulteriore sospensione attività didattica causa maltempo <font color="#AF0F0F"> <b>Lunedì 5 novembre 2018</b> </font>- Somma di interi: come calcolare il bit di riporto in parallelo. Svolgimento di esercizi di preparazione all'esonero. * [[https://drive.google.com/file/d/1BOBFGwv3ld-9HkncmBV9GynOPp_D0iZ7/view?usp=sharing][Introduction to parallel & distributed algorithms, Carl Burch, 2009]]: somma di interi, sezione 3.3 <p> </p> <p> </p> <font color="#AF0F0F"> <b>Martedì 6 novembre 2018</b> </font>- Svolgimento di esercizi di preparazione all'esonero. <font color="#AF0F0F"> <b>Lunedì 12 novembre 2018</b> </font>- Prova intermedia prima parte (parallelismo) <font color="#AF0F0F"> <b>Martedì 13 novembre 2018</b> </font>- <b>Programmazione concorrente</b>: accessi alla memoria sovrapposti, <b>bad interleaving</b>, il problema della <b>mutua esclusione</b>. <b>Lock</b> come ADT: caratteristiche di un mutex e di un reentrant lock. <!--Concorrenza in Java: la keyword <b>synchronized</b>. --> * [[https://drive.google.com/file/d/11hvLUL665C5k-hHAFZYK5FF5v51ORhH8/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <font color="#AF0F0F"> <b>Lunedì 19 novembre 2018</b> </font>- Concorrenza in Java: la keyword <b>synchronized</b>. <b>Race condition</b>: <b>bad interleaving</b> vs. <b>data race</b>. Metodi reader e metodi writer, possibili <b>interleaving</b> tra le istruzioni (quali istruzioni? A che livello di astrazione? Il ruolo del compilatore), uso di synchronized, <b>stati intermedi inconsistenti</b>. La keyword <b>volatile</b>: quando è corretto usarla? Una distinzione fondamentale: <b>memoria thread-local</b>, <b>immutable</b> e <b>synchronized</b>. * [[https://drive.google.com/file/d/16yBjSHc-HhSEdr2e3F_rZ3Gr4f3j0PAo/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <font color="#AF0F0F"> <b>Martedì 20 novembre 2018</b> </font>- <b>Linee guida</b> per usare i lock correttamente. <b>Locking consistente</b>, granularità dei lock (*fine vs coarse grained locking*), <b>granularità della sezione critica</b> e il problema <b>A-B-A</b>. Deadlock: tecniche di <b>deadlock avoidance</b> (acquisizione ordinata dei lock). Lock in pratica: un esempio basato su <b>liste concorrenti</b>. Coarse-grained locking. Fine-grained <b>hand-over-hand locking</b>: perchè serve prendere il lock su elementi consecutivi della lista, esempio relativo alla rimozione di un nodo della lista. * [[https://drive.google.com/file/d/1IQZuJJlDpnU5i65p0eL0Io8dMuuM8Q8f/view?usp=sharing][Slide]] della lezione * Ulteriori slide: [[https://drive.google.com/file/d/1vMt5QxN55aHkvid6zXi5jXeYk2sNqO1Y/view?usp=sharing][liste concorrenti]] <p> </p> <p> </p> <font color="#AF0F0F"> <b>Lunedì 26 novembre 2018</b> </font>- lezione annullata <font color="#AF0F0F"> <b>Martedì 27 novembre 2018</b> </font>- Ulteriori meccanismi di sincronizzazione: <b>reader/writer locks</b>. Ulteriori meccanismi di sincronizzazione: <b>condition variables</b>. Come implementare una <b>attesa passiva</b>, le operazioni <b>wait</b>, <b>notify</b> (signal) e <b>notifyAll</b> (broadcast), errori di programmazione tipici (e soluzioni), costrutti ed idiosincrasie di Java. * [[https://drive.google.com/file/d/1kPzPlzWKQFZ7QeM3Uba6xUWU1KzG4lsT/view?usp=sharing][Slide]] della lezione <p> </p> <p> </p> <font color="#AF0F0F"> <b>Lunedì 3 dicembre 2018</b> </font>- <b>Heterogeneous computing</b>: CPU vs GPU, genesi di <b>OpenCL</b>. Architettura di una GPU, <b>platform model</b>, <b>execution model</b> e <b>memory model</b> in !OpenCL. Concetti fondamentali: host, compute device, compute unit, processing element, contesto, programma, kernel, work item, work group, coda dei comandi, tipi di memoria (host, private, local, global). <b>API</b> <b>OpenCL</b>: ottenere informazioni sui dispositivi, creazione del contesto e della coda dei comandi. * [[https://drive.google.com/file/d/1VAjnE1GNY6GK5-mGWT_rgtPg9xdBgpZ2/view?usp=sharing][Slide]] della lezione * [[%PUBURL%/PSMC/WebHome/opencl20-quick-reference-card.pdf][OpenCl 2.0 quick reference card]] * [[%PUBURL%/PSMC/WebHome/opencl-2.0-specification.pdf][OpenCL 2.0 specification]] * La macchina virtuale con !OpenCL è disponibile nella sezione "Libri di testo e materiale didattico" <p> </p> <font color="#AF0F0F"> <b>Martedì 4 dicembre 2018</b> </font>- Ancora <b>API</b> <b>OpenCL</b>: memory objects, program objects, kernel objects, gestione delle code dei comandi. Un primo esempio, con discussione dettagliata del codice host: !OpenCL Hello World. Discussione dettagliata del <b>layout di memoria</b>: quali dati risiedono in memoria host, globale, privata? <b>Task parallelism</b> e <b>data parallelism</b> in !OpenCL: le funzioni <b>clEnqueueTask</b> e <b>clEnqueueNDRangeKernel</b>. * [[https://drive.google.com/file/d/1332Kdkcb_kJdLoHyIqjk80R428z0aF7p/view?usp=sharing][Slide]] della lezione * Il codice del programma hello è contenuto nel tar gzippato disponibile nella sezione "Libri di testo e materiale didattico" <p> </p> <font color="#AF0F0F"> <b>Lunedì 10 dicembre 2018</b> </font>- <b>Data parallelism</b>: global e local size, work group ids. <b>Esempi al calcolatore</b>. 1) Calcolo parallelo dei quadrati dei valori contenuti in un array (square). Parallelismo su <b>dati di input ad una dimensione</b>: numero di <b>work items</b> e <b>dimensione dei work group</b>. 2) <b>Moltiplicazione di matrici</b> (quadrate) come esempio di parallelismo su <b>dati di input a due dimensioni</b>. Implementazione naive in cui ciascun work item calcola uno degli <i>n<sup>2</sup></i> elementi di output come prodotto scalare di una riga e una colonna delle matrici di input. * [[https://drive.google.com/file/d/1Y0AABeG-xVw0dr1jCH4avgFjyBylcQo9/view?usp=sharing][Slide]] della lezione * Il codice dei programmi square e matmul è contenuto nel tar gzippato disponibile nella sezione "Libri di testo e materiale didattico" <p> </p> <font color="#AF0F0F"> <b>Martedì 11 dicembre 2018</b> </font>- La tecnica del <b>blocking</b>: moltiplicare due matrici tramite molteplici moltiplicazioni di matrici più piccole (blocchi). Implementazione basata su blocking tramite uso di <b>memoria locale</b> e <b>barriere</b>. <b>Confronto prestazionale</b> sul calcolatore. * Il codice dei due programmi per la moltiplicazione di matrici è contenuto nel tar gzippato disponibile nella sezione "Libri di testo e materiale didattico". Usare con cautela: in particolare, il codice che utilizza memoria locale funziona sotto ipotesi piuttosto stringenti (ad esempio, il lato delle matrici deve essere un multiplo del work group size). <p> </p> <font color="#AF0F0F"> <b>Lunedì 17 dicembre 2018</b> </font>- didattica sospesa per IT meeting. Sono disponibile dalle 9:00 alle 11:00 nel mio studio in Via Salaria per chiarimenti su esercizi ed esoneri. <font color="#AF0F0F"> <b>Martedì 18 dicembre 2018</b> </font>- Prova intermedia seconda parte (concorrenza, GPU) <!--<br /><br /><font color="#AF0F0F"> <b>Lunedì 25 settembre 2017</b> </font> - Introduzione al corso. <b>Legge di Moore</b> e implicazioni sullo sviluppo di software (the free lunch is over). Differenza tra <b>parallelismo e concorrenza</b>.<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReYjlRVlV1UHgzMWM/view?usp=sharing][Slide]] della lezione<br /> * [[http://www.gotw.ca/publications/concurrency-ddj.htm][The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software]], articolo di Herb Sutter apparso in Dr. Dobb's Journal, 30(3), Marzo 2005. <p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 26 settembre 2017</b> </font> - <b>Speedup</b> ed efficienza. Limiti teorici e pratici del parallelismo: <b>legge di Amdahl</b>, <b>legge di Gustafson</b>, overhead di comunicazione e sincronizzazione.<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReUmNwNkVfUlBvY0k/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Lunedì 2 ottobre 2017</b> </font> - <b>Sistemi paralleli</b>: tassonomia di Flynn, modello di comunicazione (sistemi distribuiti o a memoria condivisa, NUMA vs UMA). <b>Modelli di programmazione</b>: memoria condivisa con thread espliciti, cenni a scambio di messaggi, dataflow e data parallelism. <b>Java.lang.Thread</b>: nozioni fondamentali. Parallel hello world. Soluzione domanda 1A prova intermedia novembre 2016.<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReLUdrVXJvS2NtOTA/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 3 ottobre 2017</b> </font> - Parallelismo <b>fork/join in Java</b>. Un primo esempio: somma degli elementi in un array. <b>Esperimenti al calcolatore</b>. 1) Alcuni problemi pratici: come aumentare la dimensione dell'heap, perché iterare un esperimento, come misurare i tempi di esecuzione <b>real</b>, <b>user</b> e <b>system</b> con il comando time. 2) Un primo esperimento: <i>cosa accade all'aumentare del numero dei thread</i>? Analisi dello speedup ottenuto in pratica: perché all'aumentare del numero di thread i tempi di esecuzione possono aumentare considerevolmente? <b>Memory bottleneck</b>. 3) Un secondo esperimento: <b>computazioni memory- o CPU-bounded</b>, differenze ottenute in termini di speedup (nel codice per la somma degli elementi di un array, decommentate la linea ans += (long)... nel metodo run). Soluzione domanda 1 appello febbraio 2016.<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReN2NKVEg1NnlsVFU/view?usp=sharing][Slide]] della lezione<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReeUdrV3lqWHlnSDQ/view?usp=sharing][Parallel sum]]: implementazione, sintesi degli esperimenti e delle analisi svolte<p> </p><br /><br /><font color="#AF0F0F"> <b>Lunedì 9 ottobre 2017</b> </font> - Scelta del <b>numero di thread</b>: portabilità del codice, thread vs processori: è una buona idea usare tanti thread quanti sono i <i>processori disponibili all'inizio dell'esecuzione</i>? <b>Load balancing</b>. Una diversa soluzione: <b>divide-and-conquer parallelism</b>. Implementazione ricorsiva della somma in un array tramite fork di un nuovo thread per ciascuna chiamata ricorsiva. Quanti thread nell'implementazione ricorsiva? Un semplice conteggio su alberi binari. Due importanti ottimizzazioni: <b>cutoff sequenziale</b> e <b>dimezzamento</b> del numero di thread. <br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReeUZWdlNWbWZhcUk/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Lunedì 16 ottobre 2017</b> </font> - La <b>libreria !Java !ForkJoin</b>: !ForkJoinPool, !RecursiveAction e !RecursiveTask<V> 3) Due utili astrazioni: <b>map</b> e <b>reduce</b>, implementazione con thread espliciti tramite !ForkJoin, cenni al framework !MapReduce di !Google. 4) <b>Strutture dati e parallelismo</b>: array, alberi bilanciati, liste collegate.<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJRecThoU1NRX0JZRk0/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 17 ottobre 2017</b> </font> - Analisi di algoritmi paralleli: il <b>DAG</b> di esecuzione, <b>work</b> e <b>span</b>, ovvero <i>T<sub>1</sub></i> (numero di nodi) e <i>T<sub>∞</sub></i> (lunghezza del cammino critico). Generalizzazione delle analisi ad un numero arbitrario P di processori. <b>Lower bound</b>: <i>T<sub>P</sub></i> ≥ <i>max{T<sub>1</sub>/P, T<sub>∞</sub>}</i>. Come ottenere un'esecuzione che richiede tempo <i>O(T<sub>1</sub>/P+T<sub>∞</sub>)</i>: l'importanza dello scheduling, gli <b>scheduler greedy</b> funzionano bene! Analisi 2-approssimazione, cenni al work stealing. <br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReWjZWVzNxYnFQQnc/view?usp=sharing][Slide]] della lezione<br /> * L'analisi dello scheduling greedy si basa sul Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (3rd edition). Il capitolo su algoritmi multithreaded può essere scaricato gratuitamente a [[https://mitpress.mit.edu/books/introduction-algorithms][questo link]] (sample chapter). <p> </p><br /><br /><BLOCKQUOTE><br /><B>Esercizi di riepilogo (B)</B> </br><br />_Prova intermedia del 3 novembre 2015._ Traccia A: domanda 3, domanda 2 punto 3. Traccia B: domanda 1, domanda 2 punto 2, domanda 3</br><br />_Appello gennaio 2016._ Domanda 1 punto b), domanda 2</br><br />_Appello febbraio 2016._ Domanda 2</br><br />_Prova intermedia novembre 2016._ Domanda 1, parte B, domanda 2, domanda 4<br /></BLOCKQUOTE><br /><br /><font color="#AF0F0F"> <b>Lunedì 23 ottobre 2017</b> </font> - <b>Somme prefisse</b>: definizione del problema, work e span dell'algoritmo sequenziale, due algoritmi paralleli con span O(log n). Un'applicazione delle somme prefisse: <b>array packing</b>. <br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJReeXFVOUU3a3VqT3M/view?usp=sharing][Slide]] della lezione<p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 24 ottobre 2017</b> </font> - Un'applicazione del packing: <b>partitioning</b>. Un'applicazione del partitioning: <b>parallel quicksort</b>. Analisi del quicksort nel caso peggiore e migliore, <b>equazioni di ricorrenza per work e span</b>. <b>Parallel mergesort</b>. Analisi della parallelizzazione naive (con merge sequenziale). Fusione (ricorsiva) di due array in parallelo: analisi di work e span dell'algoritmo merge. Integrazione nel mergesort ed analisi.<br /> * [[https://drive.google.com/file/d/0B1yYvm6QgJRebi13R1NIYm9UUzg/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><BLOCKQUOTE><br /><B>Esercizi di riepilogo (C)</B> </br><br />_Prova intermedia del 3 novembre 2015._ Traccia A: domanda 4. Traccia B: domanda 4.</br><br />_Appello gennaio 2016._ Domanda 3.</br><br />_Appello febbraio 2016._ Domanda 3.</br><br />_Prova intermedia novembre 2016._ Domanda 3.</br><br />_Appello 28 giugno 2017._ Tutta la parte 1.</br><br />_Appello 10 gennaio 2017._ Tutta la parte 1.<br /></BLOCKQUOTE><br /><br /><font color="#AF0F0F"> <b>Martedì 31 ottobre 2017</b> </font> - svolgimento di <b>esercizi</b> di preparazione alla prova intermedia<br /><br /><font color="#AF0F0F"> <b>Lunedì 6 novembre 2017</b> </font> - svolgimento di <b>esercizi</b> di preparazione alla prova intermedia<br /><br /><font color="#AF0F0F"> <b>Martedì 7 novembre 2017</b> </font> - <b>prova intermedia*<br /><br /><font color="#AF0F0F"> *Lunedì 13 novembre 2017</b> </font> - <b>Programmazione concorrente</b>: accessi alla memoria sovrapposti, <b>bad interleaving</b>, il problema della <b>mutua esclusione</b>. <b>Lock</b> come ADT: caratteristiche di un mutex e di un reentrant lock. Concorrenza in Java: la keyword <b>synchronized</b>.<br /> * [[https://drive.google.com/file/d/1yIHzMXh1QbKGfV6aNDXQMTbnzc_Z2Y_2/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 14 novembre 2017</b> </font> - <b>Race condition</b>: <b>bad interleaving</b> vs. <b>data race</b>. Metodi reader e metodi writer, possibili <b>interleaving</b> tra le istruzioni (quali istruzioni? A che livello di astrazione? Il ruolo del compilatore), uso di synchronized, <b>stati intermedi inconsistenti</b>. La keyword <b>volatile</b>: quando è corretto usarla? Una distinzione fondamentale: <b>memoria thread-local</b>, <b>immutable</b> e <b>synchronized</b>.<br /> * [[https://drive.google.com/file/d/1eiWyj0HdE_zqDfEiQ3c4IrIiWhxShuBN/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Lunedì 20 novembre 2017</b> </font> - <b>Linee guida</b> per usare i lock correttamente. <b>Locking consistente</b>, granularità dei lock (*fine vs coarse grained locking*), <b>granularità della sezione critica</b> e il problema <b>A-B-A</b>. Deadlock: tecniche di <b>deadlock avoidance</b> (acquisizione ordinata dei lock).<br /> * [[https://drive.google.com/file/d/1EVWUJw-ztTBpyBrIN22adeiXAG_uQ8Sd/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 21 novembre 2017</b> </font> - Lock in pratica: un esempio basato su <b>liste concorrenti</b>. Coarse-grained locking. Fine-grained <b>hand-over-hand locking</b>: perchè serve prendere il lock su elementi consecutivi della lista, esempio relativo alla rimozione di un nodo della lista. Ulteriori meccanismi di sincronizzazione: <b>reader/writer locks</b>.<br /> * [[https://drive.google.com/file/d/1f-mC9-CyslR0qCqOLzbN3BcOg3y2f3nH/view?usp=sharing][Slide]] della lezione<br /><br /><BLOCKQUOTE><br /><B>Esercizi di riepilogo (D)</B> </br><br />_Esonero dicembre 2015._ Domande 1 e 2.</br><br />_Appello gennaio 2016._ Domande 4 e 5.</br><br />_Appello febbraio 2016._ Domande 4 e 5.<br /></BLOCKQUOTE><br /><br /><font color="#AF0F0F"> <b>Lunedì 27 novembre 2017</b> </font> - Ulteriori meccanismi di sincronizzazione: <b>condition variables</b>. Come implementare una <b>attesa passiva</b>, le operazioni <b>wait</b>, <b>notify</b> (signal) e <b>notifyAll</b> (broadcast), errori di programmazione tipici (e soluzioni), costrutti ed idiosincrasie di Java. Correzione del primo homework e visione compiti.<br /> * [[https://drive.google.com/file/d/1N_dBL3SA26rn6fbLh52U_lPkkYBm1ixK/view?usp=sharing][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Martedì 28 novembre 2017</b> </font> - <b>Heterogeneous computing</b>: CPU vs GPU, genesi di <b>OpenCL</b>. Architettura di una GPU, <b>platform model</b>, <b>execution model</b> e <b>memory model</b> in !OpenCL. Concetti fondamentali: host, compute device, compute unit, processing element, contesto, programma, kernel, work item, work group, coda dei comandi, tipi di memoria (host, private, local, global). <b>API</b> <b>OpenCL</b>: ottenere informazioni sui dispositivi, creazione del contesto e della coda dei comandi.<br /> * [[https://drive.google.com/file/d/19-4tQj0LSrV_sX36_OynJKD0h5DFCGlQ/view?usp=sharing][Slide]] della lezione<br /> * [[%PUBURL%/PSMC/WebHome/opencl20-quick-reference-card.pdf][OpenCl 2.0 quick reference card]]<br /> * [[%PUBURL%/PSMC/WebHome/opencl-2.0-specification.pdf][OpenCL 2.0 specification]] <br /> * La macchina virtuale con !OpenCL è disponibile nella sezione "Libri di testo e materiale didattico"<br /><br /><font color="#AF0F0F"> <b>Lunedì 4 dicembre 2017</b> </font> - didattica sospesa per IT Meeting<br /><br /><font color="#AF0F0F"> <b>Martedì 5 dicembre 2017</b> </font> - Ancora <b>API</b> <b>OpenCL</b>: memory objects, program objects, kernel objects, gestione delle code dei comandi. Un primo esempio, con discussione dettagliata del codice host: !OpenCL Hello World. Discussione dettagliata del <b>layout di memoria</b>: quali dati risiedono in memoria host, globale, privata? <b>Task parallelism</b> e <b>data parallelism</b> in !OpenCL: le funzioni <b>clEnqueueTask</b> e <b>clEnqueueNDRangeKernel</b>. <br /> * [[https://drive.google.com/file/d/1UVgU-46srvLbdXmgV0H3YQNE8kKD034a/view?usp=sharing][Slide]] della lezione<br /> * Il codice del programma hello è contenuto nel tar gzippato disponibile nella sezione "Libri di testo e materiale didattico"<br /><br /><font color="#AF0F0F"> <b>Martedì 12 dicembre 2017</b> </font> - Parallelismo su <b>dati di input ad una dimensione</b>: numero di <b>work items</b> e <b>dimensione dei work group</b> (global e local size). <b>Esempio al calcolatore</b>: calcolo parallelo dei quadrati dei valori contenuti in un array (square). <br /> * [[https://drive.google.com/file/d/1Oweb4iB1owTJ5UU7GppgVYqWQFTlJvOy/view?usp=sharing][Slide]] della lezione<br /> * Il codice del programma square è contenuto nel tar gzippato disponibile nella sezione "Libri di testo e materiale didattico"<br /><br />--> <!--<br /><br /><font color="#AF0F0F"> <b>Martedì 29 novembre 2016</b> </font> - <b>Svolgimento esercizi</b>: domanda 2 esonero dicembre 2015; domanda 4 appello febbraio 2016.<br /><br /><BLOCKQUOTE><br /><B>Esercizi di riepilogo (D)</B> </br><br />_Esercizi 6, 7, 8 e 9_ dal [[http://homes.cs.washington.edu/~djg/teachingMaterials/spac/grossmanSPAC_exam_unsolved.pdf][sito di Grossman]]<br /></BLOCKQUOTE><br /><br /><font color="#AF0F0F"> <b>Martedì 13 dicembre 2016</b> </font> - <b>Esempi al calcolatore</b>. 1) Calcolo parallelo dei quadrati dei valori contenuti in un array (square). Parallelismo su <b>dati di input ad una dimensione</b>: numero di <b>work items</b> e <b>dimensione dei work group</b> (global e local size). 2) <b>Moltiplicazione di matrici</b> (quadrate) come esempio di parallelismo su <b>dati di input a due dimensioni</b>. Implementazione naive in cui ciascun work item calcola uno degli <i>n<sup>2</sup></i> elementi di output come prodotto scalare di una riga e una colonna delle matrici di input. <br /> * Il codice dei programmi square e matmul è contenuto nel tar gzippato disponibile nella sezione "Libri di testo e materiale didattico"<br /><br /><BLOCKQUOTE><br /><B>Esercizi di riepilogo (E)</B> </br><br /> [[%PUBURL%/PSMC/WebHome/eserciziOpenCL.pdf][Esercizi OpenCL]]<br /></BLOCKQUOTE><br /><br /><br />--> <!--<br /><br /><font color="#AF0F0F"> <b>Lunedì 5 ottobre 2015</b> </font> - Stima della frazione di esecuzione sequenziale e parallela mediante <b>performance profiling</b>: l'opzione -prof del Java Runtime, analisi dei file prodotti. - <br /> * [[%PUBURL%/PSMC/WebHome/Lecture5.pdf][Slide]] della lezione <p> </p><br /><br /><font color="#AF0F0F"> <b>Lunedì 14 dicembre 2015</b> </font> - Programmazione di cluster su larga scala: <b>MapReduce</b>, un modello di programmazione di alto livello corredato da un complesso sistema runtime.<br /> * [[%PUBURL%/PSMC/WebHome/Lecture18.pdf][Slide della lezione]] <p> </p><br /><br />--> ---++++ Materiale didattico * Dan Grossman, [[http://homes.cs.washington.edu/~djg/teachingMaterials/spac/#reading][A Sophomoric Introduction to Shared-Memory Parallelism and Concurrency]], reading notes, febbraio 2015. * Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest e Clifford Stein, [[https://mitpress.mit.edu/books/introduction-algorithms][Introduction to Algorithms]], terza edizione, capitolo 27 (Multithreaded Algorithms, sample chapter scaricabile gratuitamente sul sito web del libro). <p> </p> * [[%PUBURL%/PSMC/WebHome/openCL_examples.tar.gz][Codice OpenCL]] contenente tutti gli esempi visti in classe * [[https://drive.google.com/open?id=0B1yYvm6QgJReUzJRQ2pSTUwzeE0][Macchina virtuale]] contenente una distribuzione Linux Slitaz minimale (32 bit) con !OpenCL 1.2 preinstallato, [[%PUBURL%/PSMC/WebHome/LEGGIMI.txt][read me]]. Per poter utilizzare la macchina virtuale è necessario installare !VirtualBox (disponibile sul sito di Oracle). <p> </p> <p> </p> ---++++ Slide [[https://drive.google.com/drive/folders/0B1yYvm6QgJReQ2RhODdvZVRFQVk?usp=sharing][A questo link]] potete trovare le slide messe a disposizione degli studenti durante l'Anno Accademico 2017-2018. Le slide per l'Anno Accademico 2018-2019 potrebbero essere aggiornate o modificate a ridosso della lezione, e saranno messe a disposizione settimanalmente nel Diario delle lezioni, corredate da una breve sintesi degli argomenti affrontati. ---++++ Modalità d'esame Per superare l'esame si deve sostenere una <b>prova scritta</b> (divisa in due parti) e svolgere un <b>homework</b> che sarà assegnato a metà corso. Nella prova scritta occorrerà dimostrare di aver studiato e compreso gli argomenti trattati nelle lezioni: * rispondendo a tipiche domande da esame orale volte a verificare la comprensione della materia; * svolgendo esercizi che prevedono l'applicazione dei concetti esposti a lezione. <p> </p> <p> </p> L'homework richiede di implementare ed analizzare sperimentalmente un software parallelo e può essere svolto in gruppi costituiti da al più 3 persone. Non è previsto un esame orale, salvo su esplicita richiesta del docente in caso di sospetta copiatura - parziale o totale - dell'homework o della prova scritta. *Prove intermedie.* Sono previste due prove intermedie: la prima nella settimana di interruzione della didattica (tipicamente inizio novembre), la seconda al termine del corso. La prima prova intermedia riguarderà tutti gli argomenti svolti fino alla data della prova stessa e sarà strutturata come la prova scritta, ovvero con domande aperte ed esercizi di ragionamento. La seconda prova intermedia coprirà gli argomenti svolti nella seconda parte del corso. La sufficienza ottenuta alle prove intermedie sarà valida fino all'ultimo appello dell'anno accademico corrente. *Voto.* Sia l'homework che la prova scritta saranno valutati in trentesimi e concorrono a determinare il voto finale (homework 30%, prova scritta 70%). Il voto verrà inoltre incrementato di un punto per chi termini nella sessione invernale avendo superato le prove intermedie. *Prenotazioni.* Per partecipare alle prove scritte (incluse quelle intermedie) è obbligatoria la prenotazione. Sarà possibile prenotarsi agli appelli d'esame tramite infostud, e alle prove intermedie tramite twiki. ---++++ Date d'esame ---++++ Prove d'esame * [[%PUBURL%/PSMC/WebHome/2017-06-28-appello28Giugno.pdf][Testo esame del 28 giugno 2017]] * [[%PUBURL%/PSMC/WebHome/2017-01-10-appello10Gennaio.pdf][Testo esame del 10 gennaio 2017]] * [[%PUBURL%/PSMC/WebHome/2016-11-8-esonero1.pdf][Prova intermedia novembre 2016]] * [[%PUBURL%/PSMC/WebHome/2016-02-02-appelloFebbraio.pdf][Testo esame del 2 febbraio 2016]] * [[%PUBURL%/PSMC/WebHome/2016-01-13-appelloGennaio.pdf][Testo esame del 13 gennaio 2016]] * [[%PUBURL%/PSMC/WebHome/esonero22dicembre2015Testo.pdf][Esonero seconda parte]] - dicembre 2015 * Prova intermedia novembre 2015: [[%PUBURL%/PSMC/WebHome/provaIntermedia3novembre2015A.pdf][traccia A]], [[%PUBURL%/PSMC/WebHome/provaIntermedia3novembre2015B.pdf][traccia B]]
This topic: PSMC
>
WebHome
>
PSMC1819
Topic revision: r1 - 2019-09-25 - MicheleMartinelli
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback