Corso di High Performance Computing Ingegneria e Scienze Informatiche Università di Bologna Demo esame

Documenti analoghi
Corso di High Performance Computing Ingegneria e Scienze Informatiche Università di Bologna Prova Scritta, 22/1/2019

Corso di High Performance Computing Ingegneria e Scienze Informatiche Università di Bologna Prova Scritta, 29/6/2017

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 26 Novembre 2014 COGNOME E NOME RIGA COLONNA MATRICOLA

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 18/7/2016

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 26 Novembre 2014 COGNOME E NOME RIGA COLONNA MATRICOLA

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 26 Novembre 2014 COGNOME E NOME RIGA COLONNA MATRICOLA

I cicli. Iterazioni Calcolo della media Istruzioni break e continue

Programmazione di base

Linguaggio C: Array Valeria Cardellini

Programmazione di base

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 9/2/2017

Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Politecnico di Milano Facoltà di Ingegneria Civile, Ambientale e Territoriale. Informatica B [079904]

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 24 Gennaio 2011 COGNOME E NOME RIGA COLONNA MATRICOLA

3 aprile o Esonero: mercoledi 17 aprile ore 11:30 14:00 consulta la pag. WEB alla voce esoneri. si raccomanda la puntualita!

Programmazione di base

Prova in itinere del 20 Novembre 2013 RIGA COLONNA MATRICOLA

Programmazione di base

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 12/1/2017

Il presente plico contiene 3 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

Programmazione I - Laboratorio

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Introduzione al C. Unità 7 Array. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

Array. Aggragati di variabili omogenee...

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 30/6/2016

INFORMATICA. Strutture iterative

Corso di Informatica A.A

NOTA: I codici proposti sono solo una delle possibile soluzioni, non sono da intendersi come unica soluzione possibile o corretta

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Diagramma a blocchi per la selezione, in un mazzo di chiavi, di quella che apre un lucchetto

Scritto di Algoritmi e s.d. (1o anno) 5 Luglio 2005

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

2 Operatori matematici e costrutto if

NOTA: I codici proposti sono solo una delle possibile soluzioni, non sono da intendersi come unica soluzione possibile o corretta

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 8 Novembre 2010 COGNOME E NOME RIGA COLONNA MATRICOLA

Programmazione in Java (I modulo)

For e do. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Programmazione Appello d esame del 18 giugno 2010 Compito B

C array. Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso.

Laboratorio di Informatica I

Struttura dei programmi e Variabili

For e do. Parte 4. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Lezione 6: Array e puntatori

Fondamenti di Informatica T-1 Modulo 2

C: panoramica. Violetta Lonati

Spazio riservato ai docenti

Istruzioni decisionali

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Il linguaggio C Puntatori

INFORMATICA ED ELEMENTI DI INFORMATICA MEDICA. MODULO DI INFORMATICA Prof. Stefano Gaburri e Prof. Gianluca Palermo. Prova del 12 Luglio 2010

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

La gestione della memoria dinamica Heap

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Dipartimento di Elettronica, Informazione e Bioingegneria Politecnico di Milano

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 24 Gennaio 2011 COGNOME E NOME RIGA COLONNA MATRICOLA

1. Un array è: A. Un simbolo usato nel linguaggio C per rappresentare un numero non specificato di variabili B. Un insieme di indirizzi di memoria

Aritmetica dei puntatori

Programmazione di base

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Corso INFORMATICA ED ELEMENTI DI INFORMATICA MEDICA

Istruzioni iterative (o cicliche)

Fondamenti di Informatica

Linguaggio C: Espressioni

NOTA: I codici proposti sono solo una delle possibile soluzioni, non sono da intendersi come unica soluzione possibile o corretta

Gli array. slides credit M. Poneti

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Appello del 20 Febbraio 2014 COGNOME E NOME

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Appello del 17 Febbraio 2009 COGNOME E NOME RIGA COLONNA MATRICOLA

Il presente plico contiene 3 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 15/9/2016

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Appello del 21 Luglio 2010 COGNOME E NOME RIGA COLONNA MATRICOLA

Matrici. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prova in itinere del 8 Novembre 2010 COGNOME E NOME RIGA COLONNA MATRICOLA

Ogni parte non cancellata a penna sarà considerata parte integrante della soluzione.

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

Elementi di Informatica e Programmazione Allievi Ingegneria Informatica, Elettronica e delle Telecomunicazioni, Automazione Industriale

Capitolo 6 - Array. Copyright by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved.

Introduzione al C. Informatica Generale - Introduzione al C Versione 1.0, aa p.1/17

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Matematica - SMID : Programmazione Gennaio 2009 FOGLIO RISPOSTE

