Ho una routine che esegue alcune chiamate MKL su piccole matrici (50-100 x 1000 elementi) per adattare un modello, che quindi chiamerò per diversi modelli. In pseudo-codice:Prestazioni MKL su Intel Phi
double doModelFit(int model, ...) {
...
while(!done) {
cblas_dgemm(...);
cblas_dgemm(...);
...
dgesv(...);
...
}
return result;
}
int main(int argc, char **argv) {
...
c_start = 1; c_stop = nmodel;
for(int c=c_start; c<c_stop; c++) {
...
result = doModelFit(c, ...);
...
}
}
chiamata alla suddetta versione 1. Poiché i modelli sono indipendenti, posso utilizzare thread OpenMP per parallelizzare il montaggio di modello, come segue (versione 2):
int main(int argc, char **argv) {
...
int numthreads=omp_max_num_threads();
int c;
#pragma omp parallel for private(c)
for(int t=0; t<numthreads; t++) {
// assuming nmodel divisible by numthreads...
c_start = t*nmodel/numthreads+1;
c_end = (t+1)*nmodel/numthreads;
for(c=c_start; c<c_stop; c++) {
...
result = doModelFit(c, ...);
...
}
}
}
Quando Eseguo la versione 1 sulla macchina host, ci vogliono circa 11 secondi e VTune segnala una scarsa parallelizzazione con la maggior parte del tempo trascorso inattivo. La versione 2 sulla macchina host richiede ~ 5 secondi e VTune segnala una grande parallelizzazione (quasi il 100% del tempo è trascorso con 8 CPU in uso). Ora, quando compilo il codice per l'esecuzione sulla scheda Phi in modalità nativa (con -mmic), le versioni 1 e 2 richiedono circa 30 secondi quando vengono eseguite sul prompt dei comandi su mic0. Quando uso VTune a profilo it:
- versione 1 assume gli stessi circa 30 secondi e l'analisi hotspot mostra che più tempo è trascorso in __kmp_wait_sleep e __kmp_static_yield. Fuori dal tempo di CPU 7710, 5804 sono spesi in Tempo di rotazione.
- La versione 2 richiede fooooorrrreevvvver ... L'ho ucciso dopo aver eseguito un paio di minuti in VTune. L'analisi dell'hotspot mostra quella di 25254s del tempo di CPU, 21585 sono spesi in [vmlinux].
Qualcuno può far luce su quello che sta succedendo qui e sul perché mi sto comportando così male? Sto utilizzando l'impostazione predefinita per OMP_NUM_THREADS e imposto KMP_AFFINITY = compact, granularity = fine (come consigliato da Intel). Sono nuovo di MKL e OpenMP, quindi sono certo che sto facendo errori da principiante.
Grazie, Andrew
MKL ha alcuni seri problemi di prestazioni con piccole matrici su Phi. Raccomando di postare la tua domanda sui forum Intel: http://software.intel.com/en-us/forums/intel-many-integrated-core – pburka
@pburka Ho postato anche lì. Sto solo provando a lanciare una rete più ampia. :) Hai un link per i problemi con la matrice piccola? – Andrew
Ecco un problema http://software.intel.com/en-us/forums/topic/475924. Sto anche seguendo Intel con Premier Support. In questo caso, credo che MKL riduca il numero di thread a 30, e quindi impiega 1ms per far tornare indietro i thread dopo la chiamata GEMM. Ma credo anche che questo non sia l'unico problema di prestazioni di GEMM. – pburka