HPC - Inversione di un array

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2021-10-15

Realizzare un programma per invertire un array di \(n\) elementi interi, cioè scambiare il primo elemento con l'ultimo, il secondo col penultimo e così via. Realizzare due kernel diversi: il primo ricopia gli elementi di un array in[] in un altro array out[] in modo che quest'ultimo contenga gli stessi elementi di in in[] in ordine inverso; il secondo kernel inverte gli elementi di in[] "in place", ossia modificando in[] senza sfruttare altri array di appoggio.

Il file cuda-reverse.cu fornisce una implementazione basata su CPU delle funzioni reverse() e inplace_reverse(); modificare il programma per trasformare le funzioni in kernel da invocare opportunamente.

Suggerimento: la funzione reverse() può essere facilmente trasformata in un kernel eseguito da \(n\) CUDA thread (uno per ogni elemento dell'array). Ciascun thread copia un elemento di in[] nella corretta posizione di out[]; utilizzare thread block 1D, dato che in tal caso risulta facile mappare ciascun thread in un elemento dell'array di input. La funzione inplace_reverse() si trasforma in un kernel in modo simile, che però verrà eseguito da \(n/2\) CUDA thread anziché \(n\); ciascuno degli \(n/2\) thread scambia un elemento della prima metà dell'array in[] con l'elemento in posizione simmetrica nella seconda metà. Controllare che il programma funzioni anche se \(n\) è dispari.

Per compilare:

    nvcc cuda-reverse.cu -o cuda-reverse

Per eseguire:

    ./cuda-reverse [n]

Esempio:

    ./cuda-reverse

File