SlideShare ist ein Scribd-Unternehmen logo
1 von 23
SIM

                 DASCĂLU Cristian, 343C4
                                   cristian.dascalu@cti.pub.ro

                 PETRE Vlad-Ştefan, 341C1
                                        vlad@vladpetre.com

                 ŞERBĂNESCU Vlad-Nicolae, 341C3
                              vlad.serbanescu@cti.pub.ro

1   11.01.2011
2   11.01.2011
Descrierea Proiectului

    • SIM este un program serial bazat pe tehnici de
      programare dinamică, care caută similarităţi locale
      între două şiruri de caractere sau în cadrul aceleaşi
      secvenţe, folosind ponderi afine.

    • Ca utilizare practică a acestui program, putem aminti
      compararea de secvenţe ADN sau rularea de
      benchmarkuri.
3   11.01.2011
Analiza Sumară




4   11.01.2011
Abordări

    • OpenMP

    • Pthreads

    • Optimizare serială



5   11.01.2011
OpenMP


    • Abordare: introducerea de directive OpenMP de
      genul #pragma omp section sau #pragma omp
      for acolo unde este cazul.




6   11.01.2011
Problema Principală


    • Puţine zone de cod cu potenţial de paralelizare
      datorită algoritmului (avem multe dependinţe de
      date în zonele de cod care rulează mult timp).




7   11.01.2011
Exemplu de Dependinţe
    register long f; //f – este o variabilă globală (deci shared)
    for ( i = m1 + 1; i <= mm; i++)
    { // Notă: Am scos liniile de cod irelevante din acest exemplu
         f = - (q);    //iniţializarea lui f
         limit = i + 1;
         for ( j = limit ; j <= nn ; j++ )
         {
            f = f - r; //dacă ar fi doar asta, aş putea să paralelizez
            if ( f < c )
            {
               f = c; //dar eu nu pot şti când se intră aici
            }
            myf = f;   //utilizarea variabilei în buclă
         }
    } // În “for”-ul principal mai avem o dependinţă pe care o va
       prezenta colegul meu peste câteva momente.
8   11.01.2011
Problema Secundară


    • Aplicarea directivelor OpenMP acolo unde este
      posibil (banale iniţializări ...) nu rentează datorită
      overhead-ului mare în lucrul cu threaduri
      comparativ cu câştigul computaţional.




9   11.01.2011
Rezultate OpenMP


     • Varianta paralelizată durează mai mult decât cea
       serială datorită overhead-ului mare şi a
       posibilităţilor reduse de a folosi directive OpenMP.




10    11.01.2011
Pthreads


     • Adăugarea unei rutine de execuţie a instrucţiunilor
       din “for-ul” cel mai din exterior din funcţia
       small_pass.




11    11.01.2011
Problema Pthreads
     • Dependenţa de date din for-ul exterior al porţiunii principale a
       funcţiei:
         for ( i = m1 + 1; i <= mm; i++) {
           ...
           for ( j = limit ; j <= nn ; j++ ) {
             /* citire RR[j] */
             ci = RR[j]; //RR[j] este global, iar ci este local
             ORDER(c, ci, cj, d, di, dj)
             ORDER(c, ci, cj, f, fi, fj)
             /* prelucrări ci */
             RR[j] = ci; //scriere RR[j]!!
           }
         }

12    11.01.2011
Rezultate Pthreads

     • Partea de iniţializare.

     • Overhead mare pentru 12000 de fire.

     • Impărţirea celor 12000 de fire pe bucăţi, asemănător
       OpenMP.


13    11.01.2011
Optimizare Serială

     • Problema identificată: predictibilitatea scăzută a
       fluxului de instrucţiuni.

     • Soluţia abordată: binary lookup table sau ceva
       similar.




14    11.01.2011
Branch Miss Predictions




15   11.01.2011
Varianta 1
for (j = 1; j <= N; j++)                    for (...)
{                                           {
  if ( (c = c - qr) > (e = e – r) )
                                                ...
    e = c;
  if ((c = CC[j] - qr) > (d = DD[j] - r))       lookup_table[0] = c;
    d = c;                                      lookup_table[1] = d;
                                                lookup_index = (c < d);
                                                c = lookup_table[lookup_index];
     DIAG(i+I, j+J, c, s+va[B[j]]);
                                                ...
     if (c < d)
       c = d;                               }
     if (c < e)
       c = e;
     s = CC[j];
     CC[j] = c;
     DD[j] = d;
}
16     11.01.2011
Rezultate Varianta 1




