Analiza performantelor (profiling) reprezinta analiza comportamentului unui program pentru a determina partile din cadrul acestuia ce pot fi optimizate. Analiza dinamica se realizeaza in timpul rularii programului si poate fi implementata cu ajutorul interuperilor hardware, al contorilor hardware, al hookurilor din cadrul sistemelor de operare, etc. Analiza statica este realizata fara a rula programul si se bazeaza pe analiza codului sursa, a codului obiect sau a unei versiuni intermediare a acestuia.
Pentru Cell/B.E., setul de utilitare ce pot fi folosite pentru analiza performantelor este alcatuit din:
Din perspectiva temporala, analiza performantelor in vederea optimizarii aplicatiilor are loc dupa faza de debugging. In figura de mai jos, este prezentata ordinea recomandata pentru optimizarea cu utilitarele puse la dispozitie pentru Cell/B.E..
In continuare vor fi descrise cele patru utilitare pentru profiling si autotuning: CPC, OProfile, PDT si FDPR-Pro. Tabelul de mai jos prezinta o vedere de ansamblu asupra utilitarelor.
Utilitar | Utilizeaza | Returneaza | |||
CPC | Contori hardware | Profil vizualizat cu VPA Counter Analyzer | |||
OProfile | Contori hardware & Cod sursa | Profil vizualizat cu VPA Profile Analyzer | |||
PDT | Cod instrumentat | Profil vizualizat cu VPA Trace Analyzer | |||
FDPR-Pro | Cod instrumentat & Workload reprezentativ | Cod executabil optimizat & Profil vizualizat cu VPA Code Analyzer |
CPC permite setarea si citirea contorilor de performanta pusi la dispozitie de procesorul Cell/BE. Prin intermediul CPC, programatorul are acces la numarul de evenimente care au avut loc intr-un anumit interval de timp. Evenimentele hardware care pot fi monitorizate sunt asociate cu: PPE, SPE-uri, interface bus, memorie, controler de I/O.
Contorizarea evenimentelor este posibila prin unitatea Performance Monitoring Unit (PMU) care pune la dispozitie 4 contori pe 32 biti care pot fi configurati si ca perechi de cate 2 contori pe 16 biti. Pe scurt, CPC permite citirea regulata a contorilor din PMU prin setarea perioadei de sampling. CPC poate opera in urmatoarele doua moduri: * workload in cadrul caruia este determinata performanta pentru un singur proces si * system-wide care intoarce performanta pentru toate procesele.
Rezultatele analizei cu CPC sunt grupate in 7 blocuri logice, PPU, PowerPC Processor Storage Subsystem (PPSS), SPU, Memory Flow Controller (MFC), Element Interconnection Bus (EIB), Memory Interface Controller (MIC) si CELL/B.E. Interface Unit (BEI), fiecare bloc logic avand semnale organizate in grupuri. PMU poate monitoriza oricate semnale din cadrul aceluiasi grup dar numai doua grupuri de semnale in acelasi timp.
Citirea periodica a contorilor este realizata printr-un mecanism hardware. Astfel, monitorizarea este eficienta deoarece reduce numarul de apeluri ale CPC in interiorul kernelului. Procedura este denumita hardware sampling iar pasii necesari pentru activarea ei sunt urmatorii:
Samplingul hardware poate fi utilizat in mai multe moduri:
Samplingul poate fi controlat fin cu ajutorul PPU bookmarks care sunt accesibile in cadrul sistemului de fisiere la: /sys/devices/system/cpu/cpu*/pmu_bookmark. Operatiile permise pentru aceste bookmarkuri se refera la oprirea sau pornirea unui anumit contor. Executarea acestor operatii poate fi realizata atat din linie de comanda ca parametru al CPC cat si din cadrul aplicatiilor. Datele de iesire oferite de CPC sunt disponibile in diferite formate: text, HTML, XML.
OProfile este o aplicatie de profiling la nivel de sistem capabila sa monitorizeze performanta intregului cod rulat cu un overhead minim. Este compus din: kernel driver, daemon pentru colectarea rezultatelor si utilitare de post-profiling pentru conversia datelor in informatii.
Comparat cu CPC, ofera statistici mai complexe. In plus, OProfile asociaza evenimentele hardware cu codul care le genereaza. Intreg codul este analizat de OProfile: intreruperi hardware si software, module kernel, kernel, biblioteci partajate si aplicatii.
OProfile este folosit in urmatoarele situatii:
OProfile are in componenta mai multe subutilitare:
Ca dezavantaj, OProfile necesita acces exclusiv la contorii hardware din PMU, fapt care nu permite rularea simultana a OProfile si CPC spre exemplu.
PDT ofera o modalitate de a inregistra evenimentele semnificative in timpul executiei programului si a de a pastra ordinea secventiala a evenimentelor. Inregistrarea evenimentelor este efectuata in timp real, datele fiind colectate de la PPE si SPE-uri.
Profilingul este bazat pe instrumentarea codului care implementeaza functiile cheie generatoare de evenimente pe SPE si PPE si colectarea inregistrarilor de traceuri. PDT creeaza un trafic aditional intre SPE-uri si PPE deoarece datele sunt colectate in memoria PPE.
Tracingul este realizat la nivel aplicatie (user space) iar datele sunt colectate la fiecare rulare a aplicatiei. De regula sunt selectate numai acele evenimente de interes. Procesul de profiling poate fi controlat dinamic prin API-ul PDT. In timpul rularii aplicatiei datele sunt colectate intr-un fisier mapat in memoria PPE in care este pastrata ordinea evenimentelor. SPE-urile utilizeaza DMA pentru a scrie date in memoria PPE.
Principalul dezavantaj al PDT consta in generarea un trafic aditional considerabil si de aceea poate influenta negativ performanta aplicatiei monitorizare.
Instrumentarea este realizata pentru functii din urmatoarele biblioteci:
In general, evenimentele sunt capturate de functii din SDK care au fost deja instrumentate pentru tracing, intre acestea fiind: activarea SPE-urilor, transferuri DMA, sincronizare, semnalizare etc.
FDPR-Pro este mai mult decat un utilitar pentru profiling, este un utilitar pentru optimizarea automata a aplicatiilor. Optimizarile sunt efectuate pentru un volum mediu de date de intrare. Pe baza datelor de intrare, este generata o noua versiune a programului in vederea unei executii mai rapide si unei utilizari mai eficiente a memoriei (ex. in functie de proprietatile datelor de intrare, instructiunile unui program ar putea fi reordonate astfel incat portiunea de cod cea mai des accesata sa incapa in cache). Apelat cu flagul -O, FDPR-Pro incearca sa aplice urmatoarele optimizari: reordonarea codului, predictia branchurilor, alinierea codului, branch folding si eliminarea instructinilor NOOP redundante.
Sunt trei faze distincte ale optimizarilor realizate cu fdprpro:
FDPR-Pro are dezavantajul ca exista optimizari agresive (realizate cu flagul -O4 spre exemplu) care pot distruge semantica programului, acesta constituind motivul pentru care aplicatiile trebuie testate atent dupa optimizarea cu FDPR-Pro.
Un alt dezavantaj al FDPR-Pro consta in faptul ca un executabil instrumentat este de cateva ori mai lent decat programul original. De obicei datele folosite in etapa de antrenament sunt de dimensiuni mai mici decat cele reale pentru a nu creste timpul de executie. In acelasi timp datele trebuie sa fie reprezentative pentru worloadul acceptat in general de aplicatie.
In cadrul acestui laborator sunt descrise doua utilitare de vizualizare a rezultatelor monitorizarii aplicatiilor:
PDTR este folosit pentru vizualizarea si procesarea rezultatelor returnate de PDT. Sumarul generat de PDTR include statistici legate de locking, DMA, mailboxuri si diverse evenimente. PDTR poate de asemenea genera rapoarte secventiale incluzand evenimente si parametri insotiti de stampile corespunzatoare de timp.
VPA este un set de aplicatii vizuale integrate in Eclipse:
Pentru a putea rula exemplele din cadrul acestui laborator va trebui sa descarcati VPA de la http://www.alphaworks.ibm.com/tech/vpa/download si sa-l dezarhivati (tot aici sunt disponibile si instructiunile de instalare). Pentru a face sa mearga vpa-ul pe masinile de la laborator (si probabil si pe cele de acasa, aveti nevoie sa urmati pasii descrisi aici: http://www.alphaworks.ibm.com/tech/vpa/faq#05.
Fix vpa pentru Code Analyzer: “chcon -t texrel_shlib_t /opt/vpa/jre/bin/xawt/libmawt.so”. Aceasta comanda functioneaza daca vpa-ul este instalat in /opt/vpa.
Rulati programul vpa pe masina locala. Experimentele le veti face pe cell-1.grid.pub.ro iar analiza acestora pe masina locala.
Pentru rularea utilitarelor de profiling prezentate mai sus, va veti conecta la cell-1.grid.pub.ro folosind contul personal de pe curs.cs.pub.ro.
Pentru exemplul descris in acest laborator vom folosi aplicatia FFT16M, o gasiti in /opt/cell/sdk/src/demos_source.tar (daca e dezarhivat in /opt/cell/sdk/src/demos/FFT16M). Acest program calculeaza transformata fourier folosind operatii SIMD pe un array de 16.772.216 elemente.
Stergeti directorul FFT16M daca acesta exista deja in home-ul vostru si copiati codul in directorul home: rm -R ~/FFT16M
- Daca aveti drept de root pe masina pe care rulati: cp -R /opt/cell/sdk/src/demos/FFT16M ~
- Daca nu aveti drept de root, lucrati in home-ul vostru si dati: cp /opt/cell/sdk/src/demos_source.tar tar -xvf demos_source.tar
Intrati in directorul nou creat si modificati urmatoarele fisiere: ~/FFT16M/ppu/Makefile si respectiv ~/FFT16M/spu/Makefile
Mai jos sunt afisate fisierele Makefile cu modificarile necesare pentru rularea aplicatiilor de profiling.
Fisierul: ~/FFT16M/ppu/Makefile
####################################################################### ## Target ####################################################################### # PROGRAM_ppu= fft ####################################################################### ## Objects ####################################################################### # IMPORTS = ../spu/fft_spu.a -lspe2 -lpthread -lm -lnuma #INSTALL_DIR= $(EXP_SDKBIN)/demos #INSTALL_FILES= $(PROGRAM_ppu) LDFLAGS_gcc = -Wl,-q CFLAGS_gcc = -g ####################################################################### ## buildutils/make.footer ####################################################################### # ifdef CELL_TOP include $(CELL_TOP)/buildutils/make.footer else include ../../../../buildutils/make.footer endif
Fisierul: ~/FFT16M/spu/Makefile
####################################################################### ## Target ####################################################################### # PROGRAMS_spu:= fft_spu LIBRARY_embed:= fft_spu.a ####################################################################### ## Local Defines ####################################################################### # CFLAGS_gcc:= -g --param max-unroll-times=1 # needed to keep size of program down LDFLAGS_gcc = -Wl,-q -g ####################################################################### ## buildutils/make.footer ####################################################################### # ifdef CELL_TOP include $(CELL_TOP)/buildutils/make.footer else include ../../../../buildutils/make.footer endif
Dupa ce compilati noile surse, puteti sa incepeti sa folositi CPC pentru a contoriza numarul de evenimente aparute in cadrul aplicatiei. Pentru a vedea o lista cu evenimentele ce pot fi monitorizate rulati:
cpc --list-events
Verificati ca cpc poate fi folosit pentru monitorizare:
cpc --events C ls -l
Comanda de mai jos va numara instructiunile PPU comise si L1 cache load miss-uri si va afisa rezultatul intr-un format XML in fft_cpc.pmf.
cd ~/FFT16M cpc --events C,2100,2119 --xml fft_cpc.pmf ./ppu/fft 20 1
Un alt exemplu de rulare, in care se numara evenimentele efectuate la fiecare ciclu de ceas intr-un interval de timp dat, este dat mai jos. Cu ajutorul argumentului –interval specificam un interval de timp de 100,000,000 cicli de ceas:
cpc -e 2100,2101,2106,2109 -e 2103,2104,2111,2119 --interval 100000000 -X fft_cpc2.pmf ./ppu/fft 20 1
Pentru a vizualiza rezultatele cu utilitarul Counter Analyzer din VPA copiati mai intai pe masina locala fisierul fft_cpc.pmf si efectuati urmatorii pasi:
Utilitarul FDPR-Pro va ofera, pe langa functia de optimizare, posibilitatea de a investiga performantele aplicatiei mapand rezultatele la codul sursa in combinatie cu Code Analyzer. Initial trebuie sa utilizati FDPR-Pro pentru colectarea datelor:
cd ~/FFT16M/ppu rm -f *.mprof *.nprof mkdir sputmp
fdprpro ./ppu/fft -cell -spedir sputmp -a instr
./ppu/fft.instr 20 1
~/FFT16M/ppu/fft.nprof # profil PPU ~/FFT16M/ppu/fft_spu.mprof # profil SPU
Copiati mai intai fisierele fft, fft.c, fft.nprof, fft_spu.mprof pe masina locala. Pentru a putea vizualiza informatiile generate de FDPR-Pro efectuati urmatorii pasi:
PDT ofera posibilitatea inregistrarii evenimentelor importante din timpul executiei programului, vizualizarea acestora se face cu utilitarul Trace Analyzer. Va trebui sa recompilati aplicatia fft utilizand urmatoarele configurari:
####################################################################### ## Target ####################################################################### # PROGRAMS_spu:= fft_spu LIBRARY_embed:= fft_spu.a ####################################################################### ## Local Defines ####################################################################### # CFLAGS_gcc:= -g --param max-unroll-times=1 -Wall -Dmain=_pdt_main -Dexit=_pdt_exit -DMFCIO_TRACE -DLIBSYNC_TRACE LDFLAGS_gcc = -Wl,-q -g -L/usr/spu/lib/trace INCLUDE = -I/usr/spu/include/trace IMPORTS = -ltrace ####################################################################### ## buildutils/make.footer ####################################################################### # ifdef CELL_TOP include $(CELL_TOP)/buildutils/make.footer else include ../../../../buildutils/make.footer endif
cd ~/FFT16M make
# Copiati fisierul default de configurare in directorul fft:
cp /usr/share/pdt/config/pdt_cbe_configuration.xml ~/FFT16M.
# Deschideti pentru editare fisierul copiat
# Pe prima linie schimbati numele aplicatiei in fft (application_name=“fft”)
# Cautati in fisier <configuration name=“SPE”>
. Sub acea linie veti gasi grupul MFCIO, setati tag-ul grupului pe active=“false”
# Stergeti grupul SPE_MFC si salvati.
* Pregatiti mediul de lucru prin setarea urmatoarelor variabile
export LD_LIBRARY_PATH=/usr/lib/trace export PDT_KERNEL_MODULE=/usr/lib/modules/pdt.ko export PDT_CONFIG_FILE=~/FFT16M/pdt_cbe_configuration.xml
cd ~/FFT16M/ppu ./fft 1 1 4 1 0
Trebuie sa desetati variabila LD_LIBRARY_PATH pentru a putea rula binarul original mai tarziu.
Pentru a genera un raport text complet din fisierele rezultate, puteti utiliza PDTR pentru a produce fisiere .pep in format ASCII:
$ pdtr -trc <nume fisiere trace (fara extensie)>
Copiati fisierul .pex generat de PDT pe masina locala. Utilitarul Trace Analyzer va permite vizualizarea etapelor de executie a unei aplicatii folosind datele generate de PDT.
Pentru a putea controla si configura OProfile se foloseste comanda:
opcontrol (:sourceend:) Puteti sa vizualizati lista de evenimente ce pot fi monitorizate cu ajutorul comenzii: <code text> opcontrol --list-events
Pentru a specifica un eveniment pentru monitorizare folositi:
opcontrol --event=NUME_EVENIMENT:INTERVAL
Deoarece rularea OProfile necesita acces root, nu veti putea rula pe masinile cell disponibile. Un exemplu de rulare este prezentat mai jos. Informatiile generate de OProfile pot fi vizualizate in VPA in modul Profile Analyzer. Exemplu:
[brutman@qdc167 sandbox]$ sudo opcontrol --init [brutman@qdc167 sandbox]$ sudo opcontrol --no-vmlinux [brutman@qdc167 sandbox]$ sudo opcontrol --event=SPU_CYCLES:100000 [brutman@qdc167 sandbox]$ sudo opcontrol --start Forcing required option --separate=lib with SPU_CYCLES Forcing required option --separate=cpu with SPU_CYCLES Using 2.6+ OProfile kernel interface. Using log file /var/lib/oprofile/oprofiled.log Daemon started. Profiler running. [brutman@qdc167 sandbox]$ sudo opcontrol --reset Signalling daemon... done [brutman@qdc167 sandbox]$ ./FFT16M/ppu/fft 1 0 (output from fft workload snipped) [brutman@qdc167 sandbox]$ sudo opcontrol --stop Stopping profiling. [brutman@qdc167 sandbox]$ sudo opcontrol --dump [brutman@qdc167 sandbox]$ sudo opcontrol --deinit Stopping profiling. Killing daemon. Unloading oprofile module [brutman@qdc167 sandbox]$
Pentru a genera un raport bazat pe simboluri folositi opreport –symbols.
[brutman@qdc167 sandbox]$ opreport --symbols CPU: ppc64 Cell Broadband Engine, speed 3200 MHz (estimated) Counted SPU_CYCLES events (SPU Processor Cycles) with a unit mask of 0x00 (Count cycles [mandatory]) count 100000 Samples on CPU 0 Samples on CPU 1 Samples on CPU 2 Samples on CPU 3 Samples on CPU 4 Samples on CPU 5 Samples on CPU 6 Samples on CPU 7 samples % samples % samples % samples % samples % samples % samples % samples % image name symbol name 398029 44.0202 398028 44.0201 391874 43.9982 390029 44.0115 390027 44.0113 390028 44.0114 390027 44.0113 390028 44.0114 fft_spu _exit 394862 43.6699 394729 43.6552 388813 43.6545 386899 43.6584 386750 43.6415 386880 43.6562 386718 43.6379 386781 43.6450 fft_spu main 71511 7.9088 71506 7.9082 70454 7.9103 70020 7.9012 70022 7.9014 70023 7.9015 70022 7.9014 70017 7.9008 fft_spu process8192_816 29430 3.2548 29594 3.2730 29233 3.2822 29013 3.2739 29210 3.2961 29069 3.2802 29199 3.2949 29192 3.2941 fft_spu process8192_0 6633 0.7336 6580 0.7277 6581 0.7389 6525 0.7363 6529 0.7367 6527 0.7365 6557 0.7399 6442 0.7269 fft_spu stage1 2881 0.3186 2902 0.3209 2859 0.3210 2868 0.3236 2816 0.3178 2830 0.3193 2832 0.3196 2890 0.3261 fft_spu _transpose_matrix4x4 289 0.0320 288 0.0319 285 0.0320 281 0.0317 284 0.0320 286 0.0323 282 0.0318 285 0.0322 fft_spu stage3 265 0.0293 270 0.0299 263 0.0295 261 0.0295 262 0.0296 262 0.0296 263 0.0297 261 0.0295 fft_spu stage2 122 0.0135 125 0.0138 122 0.0137 123 0.0139 121 0.0137 120 0.0135 118 0.0133 121 0.0137 fft_spu _sind2 119 0.0132 124 0.0137 122 0.0137 117 0.0132 117 0.0132 123 0.0139 122 0.0138 123 0.0139 fft_spu _cosd2 41 0.0045 40 0.0044 42 0.0047 48 0.0054 42 0.0047 44 0.0050 48 0.0054 39 0.0044 fft_spu __divdf3 7 7.7e-04 3 3.3e-04 6 6.7e-04 5 5.6e-04 7 7.9e-04 2 2.3e-04 5 5.6e-04 8 9.0e-04 fft_spu __pack_d 4 4.4e-04 4 4.4e-04 2 2.2e-04 5 5.6e-04 5 5.6e-04 2 2.3e-04 3 3.4e-04 3 3.4e-04 fft_spu __do_global_dtors_aux 4 4.4e-04 4 4.4e-04 4 4.5e-04 3 3.4e-04 5 5.6e-04 1 1.1e-04 1 1.1e-04 7 7.9e-04 fft_spu __unpack_d [brutman@qdc167 sandbox]$
Pentru a genera un raport bazat pe fisiere folositi opreport –long-filenames.
[brutman@qdc167 sandbox]$ opreport --long-filenames CPU: ppc64 Cell Broadband Engine, speed 3200 MHz (estimated) Counted SPU_CYCLES events (SPU Processor Cycles) with a unit mask of 0x00 (Count cycles [mandatory]) count 100000 Samples on CPU 0 Samples on CPU 1 Samples on CPU 2 Samples on CPU 3 Samples on CPU 4 Samples on CPU 5 Samples on CPU 6 Samples on CPU 7 cpu:0| cpu:1| cpu:2| cpu:3| cpu:4| cpu:5| cpu:6| cpu:7| samples| %| samples| %| samples| %| samples| %| samples| %| samples| %| samples| %| samples| %| ------------------------------------------------------------------------------------------------------------------------------------------------ 904197 100.000 904197 100.000 890660 100.000 886197 100.000 886197 100.000 886197 100.000 886197 100.000 886197 100.000 /home/brutman/sandbox/FFT16M/ppu/fft [brutman@qdc167 sandbox]$
Analiza performantelor reprezinta este o componenta esentiala in procesul de optimizare a unei aplicatii pentru a folosi la maxim puterea de calcul pusa la dispozitie de arhitectura Cell/B.E.. Acest laborator a prezentat un set de utilitare pentru analiza performantelor aplicatiilor pentru Cell/B.E.: