C2115 Praktický úvod do superpočítání -1-XIII. lekce C2115 Praktický úvod do superpočítání Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta, Masarykova univerzita, Kotlářská 2, CZ-61137 Brno XIII. lekce C2115 Praktický úvod do superpočítání -2-XIII. lekce Obsah ➢ Zvyšování výkonu superpočítačů SMP, multicore CPU, NUMA ➢ Paralelizace programů numerická integrace, OpenMP, MPI C2115 Praktický úvod do superpočítání -3-XIII. lekce Architektura počítače C2115 Praktický úvod do superpočítání -4-XIII. lekce CPU Processor (CPU - Central Processing Unit) is an essential part of the computer; it is a very complex circuit that (sequentially) executes the machine code stored in the computer's memory. The machine code is composed of the instructions, which are processed by ALU. www.wikipedia.org CPU control unit ALU ALU (arithmetic and logic unit) executes arithmetic operations and evaluates logical conditions. Control unit reads machine code (instructions) and data and prepares them for execution on ALU. (Sequential) execution of machine code is controlled by internal clock. C2115 Praktický úvod do superpočítání -5-XIII. lekce Increasing Computing Power physical CPU core control unit ALU physical CPU core control unit ALU ALU ALU ALU logical CPU cores CU#1 ALU ALU ALU ALU CU#2 Strategies: • increasing clock frequency – physical limitations (miniaturization, lowering voltage) • increasing number of ALUs and their specializations (out-of-order execution, speculative execution, vector instructions) – efficiency limited by executed code • sharing ALUs among control units (hyperthreading) – efficiency limited by executed code • multi-core processor – efficiency limited by executed code hyperthreading multi-core processor software optimization or new algorithms are necessary to benefit from these features C2115 Praktický úvod do superpočítání -6-XIII. lekce Symmetric Multiprocessing (SMP) processor (package, socket, circuit) CPU cores interconnect (vendor specific) RAM RAM computer Symmetric multiprocessing represents a system containing identical processors accessing shared memory. Utilizations of larger number of CPUs increases computing power of the system. bus RAM CPU#1 CPU#2 processor (package, socket, circuit) C2115 Praktický úvod do superpočítání -7-XIII. lekce Processor Caches memory L3 L2 L1 L1 CPU Processor caches improves access into memory (latency and bandwidth). processor PU = processing unit (=control unit)CPU core C2115 Praktický úvod do superpočítání -8-XIII. lekce Processor Caches two processing units per core (hyperthreading) L1i – instruction cache, L1d – data cache L2, L3 – other caches Speed: L1d,L2d >> L2 > L3 C2115 Praktický úvod do superpočítání -9-XIII. lekce NUMA (Nonuniform Memory Access ) cache memory driver RAM#3 cache memory driver RAM#1 cache memory driver cache memory driver RAM#4RAM#2 NUMA links (vendor specific interconnect) multi-core processor #3 multi-core processor #1 multi-core processor #2 multi-core processor #4 Compare communication between Processor#1 <> RAM#1 and Processor#1 <> RAM#4. NUMA links can have various topologies to improve memory access and latency. C2115 Praktický úvod do superpočítání -10-XIII. lekce NUMA (Nonuniform Memory Access ) cache memory driver RAM#3 cache memory driver RAM#1 cache memory driver cache memory driver RAM#4RAM#2 NUMA links (vendor specific interconnect) multi-core processor #3 multi-core processor #1 multi-core processor #2 multi-core processor #4 Compare communication between Processor#1 <> RAM#1 and Processor#1 <> RAM#4. NUMA links can have various topologies to improve memory access and latency. fast slower C2115 Praktický úvod do superpočítání -11-XIII. lekce Exercise PI.E1 1. Examine type and parameters of processor on your workstation (command lscpu, file /proc/cpus). 2. Examine NUMA topology on your workstation (command lstopo, module hwloc). 3. Does your CPU support hyperthreading? 4. What is a process? 5. What is difference between CPU intensive and data intensive tasks? 6. A parallel task is data intensive. Each its process works with different data sets. What is better for speeding up the calculation? 1. To double number of CPU cores. 2. To double number of processors (sockets). Užitečné příkazy: $ lscpu $ lstopo # module add hwloc $ cat /proc/cpuinfo $ ams-host # Infinity C2115 Praktický úvod do superpočítání -12-XIII. lekce Paralelizace programů C2115 Praktický úvod do superpočítání -13-XIII. lekce Lichoběžníková vs obdélníková metoda lichoběžníková metoda obdélníková metoda yi yi yi+1 h h h yy I ii i 2 )( 1++ = hyI ii = Která metoda je vhodnější pro paralelní výpočet? C2115 Praktický úvod do superpočítání -14-XIII. lekce Sekvenční implementace program integral implicit none integer(8) :: i integer(8) :: n double precision :: h,v,y,x !--------------------------------------------------- n = 2000000000 h = 1.0d0/n v = 0.0d0 do i=1,n x = (i-0.5d0)*h y = 4.0d0/(1.0d0+x**2) v = v + y*h end do write(*,*) 'integral = ',v end program integral obdélníková metoda C2115 Praktický úvod do superpočítání -15-XIII. lekce Paralelizace - OpenMP OpenMP je soustava direktiv pro překladač a knihovních procedur pro paralelní programování. Jedná se o standard pro programování počítačů se sdílenou pamětí. OpenMP usnadňuje vytváření vícevláknových programů v programovacích jazycích Fortran, C a C++. www.wikipedia.org Specifikace: www.openmp.org C2115 Praktický úvod do superpočítání -16-XIII. lekce OpenMP implementace ncpu = 1 !$ ncpu = omp_get_max_threads() write(*,*) 'Number of threads = ',ncpu !$omp parallel !$omp do private(i,x,y),reduction(+:v) do i=1,n x = (i-0.5d0)*h y = 4.0d0/(1.0d0+x**2) v = v + y*d end do !$omp end do !$omp end parallel write(*,*) 'integral = ',v C2115 Praktický úvod do superpočítání -17-XIII. lekce OpenMP kompilace $ gfortran -O3 integral.f90 -o integral $ ldd ./integral linux-vdso.so.1 => libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 /lib64/ld-linux-x86-64.so.2 $ gfortran -O3 -fopenmp integral.f90 -o integral $ ldd ./integral linux-vdso.so.1 => (0x00007fff593ff000) libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 /lib64/ld-linux-x86-64.so.2 C2115 Praktický úvod do superpočítání -18-XIII. lekce OpenMP spuštění $ export OMP_NUM_THREADS=4 $ ./integral Number of threads = 4 integral = 3.1415925965295672 počet vláken, které může aplikace využít Poznámka: pokud není proměnná OMP_NUM_THREADS nastavena, použije se maximální počet dostupných CPU jader (na klastru WOLF je však výchozí hodnota proměnné OMP_NUM_THREADS explicitně nastavena na 1) C2115 Praktický úvod do superpočítání -19-XIII. lekce Cvičení 2 1. Zkompilujte program integral.f90 z adresáře /home/kulhanek/Data/C2115/Lesson12/integral/openmp s optimalizací -O3 bez podpory OpenMP. 2. Určete dobu běhu aplikace potřebnou pro integraci funkce. K měření doby použijte program /usr/bin/time. 3. Zkompilujte program integral.f90 s optimalizací -O3 a zapnutou podporou OpenMP. 4. Určete počet CPU jader na vašem počítači (lscpu). 5. Spouštějte program integral postupně pro 1, 2, 3, až N vláken, kde N je maximální dostupný počet CPU jader. Pro každé spuštění určete dobu běhu. Získaná data zapisujte do následující tabulky a vyhodnoťte. N Treal [s] Speedup CPU effectivity [%] 1 27.8 1.0 100.0 2 14.7 1.9 94.8 3 11.0 2.5 84.1 4 8.2 3.4 84.7 real real T NT Speedup )1( = = 100 N Speedup vityCPUeffecti =naměřený čas C2115 Praktický úvod do superpočítání -20-XIII. lekce Cvičení 3 1. Co je to Amhdalův zákon? C2115 Praktický úvod do superpočítání -21-XIII. lekce Paralelizace - MPI Message Passing Interface (dále jen MPI) je knihovna implementující stejnojmennou specifikaci (protokol) pro podporu paralelního řešení výpočetních problémů v počítačových clusterech. Konkrétně se jedná o rozhraní pro vývoj aplikací (API) založené na zasílání zpráv mezi jednotlivými uzly. Jedná se jak o zprávy typu point-to-point, tak o globální operace. Knihovna podporuje jak architektury se sdílenou pamětí, tak s pamětí distribuovanou. C2115 Praktický úvod do superpočítání -22-XIII. lekce MPI implementace C2115 Praktický úvod do superpočítání -23-XIII. lekce MPI výhody x nevýhody C2115 Praktický úvod do superpočítání -24-XIII. lekce MPI kompilace $ module add openmpi:2.0.3-gcc-5.4.0 $ mpif90 -O3 integral.f90 -o integral C2115 Praktický úvod do superpočítání -25-XIII. lekce MPI spuštění $ mpirun –np 2 ./integral počet procesů, které aplikace využívá k výpočtu $ mpirun –np 2 –machinefile nodes ./integral soubor, který obsahuje seznam uzlů, na kterých se spouští procesy Předpoklady: • ssh bez hesla • aplikace musí být ve stejné cestě na všech uzlech, na kterých se spouští procesy wolf01 slots=2 wolf02 slots=3 počet CPU název výpočetního uzlu C2115 Praktický úvod do superpočítání -26-XIII. lekce Cvičení 4 1. Zkompilujte program integral.f90 z adresáře /home/kulhanek/Data/C2115/Lesson12/integral/mpi s optimalizací -O3. 2. Spouštějte program integral postupně pro 1, 2, 3, až N procesů, kde N je maximální dostupný počet CPU jader. Pro každé spuštění určete dobu běhu. Získaná data zapisujte do tabulky a vyhodnoťte jako ve cvičení 2 3. Spouštějte program integral postupně pro 1, 2, 4, 8 až N procesů (násobky 2), kde N je maximální dostupný počet uzlů na dvou uzlech klastru WOLF. Pro každé spuštění určete dobu běhu. Získaná data zapisujte do tabulky a vyhodnoťte jako ve cvičení 2. Spouštění je nutné koordinovat s uživatelem druhého výpočetního uzlu. V jiném terminálu monitorujte běžící procesy na obou výpočetních uzlech příkazem top. C2115 Praktický úvod do superpočítání -27-XIII. lekce Samostudium C2115 Praktický úvod do superpočítání -28-XIII. lekce Cvičení 5 1. Zkompilujte program mult_mat_blas_dp.f90 z adresáře /home/kulhanek/Data/C2115/Lesson12/matmult s optimalizací -O3 proti systémové knihovně blas (program obsahuje jiný způsob měření času oproti LIV.2). 2. Určete dobu běhu aplikace mult_mat_blas_dp programem /usr/bin/time. 3. Zkompilujte program mult_mat_blas_dp.f90 s optimalizací -O3 proti knihovně MKL. 4. Určete dobu běhu aplikace mult_mat_blas_dp programem /usr/bin/time. Pro spuštění aplikace musíte aktivovat modul intelcore:2015.0.090 Porovnejte dobu běhu mezi MKL a systémovou knihovnou blas. Která knihovna poskytuje větší výpočetní výkon? 5. Spouštějte program mult_mat_blas_dp postupně pro 1, 2, 3, až N vláken, kde N je maximální dostupný počet CPU jader. Počet vláken pro MKL knihovnu se nastavuje pomocí systémové proměnné MKL_NUM_THREADS. Pro každé spuštění určete dobu běhu. Získaná data zapisujte do tabulky a vyhodnoťte jako ve cvičení 2. gfortran -O3 mult_mat_blas_dp.f90 -o mult_mat_blas_dp \ -lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core \ –lgomp -lpthread \ -L/software/ncbr/softrepo/common/intelcore/2015.0.090/x86_64/para/lib