AVVISO: Per questa esercitazione, entrambi i canali devono utilizzare il seguente meeting Zoom.
uniroma1
.*_main.c
.cognome.nome
. Sulle postazioni del laboratorio sarà /home/biar/Desktop/cognome.nome/
.cognome.nome.zip
(zip -r cognome.nome.zip cognome.nome/
).cognome.nome.zip
.Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Tradurre in IA32 in un file e1.s
la seguente funzione, tenendo presente che i codici ASCII dei caratteri ‘0’ e ‘9’ sono 48 e 57, rispettivamente.
int count_digits(const char *s) {
int cnt = 0;
while (*s) {
if (*s >= '0' && *s <= '9') cnt++;
s++;
}
return cnt;
}
Usare il main di prova nella directory di lavoro E1-count-digits
compilando con gcc -m32 e1_main.c e1.s -o e1
.
Un tipico formato per rappresentare immagini digitali è la matrice row-major
, dove le righe sono disposte consecutivamente in memoria. Per matrici a toni di grigio a 8 bit, ogni cella dell’array è compresa tra 0 (nero) e 255 (bianco). In totale, per un’immagine di altezza h e ampiezza w, l’array contiene w*h
celle. La cella (0,0) è collocata nell’angolo superiore sinistro dell’immagine. Il pixel di coordinate (i,j)
, dove i
è la coordinata verticale e j
quella orizzontale, risiede nella cella di indice v[i*w+j]
dell’array.
Scrivere una funzione C blur5
con il seguente prototipo:
void blur5(unsigned char* in, unsigned char* out, int w, int h){
che applica a un’immagine di input a 256 toni di grigio (unsigned char
) un classico filtro che consente di sfocare l’immagine. I parametri sono:
Il filtro da applicare è un semplice procedimento di convoluzione: ogni pixel di coordinate (i,j) dell’output sarà calcolato come la media aritmetica dei 25 valori in input nella finestra 5x5 centrata in (i,j). I pixel di output vicino ai bordi, la cui finestra 5x5 uscirebbe dai bordi dell’immagine di input, prendono semplicemente il valore del corrispondente pixel di input.
Usare il main di prova nella directory di lavoro E2-blur5
compilando con gcc e2_main.c pgm.c e2.c -o e2
.
Rispondi alle seguenti domande, tenendo conto che una risposta corretta vale 1 punto, mentre una risposta errata vale 0 punti.
Domanda 1 Dato il seguente codice in linguaggio C e la sua traduzione in linguaggio assembly, dire quale tra le seguenti tecniche di ottimizzazione è stata applicata:
Domanda 2 Dato il seguente codice quale delle seguenti affermazioni risulta vera?
Domanda 3 Dato un programma P, supponendo di ottimizzare una porzione di codice che impegna il 40% del tempo totale di esecuzione di P, ottenendo su tale porzione di codice uno speedup di 2x, qual è lo speedup complessivo su P?
Domanda 4 Dato un programma P, supponendo di ottimizzare una porzione di codice che impegna il 75% del tempo totale di P, qual è lo speedup massimo teorico che possiamo ottenere su P?
Soluzione non ancora disponibile.
e2.c
#include "e2.h"
#define IDX(i,j,w) ((i)*(w)+(j))
void blur5(unsigned char* in, unsigned char* out, int w, int h){
int i,j,u,v;
for (i=0; i<h; ++i)
for (j=0; j<w; ++j)
if (i<2 || i>h-3 || j<2 || j>w-3)
out[IDX(i,j,w)] = in[IDX(i,j,w)];
else {
unsigned somma = 0;
for (u=-2; u<=2; ++u)
for (v=-2; v<=2; ++v)
somma += in[IDX(i+u,j+v,w)];
out[IDX(i,j,w)] = somma/25;
}
}