Views

Biuletyn nr 6

From KDMwiki

Jump to: navigation, search
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 6 (16 grudnia 2005)

Spis treści

Narzędzia: Accelrys

Autor: Magdalena Gruziel

Oprogramowanie firmy Accelrys

Oprogramowanie Accelrys to szeroki wybór pakietów obejmujących różne dziedziny - nauki materiałowe, matematyczno-przyrodnicze, czy bioinformatyczne. W obszarze modelowania biomolekularnego, oprogramowanie Accelrys umożliwia prowadzenie dynamiki molekularnej oraz bogatą analizę danych z trajektorii, homologiczne zwijanie białek, projektowanie leków, dokowanie, czy analizę danych pochodzących z eksperymentów NMR lub krystalograficznych. Nauki materiałowe w oprogramowaniu Accelrys to m.in. modelowanie struktury kryształu lub procesu krystalizaji, badanie własności polimerów, czy związków pomiędzy strukturą a aktywnością. Natomiast dla bioinformatyków jest narzędziem pozwalającym m.in. na uzgadnianie sekwencji nukleotydowych lub aminokwasowych i ich analizy, przeszukiwanie baz danych, tworzenie i wyszukiwanie motywów białkowych, analizę drzew filogenetycznych, zwijanie RNA, mapowanie enzymów restrykcyjnych i proteolitycznych.

Oprogramowanie Accelrys to też, a może i przede wszystkim, program do wizualizacji makro i mikrocząsteczek na różnych poziomach złożoności, od orbitali molekularnych po strukturę trzeciorzędową białek.

Nauki materiałowe reprezentuje pakiet Materials Studio oraz starsze wersje Cerius2. Insight II jest interfejsem, pod ktorym zintegrowanych zostało wiele modułów służących do m.in. modelowania molekularnego mikro i makro biomolekuł, dokowania ligandów, uzgadniania sekwencji, budowania drzew filogenetycznych, analizy danych z trajektorii, danych z ekesperymentu NMR. Dedykowany całkowicie racjonalnemu projektowaniu leków Catalyst pozwala m.in. na budowanie i wizualizację farmakoforów, przeszukiwanie nimi baz danych, ocenianie i porządkowanie wyników. Nowe wersje Cerius2 służą także do projektowania leków, lecz metodami kombinatorycznymi. Felix i CNX wspomagają analizę danych z eksperymentu NMR, drugi z nich także danych z krystalografii, podobnie jak QUANTA. CHARMm jest po prostu Accelrys'ową wersją popularnego Charmm'a - programu przeznaczonego do modelowania molekularnego.


Oprogramowanie firmy Accelrys w ICM

W lub poprzez ICM dostępne są wszystkie wymienione powyżej programy. Prawdopodobnie od początku przyszłego roku dostępne będą w ICM nowe pakiety: Discovery Studio Modeling - interfejs windows'owy do modelowania molekularnego, w przyszłości ma całkowicie zastąpić Insight II, stanowi zaledwie cząstkę olbrzymiego pakietu Discovery Studio - oraz Accelrys GCG, także windows'owy interfejs dedykowany bioinformatyce.

Będąc użytkownikiem ICM obliczenia można prowadzić na latimerii (16 procesorowy SGI) lub w ograniczonym stopniu na klastrze halo (100 procesorow). Ponieważ na halo pracujemy tylko z linii komend, stało się ono serwerem obliczeniowym dla MS, umożliwia też uruchomienie obliczeń FDiscover lub CHARMm (modelowanie molekularne) i DelPhi (rozwiązywanie równania Poissona-Boltzmanna). Na latimerii dostępne jest wszystko z wyjątkiem MS, za to także w trybie graficznym.


Licencja krajowa

ICM już od kilku lat jest koordynatorem licencji krajowej na produkty Accelrys. Do licencji można się w każdej chwili przyłączyć. Pozwala to na własną, lokalną instalację oprogramowania. Wszystkie pakiety działają na zasadzie klient - srewer (obliczeniowy). Wymagany system operacyjny maszyny "klient" dla Materials Studio i Discovery Studio to Windows, "serwer" może pracować pod systemami Windows, Linux, SGI Irix, IBM Aix. Wszystkie pozostałe programy zostały już przeniesione na Linux, oczywiście wciąż można je instalować na starszych SGI'ach pracujących w systemie Irix. Felix i CHARMm są dostępne także na Windows. Niektóre programy mogą też pracować w systemie Aix, na IBM.