Dar timpul total de execuţie este mai mare: aproximativ 105s faţă de 90s pe un Intel Celeron
550 tactat la 2 GHz.


17   11.01.2011
ORDER(ss1, xx1, yy1, ss2, xx2, yy2)   Varianta 2
{                                              short _ORDER_case;
  if ( ss1 < ss2 )
                                               ORDER(ss1, xx1, yy1, ss2, xx2,   yy2)
      { ss1 = ss2; xx1 = xx2; yy1 = yy2; }     {
                                                  _ORDER_case = (ss1 < ss2) |
    else                                                ((ss1 == ss2 && xx1 <   xx2) << 1)
                                                        | ((ss1 == ss2 && xx1   == xx2
      if ( ss1 == ss2 )                                                && yy1   < yy2) << 2);

          { if ( xx1 < xx2 )                       switch (_ORDER_case)
                                                   {
              { xx1 = xx2; yy1 = yy2; }              case 1:
                                                        ss1 = ss2; xx1 = xx2; yy1 = yy2;
                                                        break;
          else
                                                    case 2:
                                                        xx1 = xx2; yy1 = yy2;
              if ( xx1 == xx2 && yy1 < yy2 )            break;
                                                     case 4:
                yy1 = yy2;                              yy1 = yy2;
                                                        break;
          }                                        }
                                               }
}


18     11.01.2011
Rezultate Varianta 2




Dar timpul total de execuţie rămâne în continuare mai mare: aproximativ 115s faţă de 90s pe
un Intel Celeron 550 tactat la 2 GHz.


19   11.01.2011
Rezultate Finale

     Varianta                      Optimizare                     Timp de rulare
     Serial iniţial                -g                             1m20s
     Serial iniţial                -O3                                29s
     Serial optimizat              -g                             1m22s
     OpenMP                        -g                             1m22s
     Pthreads                      -g                             1m15s



       Notă:
       • S-au folosit două fişiere de intrare, fiecare având dimensiunea de 12 KB.
       • Testele au fost efectuate pe Cluster, pe IBM-Opteron cu rezervare de 4 sloturi.



20     11.01.2011
Concluzii
     • Din păcate, datorită faptului că algoritmul are un
       grad ridicat de dependinţe de date, părţile cu
       adevărat importante din cod nu au putut fi
       paralelizate.

     • Structura codului serial nu permite intervenţii de
       profunzime. Iar pentru cele de suprafaţă, raportul
       dintre overhead-ul introdus şi timpul câştigat este
       nefavorabil.
21    11.01.2011
Referinţe

     • http://www.google.com/codesearch/p?hl=en#yOs0oGPVNuU/MultiSource/

           – Codul original al proiectului pe Google Code Search.
     •    https://ncit-cluster.grid.pub.ro/trac/APP2010/wiki/SIM:/
           – Documentaţia proiectului nostru.
     •    https://svn-batch.grid.pub.ro/svn/APP2010/proiecte/SIM/
           – Codul proiectului nostru.
     •    http://en.wikibooks.org/wiki/Optimizing_C++
     •    http://www-graphics.stanford.edu/~seander/bithacks.html


22       11.01.2011
Vă mulţumim pentru atenţie!



                          Întrebări?



23   11.01.2011

Weitere ähnliche Inhalte

Mehr von Vlad Petre

Founding a startup. DOs and DON'Ts.
Founding a startup. DOs and DON'Ts.Founding a startup. DOs and DON'Ts.
Founding a startup. DOs and DON'Ts.
Vlad Petre
 
Diploma Project: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Project: Friloc - Retea de socializare bazata pe geolocalizareDiploma Project: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Project: Friloc - Retea de socializare bazata pe geolocalizare
Vlad Petre
 
Diploma Presentation: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Presentation: Friloc - Retea de socializare bazata pe geolocalizareDiploma Presentation: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Presentation: Friloc - Retea de socializare bazata pe geolocalizare
Vlad Petre
 
Eneco: Energy Economy
Eneco: Energy EconomyEneco: Energy Economy
Eneco: Energy Economy
Vlad Petre
 
