Interfejs MPI. Maciej Kasperski, Rafał Kozik. 16 kwietnia 2008
|
|
- Elżbieta Łukasik
- 7 lat temu
- Przeglądów:
Transkrypt
1 16 kwietnia 2008
2 Wprowadzenie Co to jest MPI? Plan prezentacji: co to jest MPI? komunikatory i grupy procesów; przesyłanie komunikatów; komunikacja kolektywna; wirtualne topologie;.
3 Co to jest MPI? Wstęp MPI (Message Passing Interface) jest standardem interfejsu do przesyłania komunikatów w rzeczywistych i wirtualnych maszynach równoległych z pamięcią lokalną. Został opracowany przez MPI Forum grupę badaczy z USA i Europy. Z punktu widzenia programisty jest to biblioteka dla C, C++ i Fortrana służąca do wysyłania i odbierania komunikatów oraz do synchronizacji zadań, które najczęściej wykonują ten sam program. Istnieje wiele implementacji MPI na różne platformy, np. Open MPI, MPICH.
4 Wstęp Co to jest MPI? Wstęp Standard MPI nie podaje, jak mają być uruchamiane procesy równoległe. W standardzie MPI 1.1, który tutaj opisujemy, brakuje mechanizmów tworzenia nowych procesów. Sposób określenia jakie zasoby będą używane oraz podanie liczby procesów zależy od konkretnej implementacji. Najczęściej program uruchamia się w taki sposób: mpirun [-v] -c <liczba_kopii_procesów> <nazwa_pliku_programu> -v jest opcją związaną z podawaniem raportów na temat wykonywanych operacji
5 Wstęp Inicjacja biblioteki MPI: int MPI_Init(int *argc, char **argv[]) Argumentami są parametry funkcji main. Funkcja ta może zmienić te argumenty, interpretując argumenty przekazane do biblioteki MPI i pozostawiając argumenty przeznaczone dla procesu. Koniec pracy z MPI int MPI_Finalize(void) Większość funkcji z MPI zwraca MPI SUCCESS w przypadku pomyślnego wywołania funkcji.
6 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Podstawowym pojęciem MPI jest komunikator. Najprostsza definicja to grupa procesów plus pewien kontekst. Komunikat wysłany z danym kontekstem może być tylko odebrany przy użyciu tego samego kontekstu (czyli przez dany komunikator). Kontekst przechowuje też pewne argumenty nadane przez aplikację, które mogą być w dowolnej chwili odczytywane.
7 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Komunikatory są identyfikowane przez uchwyty o typie MPI Comm. Po uruchomieniu MPI powstaje komunikator MPI COMM WORLD, który obejmuje wszystkie procesy. Można też pobrać kontekst procesu z uchwytu MPI COMM SELF. Jeśli jakaś funkcja zwracająca komunikator zakończy się niepowodzeniem (np. jakiś komunikator nie istnieje), to zwraca niedozwolony uchwyt MPI COMM NULL.
8 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Grupa procesów jest zbiorem procesów. Każdy proces posiada swój indeks. Indeksy są ciągłe i należą do zakresu od 0 do liczby procesów pomniejszonej o 1. Grupy są identyfikowane przez uchwyty o typie MPI Group. Istnieje jedna predefiniowana grupa o uchwycie MPI GROUP EMPTY, która nie zawiera żadnego procesu. Jeżeli jakaś funkcja MPI nie może utworzyć grupy, zwraca wtedy uchwyt MPI GROUP NULL.
9 Operacje na grupach Co to jest MPI? Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Utworzenie kopii grupy: int MPI_Comm_group(MPI_Comm comm, MPI_Group *group) Ilość procesów w istniejącej grupie: int MPI_Group_size(MPI_Group, int *size) Indeks procesu (jeżeli wywołane z procesu grupy group, w przeciwnym wypadku MPI UNDEFINED): int MPI_Group_rank(MPI_Group group, int *rank) Zwolnienie grupy, dodatkowo pod group zostaje wpisane MPI GROUP NULL: int MPI_Group_free(MPI_Group *group)
10 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Suma mnogościowa, przecięcie i różnica to odpowiednio: int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup) Kolejność w nowej grupie jest taka jak w group1, a następnie z group2. Można też stworzyć grupę z wybranych procesów: int MPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group *newgroup)
11 Operacje na komunikatorach Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Pobranie liczby procesów w komunikatorze comm: int MPI_Comm_size(MPI_Comm comm, int *size) Funkcja pobierająca identyfikator wywołującego ją procesu to: int MPI_Comm_rank(MPI_Comm comm, int *rank) Te funkcje są równoznaczne z użyciem MPI Comm group, uzyskaniu danych za pomocą MPI Group size lub MPI Group rank i na koniec użycie MPI Group free.
12 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Wszystkie operacje na grupach były lokalne, tak samo wymienione dotychczas operacje na komunikatorach do ich działania nie jest potrzebna żadna komunikacja między procesami. Mogą być wykonywane niezależnie w różnych procesach, niektóre procesy mogą ich też nie używać wcale. Teraz zostaną podane funkcje kolektywne, które muszą być wykonane we wszystkich procesach komunikatora comm, będącego pierwszym argumentem funkcji. int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm) Tworzy kopię komunikatora, która zawiera te same procesy w tej samej kolejności, ale ma nowy kontekst. int MPI_Comm_free(MPI_Comm *comm) Zwalnia komunikator (zewnętrzny lub wewnętrzny, o tym za chwilę).
13 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Tworzenie nowego komunikatora: int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) Grupa group powinna być identyczna (mieć te same procesy w tej samej kolejności) we wszystkich wywołujących ją kolektywnie procesach i powinna być podgupą grupy komunikatora comm. Funkcja powinna być wywołana na wszystkich procesach komunikatora comm, nawet na tych, które nie należą do group. Nowo utworzony komunikator nie dziedziczy atrybutów po comm. int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) Dzieli komunikator na tyle komunikatorów ile jest różnych wartości color. Kolejność zdefiniowana jest za pomocą key. Wartość color może być równa MPI UNDEFINED, co powoduje, że proces nie jest włączany do żadnego z komunikatorów.
14 Komunikatory zewnętrzne Co to jest MPI? Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Komunikatory zewnętrzne są używane do przesyłania komunikatów między procesami należącymi do różnych grup. Cechą takiego komunikatora jest to, że zawiera dwie rozłączne grupy procesów. Pierwsza zawierająca proces wywołujący daną funkcją jest nazywana grupą lokalną, druga grupą zdalną. Nie wszystkie funkcje mogą używać komunikatorów zewnętrznych, przeważnie nie mogą być one używane przez funkcje kolektywne. O tym, czy komunikator jest wewnętrzny czy zewnętrzny, informuje funkcja lokalna: int MPI_Comm_test_inter(MPI_Comm comm, int *result) Pod adresem result zostaje wpisane true jeśli komunikator comm jest zewnętrzny, false w przeciwnym wypadku.
15 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Funkcje lokalne MPI Comm size, MPI Comm rank i MPI Comm group zwracają parametry lub kopię lokalnej grupy. Do uzyskania parametrów lub kopii grupy zdalnej służą funkcje lokalne MPI Comm remote size i MPI Comm remote group. Nie istnieje odpowiednik MPI Comm rank, co jest oczywiste ze względu na to, że grupa lokalna i zdalna są rozłączne. Komunikator zewnętrzny można zamienić na wewnętrzny za pomocą funkcji int MPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm) Wartość high w jednej z grup powinny być równe true, a w drugiej false. Spowoduje to, że procesy grupy, w której podano false, będą miały niższe indeksy.
16 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Do tworzenia komunikatorów zewnętrznych służy funkcja kolektywna int MPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm, int remote_leader, int tag, MPI_Comm *newintercomm) Funkcja ta jest wywoływana przez członków grupy zdalnej i lokalnej. Jako argument local comm procesy podają uchwyt komunikatora, którego grupa jest grupą lokalną dla wołającego procesu. Uchwyt do utworzonego komunikatora jest umieszczany pod adresem newintercomm. Pozostałe argumenty są używane tylko w procesie tworzenia komunikatora i nie mają wpływu na jego późniejsze własności.
17 Operacje na grupach Operacje na komunikatorach Komunikatory zewnętrzne Obie grupy muszą mieć wyróżnionego członka, zwanego liderem. Lider lokalnej grupy wołającego procesu jest podawany jako argument local leader, a lider drugiej grupy jako remote leader. Dodatkowo musi istnieć komunikator wewnętrzny zawierający procesy obu grup (może zawierać też inne procesy), podawany jako argument peer comm. Najczęściej podaje się tu uchwyt MPI COMM WORLD lub jego kopię. Argument tag określa etykietę nadawaną komunikatom podczas tworzenia komunikatora. Nie może ona kolidować z żadną z etykiet komunikatorów, które nie zostały jeszcze odebrane w komunikatorze peer comm. Dlatego warto jako argumentu peer comm użyć kopii komunikatora MPI COMM WORLD. Argumenty peer comm i remote leader są ważne tylko dla dwóch procesów będących liderami obu grup. W pozostałych przypadkach są ignorowane.
18 Co to jest MPI? Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Komunikacja między dwoma procesami może być realizowana kilkoma sposobami. Zasadniczo MPI rozróżnia rodzaje komunikacji ze względu na: synchronizację wzajemną: komunikacja synchroniczna nadawca czeka na gotowość odbiorcy i kończy wysyłanie jak odbiorca potwierdzi odbiór; komunikacja asynchroniczna nadawca wysyła komunikat i nie oczekuje na potwierdzenie odbioru. warunek powrotu z funkcji wysyłanie/odbieranie: komunikacja blokująca powrót z funkcji wysyłanie/odbieranie następuje po zakończeniu operacji; komunikacja nieblokująca - powrót z funkcji wysyłanie/odbieranie nastepuje natychmiast. W MPI możliwe są różne kombinacje trybów wysyłania i odbierania.
19 Wysyłanie Co to jest MPI? Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Do blokującego wysyłania komunikatów służą funkcje: int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) int MPI_BSend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) int MPI_SSend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) Wysyłają one count danych typu datatype umieszczonych pod adresem buf do procesu o identyfikatorze dest w komunikatorze comm. Jeśli komunikator jest wewnętrzny to nadawca i odbiorca muszą należeć do jego grupy, a jeśli jest zewnętrzny, to nadawca musi należeć do jednej z grup, a odbiorca do drugiej. Argument tag określa etykietę nadawaną komunikatowi. Wartość ta powinna być z zakresu od 0 do MPI TAG UB.
20 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Możliwe wartości argumentu datatype i odpowiadające im typy języka C: Wartość argumentu datatype Typ języka C MPI CHAR signed char MPI SHORT signed short int MPI INT signed int MPI LONG signed long int MPI UNSIGNED CHAR unsigned char MPI UNSIGNED SHORT unsigned short int MPI UNSIGNED unsigned int MPI UNSIGNED LONG unsigned long int MPI FLOAT float MPI DOUBLE double MPI LONG DOUBLE long double MPI BYTE MPI PACKED
21 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych O tym czy komunikat został wysłany w sposób synchroniczny czy asynchroniczny, decydują przedrostki w nazwach funkcji. Domyślnie używane jest wysyłanie asynchroniczne (MPI Send). Dodatkowo, można realizować wysyłanie asynchroniczne w trybie buforowanym (MPI Bsend), w którym nadawcy przydzielany jest odpowiednio duży bufor na wysyłane dane i jej wywołanie poprzedzają funkcje przydziału bufora. Wysyłanie można też realizować synchronicznie (MPI Ssend). Przy implementacji sieciowej MPI, dane są przed wysłaniem przekształcane do wspólnej reprezentacji. Po odebraniu dane są przekształcane do reprezentacji lokalnego komputera. Typ MPI BYTE oznacza, że dane nie będą przekształcane. Typ MPI PACKED oznacza, że dane są przekształcane przy pakowaniu/rozpakowywaniu danych z/do bufora.
22 Odbiór Co to jest MPI? Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Do blokującego odczytu danych służy funkcja: int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) niezależnie od trybu przesyłania komunikatu (synchronicznie czy asynchronicznie). Funkcja czeka na wysłanie przez proces o identyfikatorze source z komunikatora comm komunikatu z etykietą tag. Wartości datatype muszą być identyczne w funkcjach wysyłania i odbierania. Argument count może być większy niż w funkcji wysyłającej komunikat.
23 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych W przypadku komunikatora zewnętrznego argument source musi być identyfikatorem procesu w zdalnej grupie. Argument source może też mieć wartość MPI ANY SOURCE, oznaczającą chęć odbierania komunikatu od dowolnego nadawcy. Podobnie argument tag może mieć wartość MPI ANY TAG oznaczający odczyt komunikatów o dowolnej etykiecie. Argument status wskazuje na strukturę, która zostanie przez funkcje wypełniona. Ma ona trzy pola MPI SOURCE, MPI TAG i MPI ERROR (odpowiednio identyfikator nadawcy, etykieta i komunikat błędu). MPI ERROR będzie wpisane tylko wtedy, gdy funkcja zwróci MPI ERR IN STATUS. Możemy też poznać ilość odebranych danych: int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int* count)
24 Przydzielanie buforów Co to jest MPI? Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Do przesyłania komunikatów w trybie buforowanym w procesach wysyłających komunikat musi zostać utworzony bufor. Służy do tego funkcja: int MPI_Buffer_attach(void *buf, int size) Argument buf powinien wskazywać na obszar pamięci o rozmiarze przynajmniej size bajtów. Biblioteka będzie używać go przy przesyłaniu komunikatów w trybie buforowanym. Aby odzyskać pamięć przydzieloną na bufory, powinniśmy użyć funkcji: int MPI_Buffer_detach(void **buff, int *size) która dodatkowo pod adres buff wpisuje adres poprzedniego bufora, a pod adres size jego rozmiar.
25 Funkcje nieblokujące Co to jest MPI? Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Funkcje wysyłające i odbierające dane w sposób nieblokujący różnią się od wersji blokujących dodatkowym przedrostkiem I (np. MPI Isend, MPI Irecv) i posiadają jeden dodatkowy parametr MPI Request *request. Można czekać na zakończenie operacji wywołując funkcję int MPI_Wait(MPI_Request *request, MPI_Status *status) Dodatkowo pod adresem status wpisuje status zakończonej operacji. Przy wyjściu funkcja wpisuje pod adresem request wartość MPI REQUEST NULL.
26 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Jeżeli chcemy tylko sprawdzić czy operacja się zakończyła możemy użyć: int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status) Pod adresem flag zostanie zapisana wartość true jeżeli operacja się już skończyła lub false w przeciwnym przypadku. Jeżeli funkcje MPI Wait i MPI Test sygnalizują zakończenie operacji, zasoby zajmowane przez operację są zwalniane. Jeżeli operacja się nie skończyła, do zwolnienia zasobów można użyć funkcji. int MPI_Request_free(MPI_Request *request)
27 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych W niektórych przypadkach bardzo użyteczna jest funkcja: int MPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status *status) czekająca na zakończenie jakiejkolwiek z count operacji o uchwytach przekazanych w tablicy requests. Indeks zakończonej operacji i jej status są zapisywane odpowiednio pod adresami index i status. Pod indeksem zakończonej operacji w requests zostanie wpisane MPI REQUEST NULL.
28 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Operację nieblokującą można anulować, służy do tego funkcja int MPI_Cancel(MPI_Request *request) Anulowanie operacji nie jest równoznaczne ze zwolnieniem przez nią wszystkich zasobów. Zwykle należy wywołać jeszcze funkcje MPI Request free.
29 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych W niektórych przypadkach (np. przy przesyłaniu tekstu) przed odebraniem komunikatu nie jest znana jego długość. Nie wiadomo wówczas, jaka powinna być wartość argumentu count, przekazywanego do funkcji odbierającej komunikat i jak duży powinien być bufor na dane. Informacje o długości można uzyskać wywołując funkcję: int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status) Działa ona podobnie jak funkcja MPI Recv, z tym, że nie pobiera komunikatu, a jedynie jego parametry. Komunikat zostaje i po alokacji buforów może być pobrany bez czekania za pomocą funkcji MPI Recv. Istnieje też nieblokująca wersja funkcji MPI Probe MPI Iprobe, która działa jak MPI Irecv, z tym, że nie pobiera komunikatu, a jedynie informacje o nim.
30 Typy pochodne i pakowanie danych Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Opisane dotychczas operacje umożliwiały przesyłanie komunikatu zawierającego wektor danych jednakowego typu, umieszczony w ciągłym obszarze pamięci. W pozostałych przypadkach należy uzyć typów pochodnych lub pakowania danych. Użycie typów pochodnych polega na zdefiniowaniu za pomocą specjalnych funkcji nowego typu, a następnie użycie go jako argumentu datatype w odpowiednich funkcjach. Raz zdefiniowany typ można używać wielokrotnie do przesyłania różnych danych lub do definiowania kolejnych typów pochodnych. Typ będący tablicą innych typów definiuje się za pomocą funkcji: int MPI_Type_contiguous(int cout, MPI_Datatype oldtype, MPI_Datatype *newtype)
31 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Ogólniejszą wersją tej funkcji jest funkcja: int MPI_Type_vector(int count, int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype) Definiuje ona typ składający się z count bloków zawierających blocklength elementów typu oldtype każdy. Między początkami bloków występują odstępy o długości stride elementów oldtype. Do funkcji MPI Type vector podobna jest funkcja MPI Type hvector. Jedyną różnicą jest to, iż argument stride określa przesunięcia w bajtach, a nie w długościach elementu oldtype.
32 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Najogólniejszą z funkcji definiujących typ jest funkcja: int MPI_Type_struct(int count, int *array_of_blocklengths, MPI_Aint *array_of_displacements, MPI_Datatype *array_of_types, MPI_Datatype *newtype) Definiuje ona typ składający się z count bloków, każdy o innym typie i długości (wyrażone liczbą elementów składowych). Elementy tablicy array of displacements określają przesunięcia poszczególnych bloków względem wspólnego początku.
33 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Po zdefiniowaniu nowego typu należy go skompilować za pomocą funkcji: int MPI_Type_commit(MPI_Datatype *type) Kompilacja jest wymagana przed użyciem go przy wysyłaniu lub odbieraniu komunikatu, nie jest jednak wymagana podczas definiowania kolejnych typów pochodnych. Po zakończeniu używania typu należy zwolnić wykorzystywane przez niego zasoby, wywołując funkcje: int MPI_Type_free(MPI_Datatype *type) Funkcja ta nie wpływa na jeszcze aktywne operacje, jak również nie niszczy typów pochodnych.
34 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Typy pochodne są konstrukcją statyczną i nie mogą się zmieniać w zależności od przesyłanych danych. Przykładem struktur danych, których nie można w ten sposób zdefiniować są unie o wariancie określonym przez przesyłane dane albo listy. Do przesyłania bardziej złożonych konstrukcji wykorzystuje się pakowanie. Pakowanie polega na umieszczeniu danych w pomocniczym buforze, a następnie wywołaniu funkcji wysyłającej komunikat.
35 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Do pakowania służy funkcja: int MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, int outsize, int *outposition, MPI_Comm comm) Kopiuje ona incount danych typu datatype (może to być typ prosty lub pochodny) umieszczonych pod adresem inbuf do bufora o początku outbuff i rozmiarze outsize. Ponieważ w buforze mogą się już znajdować dane, zmienna wskazywana przez outposition powinna określać ile bajtów tego bufora jest już używanych. Po przekopiowaniu danych do bufora funkcja modyfikuje tę zmienną.
36 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Przed wykonaniem pakowania wymagany rozmiar bufora nie jest z góry znany. Można go poznać wywołując funkcję: int MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size) Pod adresem size umieści ona rozmiar bufora wymagany do spakowania incount danych typu datatype. Po spakowaniu danych można je wysłać, a następnie odebrać jako typ MPI PACKED. Należy podać liczbę danych równą rozmiarowi bufora.
37 Wysyłanie Odbiór Przydzielanie buforów Funkcje nieblokujące Typy pochodne i pakowanie danych Przy odbiorze spakowanego komunikatu zazwyczaj nie znamy jego długości informacje o tym podaje funkcja MPI Probe. Odebrany komunikat trzeba rozpakować. Używa się do tego funkcji: int MPI_Unpack(void *inbuff, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm) Pobiera ona outcount danych typu datatype i umieszcza je pod adresem outbuf. Dane są pobierane z bufora o początku inbuf i rozmiarze insize. Część danych z bufora inbuf została już wcześniej pobrana. Liczbę tę określa zmienna wskazywana przez position. Po wykonaniu funkcji zostanie ona zmodyfikowana, by uwzględnić właśnie odczytane dane. Pakowanie umożliwia przesyłanie bardziej złożonych struktur bez definiowania nowych typów. Wadą tego rozwiązania jest to, że dane muszą zostać przekopiowane do bufora podczas wysyłania i kopiowane z bufora podczas odbioru.
38 Co to jest MPI? Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Opisane wcześniej funkcje przesyłały komunikat od jednego procesu do drugiego procesu. Zarówno nadawcą jak i odbiorcą komunikatu był dokładnie jeden proces. Za pomocą MPI można przesyłać komunikaty między więcej niż dwoma procesami. Dostępne są następujące mechanizmy: synchronizacja za pomocą bariery; wysyłanie komunikatów do grupy procesów; zbieranie danych od grupy procesów; rozsyłanie danych między członków grupy procesów; operacje redukcji.
39 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie We wszystkich tych przypadkach komunikacja zachodzi między wyróżnionym procesem grupy (zwanym dalej liderem), a pozostałymi członkami grupy. Grupę określa się podając jej komunikator (musi być to komunikator wewnętrzny). W celu uniknięcia kolizji z komunikatami, które nie zostały jeszcze odebrane, opisane za chwilę funkcje tworzą kopię podanego komunikatora i jej używają. Wszystkie omawiane mechanizmy wymagają kolektywnej współpracy wszystkich procesów w grupie.
40 Synchronizacja za pomocą bariery Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie int MPI_Barrier(MPI_Comm comm) Funkcja realizuje operację bariery. Każdy z wywołujących ją procesów oczekuje, aż wywołają ją wszystkie procesy w grupie komunikatora comm i wtedy funkcja ta wszędzie skończy działanie.
41 Wysyłanie komunikatu do grupy procesów Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie int MPI_Bcast(void *buffer, int count, MPI_Datatype, int root, MPI_Comm comm) Funkcja realizuje rozsyłanie komunikatu od procesu root do pozostałych członków grupy komunikatora comm. Funkcja wysyła dane w procesie root, a w pozostałych procesach odbiera je. Rozsyłanych jest count danych typu datatype umieszczonych pod adresem buffer w procesie root. W pozostałych procesach grupy argument buffer pokazuje miejsce, gdzie odebrane dane zostaną umieszczone.
42 Zbieranie danych od grupy procesów Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Operację zbierania danych od grupy procesów realizuje funkcja : iny MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Każdy proces komunikatora (łącznie z liderem) wysyła identyczną liczbę danych sendcount umieszczonych w buforze sendbuf. Proces lidera o identyfikatorze root odbiera od każdego z nich recvcount danych typu recvtype, łączy je w kolejności identyfikatorów nadawców i umieszcza pod adresem recvbuf. Argumenty recvcount, recvbuf i recvtype są ważne tylko dla procesu o identyfikatorze root.
43 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Ogólniejszym wariantem funkcji MPI Gather jest funkcja: int MPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm) Umożliwia ona każdemu procesowi z grupy przesłanie innej liczby danych. Typy muszą być takie same. Proces root w wektorze recvcounts podaje liczbę danych wysłanych przez poszczególne procesy, a w displs miejsca gdzie należy umieścić dane od poszczególnych procesów (przesunięcia względem adresu recvbuf wyrażone rozmiarami typu recvtype). Istnieją też funkcje MPI Allgather i MPI Allgatherv różniące się od MPI Gather i MPI Gatherv tym, iż wszystkie procesy, a nie tylko lider, otrzymują wynikowy wektor. Funkcje te nie mają argumentu root.
44 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Rozsyłanie danych między członków grupy procesów Operację odwrotną do MPI Gather realizuje funkcja: int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Po wywołaniu jej przez wszystkie procesy komunikatora comm, proces root dzieli wektor o adresie sendbuf na podwektory o rozmiarze sendcount i wysyła je do poszczególnych procesów w grupie (także do siebie). Każdy z procesów odbiera swój kawałek o rozmiarze recvcount elementów typu recvtype i umieszcza go pod adresem recvbuf. Rozmiary wszystkich kawałków muszą być identyczne.
45 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Również funkcja MPI Scatter ma odpowiednik, umożliwiający rozsyłanie podwektorów o różnych długościach. Realizuje to funkcja: int MPI_Scaterv(void *senbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Zakłada się w niej, że liczba elementów sendtype, rozsyłanych do poszczególnych procesów, jest umieszczona w tablicy sendcounts oraz, że tablica displs zawiera położenia poszczególnych kawałków względem adresu sendbuf wyrażone w długościach typu sendtype.
46 Operacje redukcji Co to jest MPI? Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Operację redukcji wykonuje funkcja: int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) Każdy z procesów przekazuje funkcji count danych typu datatype w buforze sendbuf. Na tych danych jest wykonywana operacja określona przez argument op. Wyniki są umieszczane w buforze recvbuf procesu root o długości count elementów typu datatype. Operacje wykonywane są niezależnie dla każdej danej w buforze.
47 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Przykładowo, jeśli typem operacji jest maksimum, to i-tą daną bufora recvbuf będzie maksimum po wszystkich procesach z i-tej danej buforów sendbuf. Typ danych datatype musi pasować do operacji op. Dozwolone wartości argumentu op i ich znaczenie podano w tabeli na kolejnych slajdach. Operacje MPI MAXLOC i MPI MINLOC oczekują elementów będących parami, zawierającymi porównywalną daną i indeks. Wynikiem operacji na sekwencji takich par jest para zawierająca wartość maksymalną (lub minimalną) i indeks odpowiadający pierwszej takiej wartości w sekwencji.
48 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Wartość argumentu Dozwolony typ Znaczenie op MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, MPI MAX MPI UNSIGNED SHORT, MPI UNSIGNED LONG, Maksimum MPI FLOAT, MPI DOUBLE, MPI LONG DOUBLE MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, MPI MIN MPI UNSIGNED SHORT, MPI UNSIGNED LONG, Minimum MPI FLOAT, MPI DOUBLE, MPI LONG DOUBLE MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, MPI SUM MPI UNSIGNED SHORT, MPI UNSIGNED LONG, Suma MPI FLOAT, MPI DOUBLE, MPI LONG DOUBLE MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, MPI PROD MPI UNSIGNED SHORT, MPI UNSIGNED LONG, Iloczyn MPI FLOAT, MPI DOUBLE, MPI LONG DOUBLE
49 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Wartość argumentu Dozwolony typ Znaczenie op MPI LAND MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, Logiczne AND MPI UNSIGNED SHORT, MPI UNSIGNED LONG, MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, Binarne AND MPI BAND MPI UNSIGNED SHORT, MPI UNSIGNED LONG, (po bitach) MPI BYTE MPI LOR MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, Logiczne OR MPI UNSIGNED SHORT, MPI UNSIGNED LONG, MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, Binarne OR MPI BOR MPI UNSIGNED SHORT, MPI UNSIGNED LONG, (po bitach) MPI BYTE MPI LXOR MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, Logiczne XOR MPI UNSIGNED SHORT, MPI UNSIGNED LONG, MPI INT, MPI SHORT, MPI LONG, MPI UNSIGNED, Binarne XOR MPI BXOR MPI UNSIGNED SHORT, MPI UNSIGNED LONG, (po bitach) MPI BYTE
50 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Wartość argumentu Dozwolony typ Znaczenie op MPI INT, MPI DOUBLE INT Maksimum MPI MAXLOC MPI LONG DOUBLE INT, INT, razem z pozycją MPI SHORT INT, MPI LONG INT MPI INT, MPI DOUBLE INT Minimum MPI MINLOC MPI LONG DOUBLE INT, INT, razem z pozycją MPI SHORT INT, MPI LONG INT
51 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Operacje mogą być także zdefiniowane przez użytkownika, służy do tego funkcja: int MPI_Op_create(MPI_User_function *function, int commute, MPI_Op *op) Argument commute określa czy funkcja jest przemienna (true lub false). Jeśli nie, to operacja będzie wykonywana w kolejności określonej identyfikatorami procesów. Uchwyt do zdefiniowanej operacji jest umieszczany pod adresem op. Po wykorzystaniu zdefiniowanej operacji należy zwolnić zasoby zajmowane przez definicję za pomocą funkcji: int MPI_Op_free(MPI_Op *op) Funkcja ta dodatkowo pod adresem op wpisze wartość MPI OP NULL.
52 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Argument function powinien wskazywać na funkcję o prototypie: void function (void* invect, void* inoutvect, int *len, MPI_Datatype *datatype) wykonującą operację na parze wektorów przekazywanych przez invect i inoutvect, liczbie elementów wskazywanej przez len, o typie umieszczonym pod adresem datatype. Wynik operacji jest umieszczony pod adresem inoutvect.
53 Wirtualne topologie Co to jest MPI? Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Grupy procesów nadają swoim członkom indeksy od zera do liczby procesów pomniejszonej o jeden. W niektórych przypadkach nie odpowiada to topologii używanej przez algorytm. Identyfikowanie procesów za pomocą kolejnych numerów nie jest zbyt wygodnie przy obliczeniach numerycznych związanych zwykle z siatkami liczb w R n. Wiele algorytmów tak traktuje procesy, jakby były one umieszczone w węzłach siatki wielowymiarowej. Bardziej ogólnie, topologia algorytmu może być wyrażona przez graf. Węzły grafu odpowiadają procesom, a łuki drogom komunikacji. W MPI można korzystać z programów i adresowania w przestrzeni wirtualnej, którą sami określimy.
54 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Topologia jest przyporządkowywana komunikatorom. Funkcje tworzące nowe topologie wśród argumentów oczekują komunikatora. Tworzą one nowy komunikator o takiej samej grupie procesów i związują z nim daną topologię. Utworzony komunikator zwracają. Funkcje tworzące topologie są kolektywne dla wszystkich procesów w grupie.
55 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Najprostszą topologią algorytmu jest topologia kartezjańska. Tworzy ją funkcja: int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods, int reorder, MPI_Comm *comm_chart) Argument oldcomm określa kopiowany komunikator. Liczbę wymiarów podaje argument ndims, a tablica dims określa rozmiary poszczególnych wymiarów. Jeśli reorder jest równe false, to indeksy poszczególnych procesów w utworzonym komunikatorze są takie same, jak w komunikatorze oldcomm, w przeciwnym razie, mogą być inne w celu dopasowania topologii wirtualnej do fizycznej topologii maszyny. Tablica periods określa czy poszczególne wymiary są cykliczne. Uchwyt do utworzonego komunikatora jest zapisywany pod adresem comm cart. Jeśli liczba procesów w komunikatorze oldcom jest większa niż wynikająca z rozmiarów dims, to utworzony komunikator ma mniej procesów, a w nadmiarowych procesach jest wpisywane MPI COMM NULL pod adresem comm cart.
56 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Ogólną topologię, określoną przez graf, tworzy funkcja: int MPI_Graph_create(MPI_Comm comm, int nnodes, int *index, int *edges, int reorder, MPI_Comm *comm_graph) Graf jest określony liczbą węzłów i indeksów sąsiadów każdego z węzłów. Indeksy węzłów są kolejnymi liczbami całkowitymi poczynając od zera. Liczbę węzłów określa argument nnodes. Indeksy sąsiadów kolejnych węzłów są umieszczone w tablicy edges. Tablica index zawiera sumy liczb sąsiadów danego węzła i węzłów o indeksach niższych. Pozostałe argumenty mają to samo znaczenie jak w funkcji MPI Cart create.
57 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie Podstawową procedurą używaną podczas obliczeń w topologii kartezjańskiej jest wymiana informacji z sąsiadami wzdłuż poszczególnych współrzędnych. int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest) Funkcja oblicza indeks procesu przesuniętego względem procesu wywołującego funkcję o disp węzłów w kierunku direction. Wyznaczony indeks jest umieszczany pod adresem rank dest. Pod adresem rank source jest wpisywany indeks procesu przesuniętego w przeciwnym kierunku. Gdy dojdzie się do brzegu, wpisywana jest wartość MPI PROC NULL.
58 Synchronizacja za pomocą bariery Wysyłanie komunikatu do grupy procesów Zbieranie danych od grupy procesów Rozsyłanie danych między członków grupy procesów Operacje redukcji Wirtualne topologie W przypadku topologii określonej przez graf nie istnieją współrzędne topologii, a jedynie indeksy procesów. Stąd operacją, którą często się wykorzystuje, jest pobieranie indeksów sąsiadów. Realizują to funkcje: int MPI_Graph_neighbors_count(MPI_Comm comm, int rank, int *nneighbors) int MPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int *neighbors) Pierwsza z nich pod adresem nneighbors wpisuje liczbę sąsiadów procesu o indeksie rank, a druga do wektora neighbors indeksy sąsiadów procesu o indeksie rank.
59 Co to jest MPI? Specyfikacja MPI 1.1 została zakończona w maju 1994r. Od tego czasu ujawniło się kilka braków w istniejącej specyfikacji. Wersja 1.2 miała za zadanie dokładniej wyjaśnić zagadnienia, pominięte w poprzedniej wersji i nie wprowadzała żadnych nowych rozszerzeń. W lipcu 1997r. powstała specyfikacja, rozszerzająca MPI m.in. o dynamiczne tworzenie procesów, komunikację jednostronną i operacje na plikach. definiuje 120 nowych funkcji (MPI 1.1 ma 124 funkcje).
60 Co to jest MPI? Wiele funkcji powiela się, realizując te same operacje dla różnych argumentów (np. MPI Scatter i MPI Scatterv). Tym sposobem starano się dostarczyć możliwości wykonywania pewnej operacji z bardzo złożonymi parametrami, jak i udostępniania funkcji prostszej, umożliwiającej wykonanie operacji z parametrami stosowanymi najczęściej. Wiele z funkcji zostało też wprowadzone po to, by umożliwić efektywne stosowanie pewnych mechanizmów sprzętowych. Wśród zalet możemy wymienić efektywność szczególnie na maszynach równoległych z pamięcią lokalną. Wadą jest brak heterogeniczności. Nie można łączyć różnych implementacji, a producenci nie są zainteresowani takim łączeniem. Ponadto nie można łączyć ze sobą aplikacji pisanych w różnych językach programowania.
61 Dziękujemy za uwagę! Referat powstał na podstawie: A. Korbowski, E Niewiadomska-Szynkieicz, Obliczenia równoległe i rozproszone, Oficyna Wydawnicza Politechniki Warszawskiej 2001;
51. Metody komunikacji nieblokującej.
51. Metody komunikacji nieblokującej. Funkcje nieblokujace różnia sie od wersji blokujacych przedrostkiem I (immediate) w nazwie oraz jednym dodatkowym argumentem: request, który jest używany do sprawdzenia,
Bardziej szczegółowoTryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla
Tryby komunikacji między procesami w standardzie Message Passing Interface Piotr Stasiak 171011 Krzysztof Materla 171065 Wstęp MPI to standard przesyłania wiadomości (komunikatów) pomiędzy procesami programów
Bardziej szczegółowoProgramowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 5 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Dorobiliśmy się strony WWW www.ift.uni.wroc.pl/~koma/pr/index.html MPI, wykład 2. Plan: - komunikacja
Bardziej szczegółowo61 Topologie wirtualne
61 Topologie wirtualne pozwalają opisać dystrybucję procesów w przestrzeni z uwzględnieniem struktury komunikowania się procesów aplikacji między sobą, umożliwiają łatwą odpowiedź na pytanie: kto jest
Bardziej szczegółowoProgramowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu przesyłania komunikatów specyfikacja MPI Krzysztof Banaś Obliczenia równoległe 1 Model przesyłania komunikatów Paradygmat send receive wysyłanie komunikatu: send( cel, identyfikator_komunikatu,
Bardziej szczegółowoOperacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1
Operacje grupowego przesyłania komunikatów Krzysztof Banaś Obliczenia równoległe 1 Operacje grupowego przesyłania komunikatów Operacje, w ramach których ten sam komunikat lub zbiór komunikatów przesyłany
Bardziej szczegółowoProgramowanie Równoległe Wykład 5. MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 5 MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej MPI, wykład 3. Plan: - wirtualne topologie - badanie skalowanie czasu rozwiązania
Bardziej szczegółowoModele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak dla PR PP
Modele programowania równoległego Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak dla PR PP MPP - Cechy charakterystyczne 1 Prywatna, wyłączna przestrzeń adresowa.
Bardziej szczegółowoModele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak
Modele programowania równoległego Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak MPP - Cechy charakterystyczne 1 Prywatna - wyłączna przestrzeń adresowa. Równoległość
Bardziej szczegółowoOperacje grupowego przesyłania komunikatów
Operacje grupowego przesyłania komunikatów 1 Operacje grupowego przesyłania komunikatów Operacje, w ramach których ten sam komunikat lub zbiór komunikatów przesyłany jest pomiędzy więcej niż dwoma procesami
Bardziej szczegółowoProgramowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 4 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Jak używać w MPI? Donald Knuth: We should forget about small efficiencies, say about 97% of
Bardziej szczegółowoJak wygląda praca na klastrze
Jak wygląda praca na klastrze Upraszczając nieco sprawę można powiedzieć, że klaster to dużo niezależnych komputerów (jednostek) połączonych mniej lub bardziej sprawną siecią. Często poszczególne jednostki
Bardziej szczegółowoProgramowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1 MPI dynamiczne zarządzanie procesami MPI 2 umożliwia dynamiczne zarządzanie procesami, choć
Bardziej szczegółowoProgramowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1
Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1 Środowisko przesyłania komunikatów MPI Rodzaje procedur: blokujące nieblokujące Tryby przesyłania
Bardziej szczegółowoJĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Bardziej szczegółowoProgramowanie Równoległe Wykład 6. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe Wykład 6 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Dorobiliśmy się strony WWW Za tydzień 1. wykład z CUDY (Z. Koza) www.ift.uni.wroc.pl/~koma/pr/index.html
Bardziej szczegółowoKlient-Serwer Komunikacja przy pomocy gniazd
II Klient-Serwer Komunikacja przy pomocy gniazd Gniazda pozwalają na efektywną wymianę danych pomiędzy procesami w systemie rozproszonym. Proces klienta Proces serwera gniazdko gniazdko protokół transportu
Bardziej szczegółowoAplikacja Sieciowa wątki po stronie klienta
Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się
Bardziej szczegółowoProgramowanie współbieżne Wykład 12 MPI c.d. Rafał Skinderowicz
Programowanie współbieżne MPI c.d. Rafał Skinderowicz Komunikacja grupowa Poprzednio rozważaliśmy komunikację między parami procesów synchroniczna (blokująca) np. MPI Recv, MPI Send asynchroniczna (nieblokująca)
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowo5. Model komunikujących się procesów, komunikaty
Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć
Bardziej szczegółowoPodstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie
Bardziej szczegółowoKolejne funkcje MPI 1
Kolejne funkcje MPI 1 Przypomnienie: sieci typu mesh (Grama i wsp.) 2 Topologie MPI Standard MPI abstrahuje od topologii systemu wieloprocesorowego. Sposób uruchamiania aplikacji (mpirun) nie jest częścią
Bardziej szczegółowoMessage Passing Interface
Message Passing Interface Interfejs programowania definiujący powiązania z językami C, C++, Fortran Standaryzacja (de facto) i rozszerzenie wcześniejszych rozwiązań dla programowania z przesyłaniem komunikatów
Bardziej szczegółowoObliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz
Obliczenia równoległe i rozproszone Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz 15 czerwca 2001 Spis treści Przedmowa............................................
Bardziej szczegółowoProgramowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz
Programowanie równoległe i rozproszone Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz 23 października 2009 Spis treści Przedmowa...................................................
Bardziej szczegółowoProgramowanie w standardzie MPI
Programowanie w standardzie MPI 1 2 Podstawy programowania z przesyłaniem komunikatów Model systemu równoległego w postaci p procesów, każdy z nich z własną przestrzenią adresową, nie współdzieloną z innymi
Bardziej szczegółowoOperacje kolektywne MPI
Operacje kolektywne MPI 1 Operacje kolektywne Do tej pory w operacje przesyłania komunikatu miały charakter punkt-punkt (najczęściej pomiędzy nadawcą i odbiorcą). W operacjach grupowych udział biorą wszystkie
Bardziej szczegółowoPodstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Bardziej szczegółowoProgramowanie współbieżne... (4) Andrzej Baran 2010/11
Programowanie współbieżne... (4) Andrzej Baran 2010/11 LINK: http://kft.umcs.lublin.pl/baran/prir/index.html Przykład Zaczniemy od znanego już przykładu: Iloczyn skalarny różne modele Programowanie współbieżne...
Bardziej szczegółowoutworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Bardziej szczegółowoJava. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Bardziej szczegółowoJęzyk C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Bardziej szczegółowoIPC: Kolejki komunikatów
IPC: Kolejki komunikatów Systemy Operacyjne 2 laboratorium Mateusz Hołenko 7 listopada 2011 Plan zajęć 1 Mechanizmy IPC kolejki komunikatów pamięć współdzielona semafory 2 Kolejki komunikatów kolejka komunikat
Bardziej szczegółowoInstrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Bardziej szczegółowoWprowadzenie do MPI. Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski http://www.icm.edu.
Wprowadzenie do MPI Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego Uniwersytet Warszawski http://www.icm.edu.pl Maciej Cytowski m.cytowski@icm.edu.pl Maciej Szpindler m.szpindler@icm.edu.pl
Bardziej szczegółowoLab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Bardziej szczegółowoPoniższe funkcje opisane są w 2 i 3 części pomocy systemowej.
Procesy Proces (zwany też zadaniem) jest jednostką aktywną, kontrolowaną przez system operacyjny i związaną z wykonywanym programem. Proces ma przydzielone zasoby typu pamięć (segment kodu, segment danych,
Bardziej szczegółowoWskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to
Bardziej szczegółowoSzablony klas, zastosowanie szablonów w programach
Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do
Bardziej szczegółowoWskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:
Wskaźniki nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny: typ nw; /* definicja zmiennej nw typu typ */ typ *w_nw; /* definicja
Bardziej szczegółowoRPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )
III RPC Zdalne wywoływanie procedur (ang. Remote Procedure Calls ) 1. Koncepcja Aplikacja wywołanie procedury parametry wyniki wykonanie procedury wynik komputer klienta komputer serwera Zaletą takiego
Bardziej szczegółowoArchitektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne
Wykład 4 Architektura sieci połączeń między procesorami, sterowanie komunikacjami, biblioteki komunikacyjne Spis treści: 1. Statyczne sieci połączeń w systemach równoległych 2. Dynamiczne sieci połączeń
Bardziej szczegółowoDziałanie systemu operacyjnego
Budowa systemu komputerowego Działanie systemu operacyjnego Jednostka centralna dysku Szyna systemowa (magistrala danych) drukarki pamięci operacyjnej I NIC sieci Pamięć operacyjna Przerwania Przerwania
Bardziej szczegółowoTemat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Bardziej szczegółowoWeryfikacja oprogramowania, korzystajacego z MPI
Weryfikacja oprogramowania, korzystajacego z MPI Krzysztof Nozderko kn201076@students.mimuw.edu.pl 23 maja 2005 Wprowadzenie Równoległe obliczenia olbiczenia naukowców sa często bardzo kosztowne obliczeniowo
Bardziej szczegółowoznajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Bardziej szczegółowoPodstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Bardziej szczegółowoPodstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Bardziej szczegółowoOpis protokołu RPC. Grzegorz Maj nr indeksu:
Opis protokołu RPC Grzegorz Maj nr indeksu: 236095 1 Streszczenie Niniejszy dokument opisuje specyfikację protokołu RQP (Remote Queues Protocol). W jego skład wchodzą: opis celów protokołu; opis założeń
Bardziej szczegółowoDziałanie systemu operacyjnego
Działanie systemu operacyjnego Budowa systemu komputerowego Jednostka centralna Sterownik dysku Sterownik drukarki Sterownik sieci Szyna systemowa (magistrala danych) Sterownik pamięci operacyjnej Pamięć
Bardziej szczegółowoexternal Data Representation
Remote Procedure Call external Data Representation Opis standardu RFC 1014 Kanoniczna reprezentacja danych oparta na formacie IEEE Deklaratywny język opisu struktur danych (zbliżony do języka C) Koncepcja
Bardziej szczegółowoMETODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Bardziej szczegółowoStrona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
Bardziej szczegółowoProgramowanie w języku C++
Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
Bardziej szczegółowoPROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec
PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty
Bardziej szczegółowoProgramowanie współbieżne Wykład 11 Wprowdzenie do MPI. Rafał Skinderowicz
Programowanie współbieżne Wykład 11 Wprowdzenie do MPI Rafał Skinderowicz Programowanie dla modelu z rozproszoną pamiecią Niezależne strumienie instrukcji wykonywane na (być może) oddalonych fizycznie
Bardziej szczegółowoJęzyk ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Bardziej szczegółowoWywoływanie procedur zdalnych
Mechanizm wywołania Wywoływanie procedur zdalnych main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) int zabij_proces (int pid){ int stat; stat = kill(pid,
Bardziej szczegółowo76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Bardziej szczegółowoZaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++
Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka
Bardziej szczegółowoTworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1 Metodologia programowania równoległego Przykłady podziałów zadania na podzadania: Podział ze względu na funkcje (functional
Bardziej szczegółowoWstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
Bardziej szczegółowoSystem Rozproszone Komunikator Dokumentacja. Maciej Muszkowski Jakub Narloch
System Rozproszone Komunikator Dokumentacja Maciej Muszkowski Jakub Narloch Wymagania Zgodnie ze wstępnymi założeniami komunikator musi, realizowad następujące funkcje: 1. Jest oparty o model Peer2Peer,
Bardziej szczegółowoPodstawy programowania. Podstawy C# Tablice
Podstawy programowania Podstawy C# Tablice Tablica to indeksowany zbiór elementów Tablica jest typem referencyjnym (deklaracja tworzy tylko referencję, sama tablica musi być utworzona oddzielnie, najprościej
Bardziej szczegółowoJęzyk C, tablice i funkcje (laboratorium, EE1-DI)
Język C, tablice i funkcje (laboratorium, EE1-DI) Opracował: Tomasz Mączka (tmaczka@kia.prz.edu.pl) Wstęp (tablice) Tablica to uporządkowany ciąg elementów tego samego typu, zajmujących ciągły obszar pamięci.
Bardziej szczegółowoRozszerzenia MPI-2 1
Rozszerzenia MPI-2 1 2 Dynamiczne tworzenie procesów Aplikacja MPI 1 jest statyczna z natury Liczba procesów określana jest przy starcie aplikacji i się nie zmienia. Gwarantuje to szybką komunikację procesów.
Bardziej szczegółowoProgramowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,
Bardziej szczegółowoDr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI
Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku
Bardziej szczegółowoWykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Bardziej szczegółowoPliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:
Pliki W celu wykonania jakiejkolwiek operacji na istniejącym pliku, plik ten musi zostać otwarty, natomiast jeśli plik jeszcze nie istnieje, to musi zostać utworzony. Plik może zostać otwarty w trybie:
Bardziej szczegółowoPrzesyłania danych przez protokół TCP/IP
Przesyłania danych przez protokół TCP/IP PAKIETY Protokół TCP/IP transmituje dane przez sieć, dzieląc je na mniejsze porcje, zwane pakietami. Pakiety są często określane różnymi terminami, w zależności
Bardziej szczegółowoWywoływanie procedur zdalnych
Wywoływanie procedur zdalnych Mechanizm wywołania main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces (int pid){ int stat; stat
Bardziej szczegółowoWykład 3 Składnia języka C# (cz. 2)
Wizualne systemy programowania Wykład 3 Składnia języka C# (cz. 2) 1 dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD Wizualne systemy programowania Metody 2 Metody W C# nie jest
Bardziej szczegółowoJęzyki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
Bardziej szczegółowoProgramowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 5 Katarzyna Grzelak 26 marca 2018 9 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40 Pojęcia z poprzedniego wykładu Podział programu na funkcje podział na niezależne
Bardziej szczegółowoZdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int
Bardziej szczegółowoObszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Bardziej szczegółowoPROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Bardziej szczegółowo4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Bardziej szczegółowoJAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Bardziej szczegółowo1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
Bardziej szczegółowoDziałanie systemu operacyjnego
Budowa systemu komputerowego Działanie systemu operacyjnego Jednostka centralna dysku Szyna systemowa (magistrala danych) drukarki pamięci operacyjnej sieci Pamięć operacyjna Przerwania Przerwania Przerwanie
Bardziej szczegółowo2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych
2. Tablice Tablica to struktura danych przechowująca elementy jednego typu (jednorodna). Dostęp do poszczególnych elementów składowych jest możliwy za pomocą indeksów. Rozróżniamy następujące typy tablic:
Bardziej szczegółowoFAQ: 00000041/PL Data: 09/06/2012. Zastosowanie zmiennych Raw Data Type WinCC v7.0
Zmienne typu Raw Data są typem danych surowych nieprzetworzonych. Ten typ danych daje użytkownikowi możliwość przesyłania do oraz z WinCC dużych ilości danych odpowiednio 208 bajtów dla sterowników serii
Bardziej szczegółowoInformatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu
Bardziej szczegółowoZdalne wywoływanie procedur RPC
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces
Bardziej szczegółowoZdalne wywoływanie procedur RPC
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int
Bardziej szczegółowoCzęść XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.
Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja
Bardziej szczegółowoMechanizmy pracy równoległej. Jarosław Kuchta
Mechanizmy pracy równoległej Jarosław Kuchta Zagadnienia Algorytmy wzajemnego wykluczania algorytm Dekkera Mechanizmy niskopoziomowe przerwania mechanizmy ochrony pamięci instrukcje specjalne Mechanizmy
Bardziej szczegółowoSun RPC/XDR. Dariusz Wawrzyniak 1
Remote Procedure Call external Data Representation trójwymiarowa identyfikacja procedur (nr programu, nr wersji, nr procedury) protokół RPC oparty na protokołach warstwy transportowej stosu TCP/IP (TCP
Bardziej szczegółowoDYNAMICZNE PRZYDZIELANIE PAMIECI
DYNAMICZNE PRZYDZIELANIE PAMIECI Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne zmienne
Bardziej szczegółowoŁagodne wprowadzenie do Message Passing Interface (MPI)
Łagodne wprowadzenie do Message Passing Interface (MPI) Szymon Łukasik Zakład Automatyki PK szymonl@pk.edu.pl Szymon Łukasik, 8 listopada 2006 Łagodne wprowadzenie do MPI - p. 1/48 Czym jest MPI? Własności
Bardziej szczegółowoTablice. Jones Stygar na tropie zmiennych
Tablice Jones Stygar na tropie zmiennych Czym jest tablica? Obecnie praktycznie wszystkie języki programowania obsługują tablice. W matematyce odpowiednikiem tablicy jednowymiarowej jest ciąg (lub wektor),
Bardziej szczegółowoCo to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
Bardziej szczegółowoZaawansowane operacje grupowe
Zaawansowane operacje grupowe Zakres ćwiczenia Celem ćwiczenia jest zapoznanie się z zaawansowanymi funkcjami biblioteki PVM wspierającymi tworzenie aplikacji rozproszonych. Przedstawienie problemu W tworzeniu
Bardziej szczegółowoJava - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
Bardziej szczegółowoZmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
Bardziej szczegółowoPARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Bardziej szczegółowo