Ci scusiamo per il lungo post, ma volevo includere tutto ciò che pensavo fosse rilevante al primo tentativo.
Quello che voglio
Sto implementando una versione parallela dei metodi di sottospazio di Krylov per le matrici dense. Principalmente GMRES, QMR e CG. Mi sono reso conto (dopo la profilazione) che la mia routine DGEMV era patetica. Così ho deciso di concentrarmi su questo isolandolo. Ho provato a eseguirlo su una macchina a 12 core ma i risultati seguenti sono per un laptop Intel i3 a 4 core. Non c'è molta differenza nella tendenza.
La mia KMP_AFFINITY=VERBOSE
uscita è disponibile qui .
Ho scritto un piccolo codice:
size_N = 15000
A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad
b = randomly_generated_dense_vector(size_N);
for it=1:n_times %n_times I kept at 50
x = Matrix_Vector_Multi(A,b);
end
Credo che questo simuli il comportamento di CG per 50 iterazioni.
Cosa ho provato:
Traduzione
Inizialmente avevo scritto il codice in Fortran. L'ho tradotto in C, MATLAB e Python (Numpy). Inutile dire che MATLAB e Python erano orribili. Sorprendentemente, C era meglio di FORTRAN di un secondo o due per i valori di cui sopra. Costantemente.
profiling
Ho profilato il mio codice per l'esecuzione e ha funzionato per 46.075
secondi. Questo era quando MKL_DYNAMIC era impostato suFALSE
e venivano usati tutti i core. Se avessi usato MKL_DYNAMIC come vero, solo la metà (circa) del numero di core sarebbe stata in uso in un dato momento. Ecco alcuni dettagli:
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
Il processo che richiede più tempo sembra essere:
Call Stack LAX16_N4_Loop_M16gas_1
CPU Time by Utilization 157.926s
CPU Time:Total by Utilization 94.1%
Overhead Time 0us
Overhead Time:Total 0.0%
Module libmkl_mc3.so
Ecco alcune foto:
conclusioni:
Sono un vero principiante nella profilazione ma mi rendo conto che l'accelerazione non è ancora buona. Il codice sequenziale (1 core) termina in 53 secondi. Questa è una velocità inferiore a 1,1!
Domanda reale: cosa devo fare per migliorare la mia velocità?
Roba che penso possa aiutare ma non posso essere sicuro:
- Implementazione di Pthreads
- Implementazione MPI (ScaLapack)
- Sintonizzazione manuale (Non so come. Si prega di raccomandare una risorsa se si suggerisce questo)
Se qualcuno ha bisogno di maggiori dettagli (soprattutto per quanto riguarda la memoria), per favore fatemi sapere cosa dovrei eseguire e come. Non ho mai profilato memoria prima.