Ho eseguito alcuni esperimenti con il framework openmp e ho trovato alcuni risultati strani che non sono sicuro di sapere come spiegare.Prestazioni di Malloc in un ambiente con multithreading
Il mio obiettivo è creare questa enorme matrice e quindi riempirla di valori. Ho realizzato alcune parti del mio codice come loop paralleli per ottenere prestazioni dal mio ambiente multithread. Sto eseguendo questo in una macchina con 2 processori xeon quad-core, quindi posso tranquillamente mettere fino a 8 thread simultanei in là.
Tutto funziona come previsto, ma per qualche motivo il ciclo for che alloca effettivamente le righe della mia matrice ha una prestazione di picco dispari quando si esegue con solo 3 thread. Da lì in poi, l'aggiunta di alcuni thread rende il mio ciclo più lungo. Con 8 thread richiede più tempo che sarebbe necessario con uno solo.
Questo è il mio circuito parallelo:
int width = 11;
int height = 39916800;
vector<vector<int> > matrix;
matrix.resize(height);
#pragma omp parallel shared(matrix,width,height) private(i) num_threads(3)
{
#pragma omp for schedule(dynamic,chunk)
for(i = 0; i < height; i++){
matrix[i].resize(width);
}
} /* End of parallel block */
Questo mi ha fatto pensare: c'è un problema di prestazioni noto al momento della chiamata malloc (che suppongo sia quello che il metodo di ridimensionamento della classe template è effettivamente chiamando) in un ambiente multithreaded? Ho trovato alcuni articoli che dicevano qualcosa sulla perdita di prestazioni nella liberazione dello spazio heap in un ambiente sottoposto a modifica, ma nulla di specifico sull'allocazione di nuovi spazi come in questo caso.
Solo per darvi un esempio, sto posizionando sotto un grafico del tempo impiegato dal ciclo per terminare in funzione del numero di thread per il ciclo di allocazione e di un ciclo normale che legge solo i dati da questa enorme matrice in seguito.
Entrambe le volte in cui misurate utilizzando la funzione gettimeofday e sembrano restituire risultati molto simili e precisi attraverso diverse istanze di esecuzione. Quindi, qualcuno ha una buona spiegazione?
Ho appena dimenticato di dire che sono in esecuzione su Ubuntu 11.04 (64 bit). – Bilthon