uniroma1.E*Main.scala.cognome.nome. Sulle postazioni del laboratorio sarà /home/studente/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.
Si scriva una versione vettorizzata SSE o AVX 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 o AVX 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 27 aprile 2020.
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.