Sto scrivendo un programma per la moltiplicazione di matrici con OpenMP, che, per convenienza della cache, implementa le righe X di moltiplicazione A x B (trasposizione) invece del classico A x B righe x colonne, per una migliore efficienza della cache. Facendo questo ho affrontato un fatto interessante che per me è illogico: se in questo codice parallelizzo il ciclo esterno il programma è più lento di se metto le direttive OpenMP nel ciclo più interno, nel mio computer i tempi sono 10.9 vs 8.1 secondi.moltiplicazione della matrice parallelizzazione OpenMP da un ciclo triplo (problema di prestazioni)
//A and B are double* allocated with malloc, Nu is the lenght of the matrixes
//which are square
//#pragma omp parallel for
for (i=0; i<Nu; i++){
for (j=0; j<Nu; j++){
*(C+(i*Nu+j)) = 0.;
#pragma omp parallel for
for(k=0;k<Nu ;k++){
*(C+(i*Nu+j))+=*(A+(i*Nu+k)) * *(B+(j*Nu+k));//C(i,j)=sum(over k) A(i,k)*B(k,j)
}
}
}
Con il tweaking dei parametri di omp, ho ottenuto il 200% di accelerazione sulla mia macchina. originale: http://llcomp.googlecode.com/hg/examples/mxm.c corrente: http://codepad.org/nSfZHp03 – jfs
Soluzione piacevole.Sì, OpenMP è un po 'ingannevole il codice – Elalfer
che usa il layout di memoria '' fortran'' per la matrice 'B' che gira 4-8 più veloce (il più grande vantaggio) per le matrici 1000x1000 (la versione filettata richiede' 0.5' secondi). https://gist.github.com/790865 – jfs