2013-11-01 22 views
6

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

+1

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

+1

@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

+1

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

risposta

1

La ragione più probabile per questo comportamento dato che la maggior parte del tempo viene speso in OS (vmlinux), è superamento delle sottoscrizioni causata da nidificato regione parallelo OpenMP all'interno implementazione MKL di cblas_dgemm() e dgesv . Per esempio. vedi this example.

Questa versione è supportata e spiegata da Jim Dempsey allo Intel forum.

0

Che dire dell'utilizzo di MKL: libreria sequenziale? Se colleghi la libreria MKL con l'opzione sequenziale, non genera thread OpenMP all'interno dello stesso MKL. Immagino che potresti ottenere risultati migliori di adesso.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – durron597

+0

In genere, i collegamenti o i riferimenti a uno strumento o una libreria non devono semplicemente includere una spiegazione specifica di come la risorsa consigliata è applicabile al problema, ma [anche essere accompagnata da note di utilizzo o codice di esempio] (http: //meta.stackoverflow .com/a/251.605). (@ durron597: tecnicamente, questa * è * una risposta, ma non tutto ciò che è sorprendente di uno.) –