Biuletyn nr 16

Biuletyn KDM
1 | 2 | 3 | 4 | 5
6 | 7 | 8 | 9 | 10
11 | 12 | 13 | 14
15 | 16 | 17 | 18
19 | 20 | 21 | 22
23 | 24 | 25 | 26
27 | 28 | 29 | 30
31 | 32
Lista biuletynów

Biuletyn nr 16 (9 listopada 2006).

Spis treści

Podział czasu obliczeniowego na halo

Autor: Marcin Mogielnicki

Klaster halo zawiera w sumie 288 procesorów do dyspozycji użytkowników przydzielanych na wyłączność konretnemu zadaniu. Moim celem nie jest debatowanie, czy to mało czy dużo. Tak czy inaczej zapotrzebowanie na moc obliczeniową jest znacząco większe i zapewne każdy użytkownik halo zetknął się z tasiemcową kolejką zadań czekających na uruchomienie. W związku z tym oczywiste jest, że temat podziału czasu obliczeniowego wywoływał i dalej wywołuje kontrowersje. Dlatego też w odpowiedzi na liczne pytania użytkowników przedstawiam algorytm decydujący, w jakiej kolejności uruchamiać oczekujące zadania.

Na początek zauważę, że jedynym zasobem, którego niedostatek odczuwamy, są procesory, więc celem systemu kolejkowego jest równy podział czasu obliczniowego. Inne zasoby nie są przedmiotem rywalizacji i nie są brane przy przedstawionych obliczeniach pod uwage.

System kolejkowy zlicza zajętość klastra przez danego użytkownika oraz grupę w stosunku do całkowitej liczby procesorów. Próbki pobierane są co 24 godziny. Przykładowo jeśli użytkownik miał zajęte 10 procesorów w ciągu danego 24-godzinnego przedziału oraz 5 przez 6 godzin w tym przedziale, to wartość jego próbki wyniesie (10*1+6*0.25)/288. Próbka dla grupy jest sumą próbek wszystkich użytkowników należących do danej grupy. Ujmując rzecz przystępnie system kolejkowy dysponuje wiedzą, jaki procent klastra był X dni temu zajęty przez użytownika oraz grupę. Zapamiętywane są wartósci rzeczywiście zużyte, tzn. zadanie rezerwujące dużą ilość zasobów na dłuższy czas, które się z jakichś powodów natychmiast po starcie skończyło, powoduje naliczenie wartości za czas rzeczywistej zajętości, czyli tak znikomej, że wręcz pomijalnej, a nie wartości podanych przy rezerwacji zasobów.

Następnym krokiem jest wyliczenie średniego "zużycia procesorów" w dłuższym okresie czasu. Decyzją administratora przyjęto, że pod uwagę bierze się 60 ostatnich próbek (czyli dni), każdą poprzednią ze współczynnikiem wagowym 0.98. Matematycznie rzecz wygląda następująco:

 średnie_zużycie =
  (procent_zajętości_procesora_dziś * (0.98)^0 +
   procent_zajętości_procesora_wczoraj * (0.98)^1 +
   procent_zajętości_procesora_przedwczoraj * (0.98)^2 +
   .... i tak za 60 ostatnich dni) / 60

Analogicznie przeprowadza sie obliczenia dla grup. Tu także, jak widać, wszyscy użytkownicy oraz grupy traktowani są dokładnie tak samo. To, co uzyskujemy, jest "średnią" zajętością procesorów przez ostatnie 60 dni z przywiązywaniem tym mniejszej wagi do próbki, im jest starsza. Przykładowo wliczamy do puli zużycia całą próbke najświeższą, 0.54 próbki sprzed 30 dni i tylko 0.29 próbki sprzed 60 dni.

Ostatnim krokiem jest właściwe wyliczenie priorytetu. Oblicza się go następująco:

 priorytet = 100*(30*(0.05-średnie_zużycie_użytkownika) + 10*(0.1-średnie_zużycie_grupy))

gdzie wzór na średnie zużycie został uprzednio przedstawiony. Opisowo znaczy to, że jeśli użytkownik zużył dokładnie "średnio" 5% procesorów, a jego grupa 10%, to priorytet wynosi zero. Jeśli użytkownik lub grupa zużyli mniej, priorytet rośnie in plus, jeśli więcej, in minus.

