uniroma1
.E*Main.scala
.cognome.nome
.cognome.nome.zip
(zip -r cognome.nome.zip cognome.nome/
).cognome.nome.zip
.Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Si scriva una versione vettorizzata SSE add_prod
della seguente funzione add_prod_seq
inclusa nel file E3/e3.c
scaricato:
static void add_prod_seq(const short* src, short* dst, short x, int n) {
int j;
for (j=0; j < n; ++j) dst[j] += x * src[j];
}
La funzione realizza il ciclo più interno in un codice di prodotto di matrici di short
.
Suggerimento. Se si opta per SSE, usare in particolare:
_mm_set1_epi16
per costruire un __m128i
con tutti i suoi short
inizializzati a un valore specifico;_mm_mullo_epi16
per effettuare il prodotto elemento a elemento di due __m128i
che contengono ciascuno 8 short
.Si veda il sito Intel e la dispensa sul parallelismo per la documentazione sugli intrinsic SSE/AVX.
Usare il main di prova nella directory di lavoro E1
digitando make
per compilare e ./es1
per eseguire il programma. Testare inoltre il codice con valgrind ./e1
. Non modificare alcun file tranne e1.c
e nessuna funzione in e1.c
tranne add_prod
.
Si scriva una versione vettorizzata SSE count_occ
della seguente funzione count_occ_seq
inclusa nel file E4/e4.c
scaricato:
int count_occ_seq(const char* v, int n, char x) {
int i, cnt = 0;
for (i=0; i < n; ++i) cnt += v[i] == x;
return cnt;
}
La funzione conta il numero di occorrenze di x
nell’array v
di lunghezza n
.
Suggerimento. Se si opta per SSE, usare in particolare:
_mm_set1_epi8
per costruire un __m128i
con tutti i 16 byte inizializzati a un valore char
specifico;_mm_setzero_si128
per costruire un __m128i
con tutti i 128 bit a zero;_mm_cmpeq_epi8(a,b)
che restituisce un __m128i
in cui l’i-esimo byte è 0xFF
se gli i-esimi byte di a
e b
sono uguali, e 0x00
altrimenti.Si veda per ispirazione la soluzione dell’esercizio cdiff
discussa in dettaglio nella lezione del 9 dicembre 2021.
Usare il main di prova nella directory di lavoro E2
digitando make
per compilare e ./es2
per eseguire il programma. Testare inoltre il codice con valgrind ./e2
. Non modificare alcun file tranne e4.c
e nessuna funzione in e2.c
tranne count_occ
.
TBA