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