HPC - Prodotto scalare

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2021-10-13

Il file omp-dot.c contiene un programma seriale che calcola il prodotto scalare di due array v1[] e v2[]. Il programma accetta come unico parametro sulla riga di comando la lunghezza \(n\) degli array, che vengono inizializzati in modo deterministico in modo da conoscere il loro prodotto scalare senza doverlo calcolare. Ricordiamo che il prodotto scalare di v1[] e v2[] è definito come:

\[ \sum_{i=0}^{n-1} v1[i] \times v2[i] \]

Parallelizzare il programma seriale usando il costrutto omp parallel con le clausole che si ritengono appropriate. Si inizi senza usare omp parallel for, ma calcolando gli estremi dei cicli di ciascun thread OpenMP come segue: detto \(P\) la dimensione del pool di thread, il programma deve partizionare logicamente l'array in \(P\) blocchi di dimensione approssimativamente uniforme. Il thread \(p\)-esimo (\(0 \leq p < P\)) calcola una porzione di prodotto scalare my_p corrispondente alla somma dei prodotti degli elementi di v1[] e v2[] di indici \(\texttt{my_start}, \ldots, \texttt{my_end}-1\), cioè:

\[ \texttt{my_p} := \sum_{i=\texttt{my_start}}^{\texttt{my_end}-1} v1[i] \times v2[i] \]

Ci sono diversi modi per accumulare i risultati parziali. Una possibilità consiste nel fare in modo che il valore calcolato dal thread \(p\)-esimo venga memorizzato nell'elemento partial_p[p], dove partial_p[] è un array di lunghezza \(P\); in questo modo ciascun thread gestisce un elemento diverso di partial_p[] e non si verificano race condition. Il master calcola il risultato finale come somma dei valori in partial_p[]. Si presti attenzione a gestire correttamente il caso in cui la lunghezza \(n\) degli array non sia un multiplo di \(P\).

Una soluzione più semplice ed efficiente consiste nell'uso della clausola reduction().

Per compilare:

    gcc -fopenmp -std=c99 -Wall -Wpedantic omp-dot.c -o omp-dot

Per eseguire:

    ./omp-dot [n]

Esempio usando due thread OpenMP:

    OMP_NUM_THREADS=2 ./omp-dot 1000000

File