Kickstart Project: Android+Restlet+Hibernate+PostgreSQL
Kickstart Project: Android+Restlet+Hibernate+PostgreSQLKickstart Project: Android+Restlet+Hibernate+PostgreSQL
Kickstart Project: Android+Restlet+Hibernate+PostgreSQL
Vlad Petre
 
Critica asupra lucrarii Proactive Computing
Critica asupra lucrarii Proactive ComputingCritica asupra lucrarii Proactive Computing
Critica asupra lucrarii Proactive Computing
Vlad Petre
 
Critica asupra Singularitatii lui Vernor Vinge
Critica asupra Singularitatii lui Vernor VingeCritica asupra Singularitatii lui Vernor Vinge
Critica asupra Singularitatii lui Vernor Vinge
Vlad Petre
 
Aplicare Filtre pe Imagini
Aplicare Filtre pe ImaginiAplicare Filtre pe Imagini
Aplicare Filtre pe Imagini
Vlad Petre
 
Voicenger - Software Design Document
Voicenger - Software Design DocumentVoicenger - Software Design Document
Voicenger - Software Design Document
Vlad Petre
 
Voicenger - System Requirements Specification
Voicenger - System Requirements SpecificationVoicenger - System Requirements Specification
Voicenger - System Requirements Specification
Vlad Petre
 

Mehr von Vlad Petre (20)

SSD pe intelesul tuturor!
SSD pe intelesul tuturor!SSD pe intelesul tuturor!
SSD pe intelesul tuturor!
 
The 3-D Secure Protocol
The 3-D Secure ProtocolThe 3-D Secure Protocol
The 3-D Secure Protocol
 
Founding a startup. DOs and DON'Ts.
Founding a startup. DOs and DON'Ts.Founding a startup. DOs and DON'Ts.
Founding a startup. DOs and DON'Ts.
 
[Curs Android] C08 - Intents & Broadcast Receivers (IPW 2011)
[Curs Android] C08 - Intents & Broadcast Receivers (IPW 2011)[Curs Android] C08 - Intents & Broadcast Receivers (IPW 2011)
[Curs Android] C08 - Intents & Broadcast Receivers (IPW 2011)
 
[Curs Android] C06 - DDMS & LogCat (IPW 2011)
[Curs Android] C06 - DDMS & LogCat (IPW 2011)[Curs Android] C06 - DDMS & LogCat (IPW 2011)
[Curs Android] C06 - DDMS & LogCat (IPW 2011)
 
[Curs Android] C05 - Emulator (IPW 2011)
[Curs Android] C05 - Emulator (IPW 2011)[Curs Android] C05 - Emulator (IPW 2011)
[Curs Android] C05 - Emulator (IPW 2011)
 
[Curs Android] C04 - User Interface (IPW 2011)
[Curs Android] C04 - User Interface (IPW 2011)[Curs Android] C04 - User Interface (IPW 2011)
[Curs Android] C04 - User Interface (IPW 2011)
 
[Curs Android] C02 - Aplicatii (IPW 2011)
[Curs Android] C02 - Aplicatii (IPW 2011)[Curs Android] C02 - Aplicatii (IPW 2011)
[Curs Android] C02 - Aplicatii (IPW 2011)
 
[Curs Android] C01 - Introducere (IPW 2011)
[Curs Android] C01 - Introducere (IPW 2011)[Curs Android] C01 - Introducere (IPW 2011)
[Curs Android] C01 - Introducere (IPW 2011)
 
Diploma Project: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Project: Friloc - Retea de socializare bazata pe geolocalizareDiploma Project: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Project: Friloc - Retea de socializare bazata pe geolocalizare
 
Diploma Presentation: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Presentation: Friloc - Retea de socializare bazata pe geolocalizareDiploma Presentation: Friloc - Retea de socializare bazata pe geolocalizare
Diploma Presentation: Friloc - Retea de socializare bazata pe geolocalizare
 
Eneco: Energy Economy
Eneco: Energy EconomyEneco: Energy Economy
Eneco: Energy Economy
 
Kickstart Project: Android+Restlet+Hibernate+PostgreSQL
Kickstart Project: Android+Restlet+Hibernate+PostgreSQLKickstart Project: Android+Restlet+Hibernate+PostgreSQL
Kickstart Project: Android+Restlet+Hibernate+PostgreSQL
 