I to juz koniec. Dalej sprawa jest banalna - najpierw uruchamia sie zadanie z najwyższym liczbowo priorytetem, potem kolejnym, znów kolejnym... Jesli użytkownik ma akurat dzialające zadania, kumuluje zużycie procesorów, więc priorytet mu spada. Nie ma - rośnie.

Na koniec dwie uwagi. Pierwsza - system kolejkowy dysponuje dwiema pulami wezłów (dwuprocesorowymi i osmioprocesorowymi) traktowanymi rozdzielnie. Znaczy to, że priorytet zadania w obu przypadkach wyliczany jest dokładnie tak samo, jednak kolejki do uruchomienia, w zależności od docelowego węzła, są dwie. Druga - jeśli użytkownik zażądał zasobów dodatkowych, przykładowo miejsca na dysku lokalnym węzła, a akurat jedyny wolny węzeł tym zasobem nie dysponuje, przepuszcza on do uruchomienia zadanie kolejne samemu zachowując pierwsze miejsce i czekając na węzeł dysponujący tym zasobem.

Reasumując - wszyscy użytkownicy traktowani są dokładnie w ten sam sposób i, w przypadku wystarczającej liczby zadań czekających w kolejce, przeprowadzą identyczną liczbę obliczeń.


Q&A: Jak wydrukować slajdy po cztery na jednej stronie

Autor: Łukasz Bolikowski

Koleżanka zadała następujące pytanie: ma slajdy w postaci PDF przygotowane w LaTeX'u przy pomocy pakietu Beamer, chciałaby wydrukować je po cztery na jednej stronie. Jak to zrobić?

Otrzymała w odpowiedzi trzy rozwiązania:

1. Dla fanów UNIX-a: Skonwertować plik do PostScript, a następnie użyć polecenia psnup:

 acroread -toPostScript slajdy.pdf
 psnup -n 4 < slajdy.ps > slajdy-4.ps

Uwaga: do konwersji do PostScript można też użyć programów pdf2ps lub pdftops.

2.Dla fanów LaTeX-a: Dodać w źródłowym pliku LaTeX linijki:

 \usepackage{pgfpages}
 \pgfpagesuselayout{4 on 1}[a4paper,border shrink=5mm,landscape]

3. Dla fanów Windows: Kliknąć "Drukuj", a we właściwościach wybrać opcję 4 strony na 1 (większość driverów współczesnych drukarek ma tego typu opcję).

Totalview - debugowanie kodów równoległych (część 2)

Autor: Maciek Cytowski

W drugiej części opisu TotalView dowiemy się jak poruszać się po kodzie i jak korzystać z podstawowych komend debugingu.

Jak poruszać się po liniach kodu?

Poruszanie po liniach kodu to zazwyczaj problem następującego typu:

  • chcę przejść do konkretnego pliku
  • chcę przejść do konkretnej funkcji w kodzie
  • chcę przejść do konkretnej linii w kodzie

W TotalView powyższe zadania możemy rozwiązywać na kilka sposobów. Z naszego doświadczenia wynika, że w przypadku przeportowanej na masynę Cray X1e wersji, nie zawsze wszystkie z tych sposobów dają dobry rezultat. Dlatego warto zapoznać się z nimi wszystkimi.

Przejście do konkretnego pliku

Aby przejść do pliku źródłowego, np. w celu ustawienia breakpoint'a, można skorzystać z opcji Open Source.. dostępnej w Menu->File:


File1.png Ttv File2.png


Mamy możliwość przejścia do dowolnego pliku źródłowego, który używany był do utworzenia debugowanego programu. Dokonujemy tego poprostu wpisując jego nazwę w dostępnym oknie. W przypadku, gdy istnieje kilka plików źródłowych o tej samej nazwie (w innych katalogach drzewa projektu) TotalView wymieni je i poprosi o wybranie poprawnego.

Przejście do konkretnej funkcji

Aby przejść do konkretnej funkcji możemy na przykład skorzystać z powyżej opisanej opcji Open Source... Jeśli wiemy w którym pliku źródłowym znajduje się dana funkcja możemy skorzystać ze składni: nazwa_pliku#nazwa_funkcji. Jeśli nie wiemy (lub nie pamiętamy) gdzie znajduje się funkcja pisując jej nazwę lub wpisując nazwę pliku i po znaczku # nazwę funkcji w nim zawartej:


Ttv File3.png Ttv File4.png


Takie samo okno Lookup ujrzymy po wybraniu Menu->View->Lookup function.

W przypadku gdy chcemy ustawić na początku danej funkcji znacznik dowolnego typu, możemy skorzystać z Menu->Action Point->At Location. Mamy wówczas możliwość podania nazwy danej funkcji:

Ttv Function1.png Ttv Function2.png

Wyszukanie zmiennej

Aby wyszukać zmienną możemy skorzystać z Menu->File->Open Source (po czym zaznaczyć pole Variable) lub Menu->View->Lookup Variable. W obydwu przypadkach ujrzymy następujące okno, które pozwoli nam wyszukać daną zmienną:


Ttv Variable1.png

Jak sterować sesją debugingu? - podstawy

Do sterowania sesją debugingu służy górna listwa:

Ttv Toolbar.png

Znajdujące się na niej przyciski można podzielić na trzy grupy:

  • pierwszy przycisk określa zakres wydawanej komendy
  • kolejne osiem przycisków (od Go do Stepl) określa rodzaj komendy
  • ostatnie cztery przyciski służą do zmiany aktualnie oglądanego procesu lub wątku

Pierwszy przycisk pozwala nam określić zakres wydawanej komendy, poprzez wybór jednego z następujących:

Ttv Group.png

Jeśli z dostępnej listy wybierzemy np. Group (Control) i wydamy komendę Go (która oznacza uruchomienie procesu) zostaną uruchomione wszystkie wątki we wszystkich procesach znajdujących się w tej samej Control Group co aktualnie oglądany wątek (różne rodzaje grup, procesów i wątków opisane były w Biuletyn_nr_15).

Jeśli czujemy się zagubienie w różnorodności typów grup, procesów i wątków być może warto wiedzieć, że najczęściej stosowane ustawienia przy debugowaniu kodów to następujące:

Ttv Zakres2.png

Ttv Zakres1.png

Pierwsze ustawienie powoduje, że wydawane komendy odnoszą się do wszystkich wątków i procesów tworzonych przes nasz program. Drugie ustawienie odnosi się tylko do pojedynczego aktualnie debugowanego procesu i wszystkich wątków z nim związanych (może się przydać np. przy debugowaniu programów MPI).

Mamy do wyboru kilka podstawowych komend:

  • Go - uruchamia wszystkie wątki/procesy zawierające się w określonym zakresie, zatrzymuje się po zakończeniu programu, przy komunikacie o błędzie, przy dojściu do jakiegoś znacznika lub przy zatrzymaniu ręcznym - patrz następna komenda
  • Halt - wstrzymuje wszystkie wątki/procesy zawierające się w określonym zakresie
  • Next - przechodzi do następnej linii w podglądanym aktualnie fragmencie kodu; jeżeli następna linia to wywołanie funkcji to nie nastąpi wejście do niej
  • Step - podobnie do Next; jeżeli następna linia to wywołanie funkcji to nastąpi wejście do niej i ustawienie znacznika w pierwszej linii wywołanej funkcji
  • Out - odwrotnie do Step; wyjście z funkcji piętro wyżej
  • Run To - przycisk zostanie uaktywniony, gdy klikniemy na (nie zakomentowaną) linię kodu; wówczas uruchomienie komendy spowoduje uruchommienie procesu do wybranego fragmentu
  • NextI - przechodzi do następnej assemblerowej instrukcji wykonywanej w kodzie (można podejrzeć wybierając: Menu->View->Source As->Assembler)
  • StepI - podobne do NextI; różnica pomiędzy NextI a StepI jest analogiczna do różnicy pomiędzy Next a Step

Korzystając z powyżej wymienionych komend oraz znaczników opisanych w poprzedniej części można już próbować debugować swoje własne kody. Pozostałe narzędzia, którymi dysponuje TotalView będą opisane w kolejnych częściach podręcznika.

Pomoce

W przypadku jakichkolwiek trudności lub pytań warto spojrzeć na pomoce dostępne w sieci:

Dostępny jest adres e-mail: pomoc@icm.edu.pl pod który można kierować ewentualne pytania dotyczące TotalView na tornado.