W ramach licencji krajowej organizowane są szkolenia dotyczące różnych pakietów. Najbliższe, dwudniowe szkolenie, odbędzie się najprawdopodobniej na przełomie stycznia i lutego 2006, a dotyczyło będzie DS Modeling.


Linki

Szczegółowe informacje o produktach można uzyskać przez linki na stronach ICM:

Warunki przyłączenia się do licencji krajowej na oprogramowanie Accelrys, a także lista modułów objętych tą licencją opisane są dokładnie na stronach ICM:

Informacje o serwerach obliczeniowych w ICM, latimerii i halo:

Wszelkiej pomocy i informacji o oprogramowaniu Accelrys udzielą też opiekunowie licencji, Jacek Piechota i Magda Gruziel. Listy do nich prosimy kierować na adres accelrys@icm.edu.pl.

Programowanie: Unified Parallel C

Autor: Maciek Cytowski


Wstęp

Unified Parallel C (UPC) to bardzo wygodne w użyciu rozszerzenie języka C służące do programowania równoległego. Oparte jest ono na modelu programowania równoległego o pamięci fizycznie rozproszonej, logicznie współdzielonej (modele programowania równoległago opisane zostały przez Łukasza Bolikowskiego w Biuletynie 3). Podobnie jak CAF dla Fortranu (biblioteka opisana w artykule Michała Łopuszyńskiego z Biuletynu 4), UPC to niewielkie i bardzo wygodne w użyciu narzędzie pozwalające tworzyć wydajne programy.

Pierwszy program w UPC

Nasz pierwszy program wypisywać będzie komunikaty Hello World z każdego procesora (wraz z numerami procesów oraz liczbą tych procesów). Zaprogramowanie takiego zadania w UPC jest bardzo proste:

1:      #include <upc_relaxed.h>
2:      #include <stdio.h>
3:
4:      void main(){
5:              printf("Hello World from THREAD %d (of %d THREADS)\n",MYTHREAD,THREADS);
6:      }

Każdy procesor (tutaj nazywany wątkiem - THREAD) uruchamia równolegle własną kopię powyższego programu. Pierwsza linia kodu, poprzez dołączenie pliku nagłówkowego upc_relaxed.h, specyfikuje sposób korzystania z pamięci. W UPC sposoby obsługi pamięci są dwa:

  • upc_relaxed.h - procesy mogą odczytywać zmienne współdzielone dowolnie w każdej chwili. Korzystanie z tego sposobu jest preferowane

, gdyż umożliwia kompilatorom lepszą optymalizację.

  • upc_strict.h - współdzielone zmienne i dane synchronizowane są za każdym razem przed dostępem do nich. Oznacza to, że jeśli współdzielona zmienna jest aktualnie modyfikowana przez jeden proces, pozostałe procesy będą czekać aż do synchronizacji przed odczytaniem jej wartości.

Dalsza część powyższego programu jest zwykłym kodem języka C. Do wypisania komunikatu używamy funkcji printf. Korzystamy jednak z dwóch zmiennych dostępnych dzięki załączeniu pliku nagłówkowego UPC:

  • THREADS - oznacza liczbę procesów, które uczestniczą w aktualnym uruchomieniu programu
  • MYTHREAD - oznacza numer procesu aktualnie uruchomionego

Dla lepszego wyjaśnienia znaczenia zmiennych THREADS i MYTHREAD prześledźmy następujący przykład:

1:      #include <upc_relaxed.h>
2:      #include <stdio.h>
3:
4:      void main(){
5:              if(MYTHREAD==0){
6:                      printf("Starting execution at THREAD %d\n",MYTHREAD);
7:              }
8:              printf("Hello World from THREAD %d (of %d THREADS)\n",MYTHREAD,THREADS);
9:      }

Program ten jest bardzo podobny do wcześniejszego, z tą różnicą, że warunek zawarty w instrukcji if specyfikuje, iż proces o numerze 0 dodatkowo wywoła funkcję printf wypisując na standardowe wyjście komunikat "Starting execution at THREAD 0".