Lab 04 (parte A) Programmazione Strutturata

Matematica - SMID : Programmazione 20 Febbraio 2007 FOGLIO RISPOSTE

Calcolo Parallelo. Domanda. In particolare. Qual è l algoritmo parallelo. PROBLEMA: Prodotto Matrice-Vettore

ELEMENTI DI INFORMATICA E PROGRAMMAZIONE

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Programmazione I (Classe 1)

Array. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Programmazione di base

Transcript:

Corso di High Performance Computing Ingegneria e Scienze Informatiche Università di Bologna Demo esame La prova dura 60 minuti Durante la prova non è consentito consultare libri, appunti o altro materiale. Non è consentito l'uso di dispositivi elettronici (cellulari, tablet...), né interagire in alcun modo con gli altri studenti pena l'esclusione dalla prova, che potrà avvenire anche dopo il termine della stessa. Le risposte devono essere scritte a penna su questi fogli, in modo leggibile. Le parti illeggibili o scritte a matita saranno ignorate. Eventuali altri fogli possono essere utilizzati per la brutta copia ma non verranno valutati. I voti saranno pubblicati su AlmaEsami e vi verrà data comunicazione all'indirizzo istituzionale (@studio.unibo.it). I voti restano validi fino alla sessione d'esame di settembre 2019 inclusa. Dopo tale data tutti i voti in sospeso saranno persi. NON SCRIVERE NELLA TABELLA SOTTOSTANTE D. 1 D. 2 D. 3 D. 4 / 8 / 8 / 8 / 8

Domanda 1. Descrivere vantaggi e svantaggi delle architetture a memoria distribuita. Commento sulle risposte date a questa domanda. Qualcuno ha menzionato il rapporto computazione/comunicazione (o viceversa) in modo scorretto. Non è vero, come sembra da alcune risposte, che le architetture a memoria distribuita consentano un elevato rapporto computazione/comunicazione. Al contrario, le architetture a memoria distribuita sono adeguate per quei problemi che esibiscono un elevato rapporto computazione/comunicazione, perché in tali architetture le comunicazioni sono (spesso) molto meno efficienti della computazione e vanno limitate al minimo. Detto in altri termini, l'elevato rapporto computazione/comunicazione deve essere una caratteristica del problema affinché sia possibile risolverlo su una architettura a memoria distribuita.