Critica asupra lucrarii Proactive Computing
Critica asupra lucrarii Proactive ComputingCritica asupra lucrarii Proactive Computing
Critica asupra lucrarii Proactive Computing
 
Critica asupra Singularitatii lui Vernor Vinge
Critica asupra Singularitatii lui Vernor VingeCritica asupra Singularitatii lui Vernor Vinge
Critica asupra Singularitatii lui Vernor Vinge
 
Aplicare Filtre pe Imagini
Aplicare Filtre pe ImaginiAplicare Filtre pe Imagini
Aplicare Filtre pe Imagini
 
Voicenger - Software Design Document
Voicenger - Software Design DocumentVoicenger - Software Design Document
Voicenger - Software Design Document
 
Voicenger - System Requirements Specification
Voicenger - System Requirements SpecificationVoicenger - System Requirements Specification
Voicenger - System Requirements Specification
 
Optimizarea metodelor de sortare SIMD pentru GPU-uri NVIDIA
Optimizarea metodelor de sortare SIMD pentru GPU-uri NVIDIAOptimizarea metodelor de sortare SIMD pentru GPU-uri NVIDIA
Optimizarea metodelor de sortare SIMD pentru GPU-uri NVIDIA
 
Nvidia Tegra
Nvidia TegraNvidia Tegra
Nvidia Tegra
 