Równoległe pętle for - upc_forall

W UPC mamy mozliwość implementacji pętli, których kolejne iteracje uruchamiane będą przez różne procesy. Struktura wywołania takiej pętli jest następująca:

upc_forall( wyrażenie; wyrażenie; wyrażenie; wskazanie)

Czwarty parametr pętli upc_forall może być albo liczbą naturalną tłumaczoną na (liczba % THREADS); lub adresem który wskazuje na konkretny proces do którego adres ten jest przypisany. Oto dwa krótkie przykłady użycia upc_forall:

upc_forall(i=0;i<N;i++;i) {
        printf("THREAD %d (of %d THREADS) performing iteration %d\n",MYTHREAD,THREADS,i);
}

Powyższa pętla wypisze numery procesów wraz z liczbą reprezentującą numer iteracji przez te procesy wykonywanej. Iteracja o numerze i będzie wykonywana przez proces o numerze i % THREADS . W drugim przykładzie widzimy, iż proces który ma wykonywać daną iterację może zostać również wskazany przez adres pamięci do niego przydzielony:

1:      #include <upc_relaxed.h>
2:      #include <stdio.h>
3:      #define N 10
4:      shared [2] int arr[10];
5:
6:      int main() {
7:              int i=0;
8:              upc_forall(i=0;i<N;i++;&arr[i]) {
9:                      printf("THREAD %d (of %d THREADS) performing iteration %d\n",MYTHREAD,THREADS,i);
10:             }
11:             return 0;
12:     }

Linijka:

4:      shared [2] int arr[10];

definiuje tablicę liczb typu integer o wymiarze 10. Pamięć ta rozdzielona jest pomiędzy procesy, po 2 elementy tablicy dla każdego procesu cyklicznie. W deklaracji tej tablicy kluczowe jest użycie słówka shared. W dalszej części artykułu można przeczytać o nim trochę więcej. Czwarty parametr pętli upc_forall to adres kolejnych elementów tablicy arr. Adres ten tłumaczony jest na identyfikator procesu któremu dany adres jest przypisany. Wybrany proces realizuje następnie kod przypisany dla danej iteracji. Oznacza to, że iteracja i wykonywana jest przez proces do którego przypisany jest adres &arr[i].

Zmienne współdzielone - wyrażenie shared

Aby zrozumieć wszystkie oznaczenia związane z wyrażeniem shared należy skomentować krótko pomysł, który kryje się za modelem pamięci fizycznie rozproszonej, logicznie współdzielonej. Otóż przestrzeń pamięciowa w UPC dzieli się na prywatną i współdzieloną. Każdy proces ma swoją własną przestrzeń prywatną oraz porcję przestrzeni współdzielonej. Prywatna pamięć obsługiwana jest tak jak w zwykłym języku C. Cała przestrzeń współdzielona podzielona jest na części, z których każda przypisana jest logicznie do przestrzeni pamięciowej jednego z procesów. Widać to na poniższym rysunku:

Pamięć współdzielona i prywatna.
Rys.1. Pamięć współdzielona i prywatna.


W dalszej części będę opisywał przykłady tablic współdzielonych logicznie rozdystrybuowanych w blokach po procesach. Oznacza to tak naprawdę tyle, iż tablica taka jest widziana przez wszystkie procesy, natomiast fizycznie przechowywana jest w pamięci przypisanej do jednego z procesów. Aby zdefiniować współdzieloną pamięć musimy użyć słówka kluczowego shared. Mamy do dyspozycji sporo kombinacji:

1:     int local_counter;                  //prywatna zmienna 
2:     shared int global_counter;          //współdzielona zmienna
3:     shared int array1[N];               //współdzielona tablica
4:     shared [N/THREADS] int array2[N];   //współdzielona tablica
5:     shared [] int array3[N];            //współdzielona tablica
6:     shared int *ptr_a;                  //prywatny wskaźnik do współdzialonej pamięci
7:     shared int *shared ptr_c;           //współdzielony wskaźnik do współdzielonej pamięci

Komentarza wymaga różnica pomiędzy trzema zdefiniowanymi tablicami array1, array2, array3. Zwykle polecenie shared ma następującą formę:

shared [rozmiar_bloku] typ nazwa_zmiennej

Powyższy zapis należy czytać w następujący sposób: zmienna o nazwie nazwa_zmiennej o typie typ jest współdzielona pomiędzy wszystkimi procesami i zostaje rozdystrybuowana cyklicznie pomiędzy wszystkimi procesami w blokach wielkości rozmiar_bloku. Jeśli wielkość bloku nie jest podana wówczas przyjmowana jest wielkość 1. Nieskończoną wielkość bloku oznaczamy []. Na kolejnych trzech szkicach pokazany jest sposób rozdystrybuowania pamięci pomiędzy procesami dla tablic array1, array2, array3.

Rozłożenie elementów tablicy array1 po procesach z rozmiarem bloku równym 1 dla N=9 oraz THREADS=3.
Rys.2. Rozłożenie elementów tablicy array1 po procesach z rozmiarem bloku równym 1 dla N=9 oraz THREADS=3.


Rozłożenie elementów tablicy array2 po procesach z rozmiarem bloku równym N/THREADS dla N=10 oraz THREADS=3.
Rys.3. Rozłożenie elementów tablicy array2 po procesach z rozmiarem bloku równym N/THREADS dla N=10 oraz THREADS=3.


Rozłożenie elementów tablicy array3 po procesach z nieskończonym rozmiarem bloku dla N=10 oraz THREADS=3.
Rys.4. Rozłożenie elementów tablicy array3 po procesach z nieskończonym rozmiarem bloku [] dla N=10 oraz THREADS=3.

Synchronizacja procesów i dostępu do pamięci w UPC

Bariery upc_barrier

Polecenie upc_barrier służy do synchronizacji procesów. Umieszczenie go w kodzie oznacza tak naprawdę postawienie bariery w kodzie, tzn. żaden proces nie ma prawa przekroczyć bariery (linii w kodzie) dopóki wszystkie procesy do niej nie dotrą. Bariery wykorzystywane są najczęściej gdy występuje zależność danych pomiędzy procesami. Oto prosty przykład:

1:      #include <upc_relaxed.h>
2:      #include <stdio.h>
3:
4:      shared int a=0;
5:      int b;
6:
7:      int computation(int temp) {
8:              return temp+5;
9:      }
10:
11:     int main(){
12:             int result=0, i=0;
13:             do {
14:                     if(MYTHREAD==0) {
15:                             result=computation(a);
16:                             a=result*THREADS;
17:                     }
18:                     upc_barrier;
19:                     b=a;
20:                     printf("THREAD %d: b=%d\n",MYTHREAD,b);
21:                     i++;
22:             } while(i<4);
23:             return 0;
24:     }

W linii 16 powyższego kodu procesor o numerze 0 uaktualnia wartość zmiennej a, współdzielonej przez wszystkie procesy. W linii 19 wszystkie procesy dokonują uaktualnienia swojej prywatnej zmiennej b przypisując im aktualną wartość zmiennej a. Zauważmy, że gdybyśmy nie umieścili bariery w linii 18 wówczas nie mielibyśmy gwarancji, że wszystkie prywatne zmienne b zostały uaktualnione najnowszą wartością zmiennej a.

Blokowanie dostępu do zmiennej - upc_lock/upc_unlock

Dzięki użyciu blokad upc_lock/upc_unlock możemy uzyskać gwarancję, że pewna zmienna nie będzie czytana przez proces jeśli jest w danej chwili uaktualniana przez inny proces. Składnia oraz sposób użycia blokad zobrazowany jest w przykładzie w następnej sekcji.

No dobrze, ale jak to wszystko wykorzystać? Prosty przykład

Aby nawiązać do artykułu o CAF zaprezentuję implementację tego samego algorytmu, tzn. algorytmu obliczającego liczbę Pi ze wzoru: Parser nie umiał rozpoznać (Missing texvc executable; please see math/README to configure.): \pi = 4 \int_0^1 \frac{1}{1+x^2}

i całkowania numerycznego metodą prostokątów.

Wersja szeregowa takiego programu wygląda następująco:

//Przyklad szeregowy - calkowanie numeryczne
//Obliczanie liczby Pi
#include<math.h>
#define N 1000000
#define f(x) (1.0/(1.0+x*x))