Domanda 2. Si consideri il seguente frammento di codice: b[0] = f(a[0] + a[1]); c[0] = 0; d[0] = 0; for (i = 1; i<n-1; i++) { b[i] = f( a[i-1] + a[i] + a[i+1] ); c[i] = g( b[i-1] ); d[i] = h( a[i-1] + b[i-1] ); b[n-1] = c[n-1] = d[n-1] = 0; Assumendo che: l'array a[ ] sia stato inizializzato prima dell'inizio del ciclo; tutte le variabili e le funzioni siano definite in modo opportuno; le funzioni f() g() e h() restituiscano valori che dipendono solo dai rispettivi parametri; ristrutturare il codice in modo che produca lo stesso risultato ma non siano presenti loop-carried dependencies nel ciclo for. Soluzione. Ci sono almeno due possibilità che consistono nell'applicare la tecnica di loop aligning ; la prima è la seguente (le modifiche rispetto al ciclo originale sono evidenziate): b[0] = f(a[0] + a[1]); c[0] = 0; d[0] = 0; c[1] = g( b[0] ); d[1] = h( a[0] + b[0] ); for (i = 2; i<n-1; i++) { b[i-1] = f( a[i-2] + a[i-1] + a[i] ); c[i] = g( b[i-1] ); d[i] = h( a[i-1] + b[i-1] ); b[n-2] = f( a[n-3] + a[n-2] + a[n-1] ); b[n-1] = c[n-1] = d[n-1] = 0; Si noti come sia necessario eseguire fuori dal ciclo il calcolo di c[1], d[1] e b[n - 2]. La seconda possibilità, del tutto equivalente, è: b[0] = f(a[0] + a[1]); c[0] = 0; d[0] = 0; c[1] = g( b[0] ); d[1] = h( a[0] + b[0] ); for (i = 1; i<n-2; i++) { b[i] = f( a[i-1] + a[i] + a[i+1] ); c[i+1] = g( b[i] ); d[i+1] = h( a[i] + b[i] ); b[n-2] = f( a[n-3] + a[n-2] + a[n-1] ); b[n-1] = c[n-1] = d[n-1] = 0; Gli errori più comuni che ho visto in questo esercizio sono (i) la presenza di accessi out-of-bound nel caso in cui gli estremi del ciclo non siano stati settati correttamente; (ii) la mancata inizializzazione dei valori non calcolati all'interno del ciclo.

Domanda 3. Dopo aver scelto due tra i seguenti problemi: 1. Calcolo del prodotto scalare tra due array di valori reali; 2. Ricerca di k chiavi intere in un albero binario di ricerca con n nodi, k << n ; 3. Individuare una chiave di cifratura mediante ricerca esaustiva (brute-force); 4. Dato un array a[n] di float, calcolare i valori di un nuovo array b[n] tale che b[i] = (a[i - 1] + a[i] + a[i + 1])/3 per ogni 1 i N - 2. 5. Calcolo dell'insieme di Mandelbrot; per ciascuno giustificate se ritenete più opportuno applicare il paradigma SIMD (Single Instruction Multiple Data) oppure MIMD (Multiple Instruction Multiple Data) per la risoluzione. Commento sulle risposte date a questa domanda. Come ho spiegato a voce prima dell'inizio della prova, la parte più importante di questo esercizio è la spiegazione che veniva data; ciononostante, in alcuni casi la scelta era abbastanza ovvia 1. L'approccio preferibile è probabilmente quello SIMD: abbiamo visto in laboratorio che la versione SIMD del prodotto scalare è strettamente imparentata con la versione SIMD del calcolo della somma degli elementi di un array, e può essere realizzata in modo efficiente con poca fatica. 2. L'approccio preferibile è probabilmente quello MIMD, in quanto la ricerca di ciascuna chiave potrebbe avere esiti diversi (qualcuna delle chiavi potrebbe essere presente, qualcun'altra no), dando origine a computazioni divergenti che male si prestano al paradigma SIMD. 3. L'approccio preferibile è probabilmente quello MIMD che abbiamo applicato in laboratorio con OpenMP. L'approccio SIMD naturale consisterebbe nell'esaminare K chiavi contemporaneamente, essendo K l'ampiezza dei registri SIMD. Non è però detto che una chiave di cifratura possa essere interamente contenuta in un elemento di un registro SIMD (anzi, è abbastanza improbabile che ciò sia vero in generale). Non è nemmeno detto che l'algoritmo sia tale da poter essere SIMD-izzato, cioè da poter cifrare/decifrare K chiavi contemporaneamente: se l'algoritmo in questione fa uso di istruzioni condizionali (if-thenelse) o cicli con numero di iterazioni variabile in base alla chiave, mal si presterebbe all'implementazione SIMD. In generale non si può escludere a priori che un approccio SIMD sia possibile, ma chi ha scelto SIMD avrebbe dovuto almeno menzionare le questioni di cui sopra. 4. L'approccio preferibile è probabilmente quello SIMD: è infatti possibile calcolare K valori adiacenti in b[] usando lo schema: a[] i-1 b[i:i+3] = ( a[i-1: i+2] + a[i:i+3] + a[i+1:i+4] ) / 3 b[] i in cui si usano essenzialmente due somme SIMD e una divisione SIMD/scalare (oppure SIMD/SIMD nel caso in cui il compilatore trasformi lo scalare 3 in {3, 3, 3, 3). 5. Qui molti hanno risposto SIMD, dando come motivazione il fatto che le stesse operazioni sono applicate su tutti i pixel dell'immagine. Ciò non è completamente corretto, perché l'implementazione canonica dell'algoritmo di Mandelbrot vista a lezione contiene

computazioni divergenti, nel senso che ogni pixel può richiedere un numero di iterazioni diverso per divergere. Questo rende l'implementazione SIMD non ovvia (ma non impossibile, ad esempio https://github.com/skeeto/mandel-simd ); però anche in questo caso chi ha optato per l'approccio SIMD avrebbe dovuto discutere la scelta in modo adeguato.

Domanda 4. Commentare riga per riga il seguente programma CUDA, che compila ed esegue correttamente. Le righe da commentare sono quelle numerate (i numeri di riga NON fanno parte del programma). Che valore viene stampato alla riga 10? #include <stdio.h> 1 global void my_kernel(int *x) { 2 *x = *x + 1; int main(void) { 3 int h_a = 42; 4 int *d_a; 5 const size_t size = sizeof(int); 6 cudamalloc((void **)&d_a, size); 7 cudamemcpy(d_a, &h_a, size, cudamemcpyhosttodevice); 8 my_kernel<<<1,1>>>(d_a); 9 cudamemcpy(&h_a, d_a, size, cudamemcpydevicetohost); 10 printf( %d\n, h_a); 11 cudafree(d_a); return 0; Riga n. Commento 1 2 3 4 5 6

7 8 9 10 11