SIM Project: Optimizing a Benchmarking Tool

  • 1. SIM DASCĂLU Cristian, 343C4 cristian.dascalu@cti.pub.ro PETRE Vlad-Ştefan, 341C1 vlad@vladpetre.com ŞERBĂNESCU Vlad-Nicolae, 341C3 vlad.serbanescu@cti.pub.ro 1 11.01.2011
  • 2. 2 11.01.2011
  • 3. Descrierea Proiectului • SIM este un program serial bazat pe tehnici de programare dinamică, care caută similarităţi locale între două şiruri de caractere sau în cadrul aceleaşi secvenţe, folosind ponderi afine. • Ca utilizare practică a acestui program, putem aminti compararea de secvenţe ADN sau rularea de benchmarkuri. 3 11.01.2011
  • 4. Analiza Sumară 4 11.01.2011
  • 5. Abordări • OpenMP • Pthreads • Optimizare serială 5 11.01.2011
  • 6. OpenMP • Abordare: introducerea de directive OpenMP de genul #pragma omp section sau #pragma omp for acolo unde este cazul. 6 11.01.2011
  • 7. Problema Principală • Puţine zone de cod cu potenţial de paralelizare datorită algoritmului (avem multe dependinţe de date în zonele de cod care rulează mult timp). 7 11.01.2011
  • 8. Exemplu de Dependinţe register long f; //f – este o variabilă globală (deci shared) for ( i = m1 + 1; i <= mm; i++) { // Notă: Am scos liniile de cod irelevante din acest exemplu f = - (q); //iniţializarea lui f limit = i + 1; for ( j = limit ; j <= nn ; j++ ) { f = f - r; //dacă ar fi doar asta, aş putea să paralelizez if ( f < c ) { f = c; //dar eu nu pot şti când se intră aici } myf = f; //utilizarea variabilei în buclă } } // În “for”-ul principal mai avem o dependinţă pe care o va prezenta colegul meu peste câteva momente. 8 11.01.2011
  • 9. Problema Secundară • Aplicarea directivelor OpenMP acolo unde este posibil (banale iniţializări ...) nu rentează datorită overhead-ului mare în lucrul cu threaduri comparativ cu câştigul computaţional. 9 11.01.2011
  • 10. Rezultate OpenMP • Varianta paralelizată durează mai mult decât cea serială datorită overhead-ului mare şi a posibilităţilor reduse de a folosi directive OpenMP. 10 11.01.2011
  • 11. Pthreads • Adăugarea unei rutine de execuţie a instrucţiunilor din “for-ul” cel mai din exterior din funcţia small_pass. 11 11.01.2011
  • 12. Problema Pthreads • Dependenţa de date din for-ul exterior al porţiunii principale a funcţiei: for ( i = m1 + 1; i <= mm; i++) { ... for ( j = limit ; j <= nn ; j++ ) { /* citire RR[j] */ ci = RR[j]; //RR[j] este global, iar ci este local ORDER(c, ci, cj, d, di, dj) ORDER(c, ci, cj, f, fi, fj) /* prelucrări ci */ RR[j] = ci; //scriere RR[j]!! } } 12 11.01.2011
  • 13. Rezultate Pthreads • Partea de iniţializare. • Overhead mare pentru 12000 de fire. • Impărţirea celor 12000 de fire pe bucăţi, asemănător OpenMP. 13 11.01.2011
  • 14. Optimizare Serială • Problema identificată: predictibilitatea scăzută a fluxului de instrucţiuni. • Soluţia abordată: binary lookup table sau ceva similar. 14 11.01.2011
  • 16. Varianta 1 for (j = 1; j <= N; j++) for (...) { { if ( (c = c - qr) > (e = e – r) ) ... e = c; if ((c = CC[j] - qr) > (d = DD[j] - r)) lookup_table[0] = c; d = c; lookup_table[1] = d; lookup_index = (c < d); c = lookup_table[lookup_index]; DIAG(i+I, j+J, c, s+va[B[j]]); ... if (c < d) c = d; } if (c < e) c = e; s = CC[j]; CC[j] = c; DD[j] = d; } 16 11.01.2011
  • 17. Rezultate Varianta 1 Dar timpul total de execuţie este mai mare: aproximativ 105s faţă de 90s pe un Intel Celeron 550 tactat la 2 GHz. 17 11.01.2011
  • 18. ORDER(ss1, xx1, yy1, ss2, xx2, yy2) Varianta 2 { short _ORDER_case; if ( ss1 < ss2 ) ORDER(ss1, xx1, yy1, ss2, xx2, yy2) { ss1 = ss2; xx1 = xx2; yy1 = yy2; } { _ORDER_case = (ss1 < ss2) | else ((ss1 == ss2 && xx1 < xx2) << 1) | ((ss1 == ss2 && xx1 == xx2 if ( ss1 == ss2 ) && yy1 < yy2) << 2); { if ( xx1 < xx2 ) switch (_ORDER_case) { { xx1 = xx2; yy1 = yy2; } case 1: ss1 = ss2; xx1 = xx2; yy1 = yy2; break; else case 2: xx1 = xx2; yy1 = yy2; if ( xx1 == xx2 && yy1 < yy2 ) break; case 4: yy1 = yy2; yy1 = yy2; break; } } } } 18 11.01.2011
  • 19. Rezultate Varianta 2 Dar timpul total de execuţie rămâne în continuare mai mare: aproximativ 115s faţă de 90s pe un Intel Celeron 550 tactat la 2 GHz. 19 11.01.2011
  • 20. Rezultate Finale Varianta Optimizare Timp de rulare Serial iniţial -g 1m20s Serial iniţial -O3 29s Serial optimizat -g 1m22s OpenMP -g 1m22s Pthreads -g 1m15s Notă: • S-au folosit două fişiere de intrare, fiecare având dimensiunea de 12 KB. • Testele au fost efectuate pe Cluster, pe IBM-Opteron cu rezervare de 4 sloturi. 20 11.01.2011
  • 21. Concluzii • Din păcate, datorită faptului că algoritmul are un grad ridicat de dependinţe de date, părţile cu adevărat importante din cod nu au putut fi paralelizate. • Structura codului serial nu permite intervenţii de profunzime. Iar pentru cele de suprafaţă, raportul dintre overhead-ul introdus şi timpul câştigat este nefavorabil. 21 11.01.2011
  • 22. Referinţe • http://www.google.com/codesearch/p?hl=en#yOs0oGPVNuU/MultiSource/ – Codul original al proiectului pe Google Code Search. • https://ncit-cluster.grid.pub.ro/trac/APP2010/wiki/SIM:/ – Documentaţia proiectului nostru. • https://svn-batch.grid.pub.ro/svn/APP2010/proiecte/SIM/ – Codul proiectului nostru. • http://en.wikibooks.org/wiki/Optimizing_C++ • http://www-graphics.stanford.edu/~seander/bithacks.html 22 11.01.2011
  • 23. Vă mulţumim pentru atenţie! Întrebări? 23 11.01.2011