float pi=0.0;
void main(void)
{
        int i;

        for(i=0;i<N;i++)
                pi+=(float) f( (0.5+i)/(N) );
        pi*=(float)(4.0/N);

        printf("PI=%f\n",pi);
}

Wersja równoległa zaimplementowana przy pomocy UPC wygląda tak:

//Przyklad UPC - calkowanie numeryczne
//Obliczanie liczby Pi
#include<upc_relaxed.h>
#include<math.h>
#define N 1000000
#define f(x) (1.0/(1.0+x*x))

upc_lock_t *l;
shared float pi=0.0;
void main(void)
{
        float local_pi=0.0;
        int i;
        l=upc_all_lock_alloc();

        upc_forall(i=0;i<N;i++;i)
                local_pi+=(float) f( (0.5+i)/(N) );
        local_pi*=(float)(4.0/N);

        upc_lock(l);
        pi+=local_pi;
        upc_unlock(l);

        upc_barrier;
        if(MYTHREAD==0) printf("PI=%f\n",pi);
        if(MYTHREAD==0) upc_lock_free(l);
}

Przykład ten jest bardzo fajny, gdyż widać tutaj zarówno użycie bariery upc_barrier jak i zabezpieczenia upc_lock . Przed równoczesnym dostępem z więcej niż jednego procesora zabezpieczona jest współdzielona zmienna pi.

Dostępność UPC

Wspierane platformy. Jak zdobyć UPC?

UPC jest wspierane przez kompilatory na niektórych komputerach firmy Cray ale również HP, SGI czy Sun. Dostępne są również pewne darmowe implementacje, dokumentacje i przykłady:

UPC w ICM

Z biblioteki UPC można korzystać w ICM na komputerze Cray X1e (tornado). Przy kompilacji powinniśmy dodać opcję -h upc, np:

cc -h upc program_upc.c

Nowa lista TOP500

Autor: Maciek Szpindler

Top500 www.top500.org jest listą najpotężniejszych znanych superkomputerów na świecie. Jest ona publikowana dwa razy do roku w czerwcu i listopadzie, z pomocą ekspertów, producentow oraz społeczności użytkowników superkomputerów. Podstawowym kryterium pozycji na liscie jest wynik wydajności maszyny przy użyciu LINPACK Benchmark.

Aktualna lista

Ostatnia, 26 odsłona listy Top500 miała miejsce w listopadzie podczas konferencji Supercomputing Conference (SC|05) w Seattle. W porównaniu do poprzedniej edycji można zaobserwować znaczące zmiany w pierwszej dziesiątce:

  • tylko sześć komputerów z zeszłorocznej czołówki utrzymało się w pierwszej dziesiątce,
  • w stosunku do poprzedniej edycji z czerwca dwa pierwsze miejsca pozostają nie zmienione,
  • pierwszy na liście, podobnie jak w poprzedniej edycji, IBM BlueGene/L zainstalowany w DOE Lawrence Livermore National Laboratory, został dwukrotnie powiekszony, pobijając rekord wydajności 280.6 TFlop/s,
  • rekordzista z pierwszego miejsca pozostaje jedynym systemem przekraczającym wydajnością 100 TFlop/s,
  • na drugim i trzecim miejscu znajdują się również maszyny zbudowane przez IBM, mieszczące się w Stanach Zjednoczonych,
  • lider pięciu list w poprzednich latach, japoński Earth Simulator, zbudowany przez NEC, znajduje się obecnie na siódmej pozycji,
  • najmocniejszy europejski superkomputer w pierwszej dziesiątce, hiszpański MareNostrum, zbudowany przez IBM, znajdujący się w Barcelonie, zajmuje obecnie ósmą pozycję,
  • dziesiąte miejsce zajmuje drugi w pierwszej dziesiątce komputer zbudowany przez Cray'a, XT3 Jaguar z Oak Ridge National Laboratory z wydajnością 20,53 TFlop/s,
  • IBM BlueGene z pierwszej pozycji posiada obecnie, po powiększeniu, 131072 procesorów.

Pierwsza 10-tka

Pozycja Lokalizacja Komputer Liczba procesorów Max wydajność [TFlops/s] Poprzednia pozycja
1 DOE/NNSA/LLNL

USA

BlueGene/L - eServer Blue Gene

IBM

131072 280,6 1
2 IBM Thomas J. Watson Research Center

USA

BGW - eServer Blue Gene

IBM

40960 91,3 2
3 DOE/NNSA/LLNL

USA

ASC Purple - eServer pSeries p5 575 1.9 GHz

IBM

10240 63,4 -
4 NASA/Ames Research Center/NAS

USA

Columbia - SGI Altix 1.5 GHz

SGI

10160 51,9 3
5 Sandia National Laboratories

USA

Thunderbird - PowerEdge 1850, 3.6 GHz

Dell

8000 38,3 -
6 Sandia National Laboratories

USA

Red Storm Cray XT3, 2.0 GHz

Cray Inc.

10880 36,2 10
7 The Earth Simulator Center

Japonia

Earth-Simulator

NEC

5120 35,9 4
8 Barcelona Supercomputer Center

Hiszpania

MareNostrum - JS20 Cluster, PPC 970, 2.2 GHz

IBM

4800 27,9 5
9 ASTRON/University Groningen

Holandia

Stella - eServer Blue Gene

IBM

12288 27,4 6
10 Oak Ridge National Laboratory

USA

Jaguar - Cray XT3, 2.4 GHz

Cray Inc.

5200 20,6 11

Statystyki

Lista Top500 pozwala na określenie tendencji w rozwoju i zastosowaniach superkomputerów. Oto niektóre trendy (wedlug Top500, na podstawie ostatniej listy):

  • ponad połowa znanych systemów superkomputerowych znajduje się w Stanach zjednoczonych, kolejne na liście państw są: Wielka Brytania (8,2%), Niemcy (4,8%), Japonia (4.2%), Chiny (3,4%), Australia (2,2%), Izrael (1,8%), Francja (1,6%),
  • obecnie głównymi zastosowaniami superkomputerów są obliczenia związane z geofizyką, projektowaniem półprzewodników, finansami, prognozowaniem pogody, telekomunikacją, bazami danych.
  • najpopularniejsze architektury to:
    • 72% - klastry, 48% ogólnej wydajności,
    • 20% - systemy masywnie równoległe (MPP), 48,5% ogólnej wydajności,
    • 7% - konstelacje, 3,4% ogólnej wydajności,
  • głównymi odbiorcami są przemysł (53%), badania (24%), zastosowania akademickie (14%),
  • głównymi dostawcami są:
    • IBM (44%),
    • HP (34%),
    • Cray Inc. (3,6%),
    • SGI (3,6%),
    • Dell (3,4%),
  • najpopularniejsze obecnie architetury procesorów, to: Intel IA32 (41%), Intel EM64T (16%), Power (14%), AMD x86_64 (11%), Intel IA64 (9%), PA-RISC (3,4%), Cray (1,6%).
  • zdecydowanie najwięcej jest systemów posiadających 513 - 1024 procesorów (50%), około 25% to systemy o mniejszej ich liczbie.

Jak powstaje lista

Miejsce superkomputera na liście jest wyznaczane według jego maksymalnej wydajności w teście LINPACK. Dla równych wartości tego współczynnika brana jest pod uwagę teoretyczna wydajność systemów. Dla identycznych systemów brany jest pod uwagę rozmiar pamięci, a następnie kolejność alfabetyczna. W celu weryfikacji zgłaszanych danych, zostaje wybrana losowa próbka maszyn z listy i poddana bezpośrednim testom przez przygotowujących listę Top500.

Linpack Benchmark

LINPACK Benchmark jest testem wydajności komputera polegającym na rozwiązywaniu odpowiednio dużego układu równań liniowych z gęstą macierzą. Stosowany test pozwala na skalowanie rozmiaru problemu i optymalizację dla potrzeb konkretnej maszyny. Rozmiar N zadania, wyniki wydajności dla rozmiaru N i N/2 oraz maksymalna teoretyczna wydajność dają maszynie konkretną pozycję na liście.

Dodatkowe informacje

Następna edycja listy Top500 zostanie ogoszona podczas konferencji 21st International Supercomputer Conference w Dresden.