RÓWNOLEGŁE ŁAMANIE HASEŁ METODĄ SŁOWNIKOWĄ W ŚRODOWISKACH MPI, OPENMP I CUDA
|
|
- Antonina Chmiel
- 8 lat temu
- Przeglądów:
Transkrypt
1 JOANNA PŁAŻEK, MICHAŁ PODYMA RÓWNOLEGŁE ŁAMANIE HASEŁ METODĄ SŁOWNIKOWĄ W ŚRODOWISKACH MPI, OPENMP I CUDA PARALLEL PASWORD CRACKING BY DICTIONARY METHOD IN MPI, OPENMP AND CUDA ENVIRONMENTS S t r e s z c z e n i e A b s t r a c t Algorytm łamania haseł metodą słownikową jest techniką używaną do siłowego odgadywania haseł do systemów. Jego realizacja wymaga dużych nakładów obliczeniowych, dlatego też uzasadnione jest wykorzystanie do tego celu programowania równoległego. W artykule przedstawiono i porównano ze sobą, równoległe implementacje tego algorytmu w trzech różnych środowiskach programowania równoległego. Są nimi MPI (Message Passing Interface), środowisko wykorzystujące model z przesyłaniem komunikatów, OpenMP (Open Multi Processing), realizujące zrównoleglenie obliczeń na poziomie danych oraz środowisko procesorów kart graficznych. Słowa kluczowe: atak słownikowy, programowanie równoległe, środowiska programowania równoległego: MPI, OpenMP, CUDA Password cracking by the dictionary method is a technique for detecting passphrases. Its implementation requires a large computational effort, so it is justified to apply for it a parallel programming. In this article we describe and compare a parallel implementation in three different parallel programming environments, i.e. MPI (Message Passing Interface), the environment that uses a model with message-passing; OpenMP (Open Multi Processing), which is based on data-parallelization; and the graphics processing units environment. Keywords: dictionary attack, parallel programming, parallel programming environments: MPI, OpenMP, CUDA Dr inż. Joanna Płażek, inż. Michał Podyma, Instytut Teleinformatyki, Wydział Fizyki, Matematyki i Informatyki, Politechnika Krakowska.
2 Wstęp Większość dzisiejszych komputerów osobistych posiada procesor wielordzeniowy, a także kartę graficzną oferującą środowisko programistyczne pozwalające na wykonywanie na niej obliczeń numerycznych. Tym samym każdy z tych komputerów posiada duże możliwości i moc obliczeniową jeszcze niedawno dostępną tylko dla firm i instytucji potrzebujących dużej ilości zasobów do wykorzystania w celach komercyjnych bądź badawczych. Większość aplikacji używanych na co dzień jest w stanie pracować jedynie w trybie sekwencyjnym. Istnieje jednak wiele programów potrzebujących długiego czasu realizacji. Użycie technologii programowania równoległego, wykorzystującego w pełni moc komputerów wielordzeniowych czy kart graficznych, mogłoby zmniejszyć ten czas kilka- lub nawet kilkunastokrotnie. Łamanie haseł jest niewątpliwie zadaniem wymagającym dużych nakładów obliczeniowych. Do niedawna przyspieszenie tego typu obliczeń uzyskiwano głównie dzięki zastosowaniu coraz nowszych procesorów o ciągle zwiększającej się liczbie wykonywanych cykli na sekundę. F. Alonso w swoim artykule The Extinction of Password Authentication [1] przedstawia ewolucję mocy procesorów na przestrzeni lat i zagrożenia wynikające ze znacznego skrócenia czasu łamania mocnych haseł. Kolejnym krokiem w celu zwiększenia efektywności przetwarzania było zastosowanie procesorów wielordzeniowych, by w końcu łamać hasła przy użyciu maszyn wieloprocesorowych lub multikomputerów. Ostatnio prawdziwą rewolucją stało się wykorzystanie procesorów kart graficznych do obliczeń ogólnego przeznaczenia, czyli GPGPU. Wyniki porównujące czasy łamania haseł z wykorzystaniem CPU i środowiska GPGPU dla haseł różnej długości, kodowanych przy pomocy różnych algorytmów, przedstawia Martijn Sprengers w pracy GPU-based Password Cracking. On the Security of Password Hashing Schemes regarding Advances in Graphics Processing Units [2]. Do najczęściej wykorzystywanych środowisk programowania równoległego można zaliczyć MPI (ang. Message Passing Interface), OpenMP (ang. Open Multi Processing) oraz środowisko CUDA. Porównanie równoległych implementacji algorytmu łamiącego hasła, realizowanych w różnych środowiskach obliczeń równoległych, daje możliwość odpowiedzi na pytanie, które ze środowisk pozwala na uzyskanie największego przyspieszenia i jakim nakładem pracy każda z implementacji musi być realizowana. 2. Zabezpieczenie i łamanie haseł Hasło jest elementem bezpieczeństwa pozwalającym zabezpieczyć dane przed nieautoryzowanym dostępem przez osoby postronne. Używane jest w celu uwierzytelnienia tożsamości osoby pragnącej uzyskać dostęp do pewnych zasobów, które chronione są przed dostępem osób nieupoważnionych do korzystania z nich. Mogą to być prywatne dane jednej osoby i dostępne tylko dla niej samej, jak na przykład dostęp do konta bankowego. Innym przykładem są dane współdzielone przez grupę osób i jednocześnie chronione przed każdym spoza danej grupy, jak dane osób pracujących nad jednym projektem w firmie. Najczęstsze przechwycenie hasła przez osoby do tego nieuprawnione odbywa się w następujących miejscach:
3 123 Serwer uwierzytelniania. Miejsce, w którym znajdują się dane użytkownika potrzebne do jego identyfikacji i uwierzytelnienia. Znajduje się tam hasło, aby można je było porównać z tym, które jest podawane w celu uzyskania dostępu; Medium transmisyjne. W celu uzyskania dostępu do zasobów zdalnych hasło zostaje wysłane do serwera uwierzytelniania, co daje możliwość przechwycenia go; Komputer użytkownika. Często dla wygody hasło zostaje zapisane na komputerze użytkownika, aby oszczędzić konieczność wpisywania go przy każdorazowym logowaniu. Usługi takie oferują przeglądarki internetowe oraz inne programy, np. jak komunikatory internetowe Szyfrowanie haseł Przechowywanie i transmisja hasła w postaci ciągu znaków bez żadnych dodatkowych zabezpieczeń to działanie do niedawna dość powszechnie stosowane. Podczas logowania do serwera pocztowego w sieci publicznej użytkownik jest narażony na przechwycenie jego danych. W tym celu osobie przechwytującej wystarczy zaopatrzenie się w najprostszy sniffer (program lub urządzenie umożliwiające przechwytywanie danych przepływających w sieci), aby przechwycić login i hasło osoby logującej. W celu zabezpieczenia hasła przed odczytaniem z miejsca przechowywania bądź przechwyceniem podczas transmisji stosowane są dwa zabiegi: Szyfrowanie transmisji. Hasło może być przesyłane w postaci ciągu znaków, a ze względu na szyfrowanie całej transmisji danych pozostaje bezpieczne; Szyfrowanie hasła. Praktycznie nigdy hasło nie zostaje zapisane w postaci ciągu znaków. Przed zapisaniem zostaje zaszyfrowane bądź poddane działaniu funkcji hashującej co czyni proces odtworzenia hasła trudnym i czasochłonnym. Czasem dla zwiększenia efektywności hasło jest hashowane, szyfrowane kilkukrotnie lub wcześniej modyfikowane Dodatkowe modyfikacje Ogólną zasadą tworzenia mocnego hasła odpornego na zgadnięcie jest utworzenie ciągu znaków zawierającego przypadkową kombinację liter, liczb i innych dozwolonych znaków. Niestety takie hasło zwykle trudno zapamiętać i łatwo się pomylić przy jego wpisywaniu. Ponadto mało kto bierze pod uwagę fakt, że ktoś mógłby zechcieć poznać jego hasło, a jego wpisywanie brane jest często za uciążliwy obowiązek. Czasami użytkownicy są zmuszeni do zabezpieczenia się silnym hasłem, np. w przypadku dostępu do danych firmowych, gdzie polityka bezpieczeństwa firmy tego wymaga. Jeśli jednak użytkownik nie widzi takiej konieczności, zabezpiecza swoje konto hasłem, które łatwo zapamięta i będzie wygodne w użyciu, szczególnie jeśli często go używa. Takie proste hasła to zwykle imiona, daty urodzenia bądź przypadkowe słowa zdające się być trudnymi do zgadnięcia właśnie ze względu na swoją przypadkowość. W celu zmniejszenia prawdopodobieństwa zgadnięcia hasła stosowane są zabiegi modyfikujące hasło przez użytkownika, bądź też modyfikacje zapisanego hasła dokonywane przez program je zapamiętujący: a) Modyfikacje użytkownika. Jeśli użytkownik nie posiada silnego hasła powinien je zmienić chociażby przez jego niewielką modyfikację. Taki zabieg nie musi uczynić hasła trudniejszym do zapamiętania lub niewygodnym. Jeśli hasło jest np. imieniem to prosta modyfikacja polegająca na dopisaniu do niego liczby zwiększa jego moc. Zawarcie w haśle znaku specjalnego jest jeszcze skuteczniejsze.
4 124 Przykład: hasło: kasienka zamieniamy na kasienka.5. Takie hasło możemy już traktować jako silne. Niektóre portale pozwalają sprawdzić siłę hasła przed założeniem konta, jak np. Gmail ( podczas zakładania konta pocztowego. Kiedy wpisujemy hasło do formularza rejestracyjnego, jesteśmy informowani o jego sile. W przypadku naszego powyższego przykładu hasło kasienka zostało uznane jako słabe, a po dopisaniu do niego cyfry bądź kropki hasło miało już status silnego. b) Modyfikacje zapisywanych haseł. Hasła na serwerach oraz ich kopie na komputerach użytkownika nie są zapisywane w postaci ciągu znaków, lecz zostają przetworzone funkcją hashującą. Jednak często przed hashowaniem ciąg zawierający nasze hasło jest modyfikowany. Zabieg ten jest podwójnie skuteczny: utrudnia złamanie hasła zmodyfikowany ciąg jest zwykle dłuższy od pierwotnego hasła co zwiększa czas poszukiwań, a jeśli hasło jest słabe, modyfikacje zwiększają jego siłę, przez co nie każdy program łamiący jest w stanie odgadnąć hasło, znajduje niepoprawne hasło nawet jeśli hash zostanie rozkodowany i znaleziony zostanie zakodowany ciąg znaków, to ciągle nie wiadomo jakie zabiegi zostały na nim wcześniej przeprowadzone i może się okazać, że odgadnięte hasło nie jest poprawne, a brak wiedzy o wcześniejszych modyfikacjach uniemożliwi jego odgadnięcie. Przykład: Dla użytkownika user i jego hasła pass tworzony jest ciąg wg. schematu: login + salt + hasło gdzie salt jest określonym przez program przypadkowym ciągiem. Przyjmijmy salt = Dostaniemy więc: user pass Otrzymany ciąg poddajemy działaniu funkcji hashującej. W przypadku algorytmu MD5 da ona wynik: c2418f49024b3908eb9ae66de66cd884 Hasło przetrzymywane w takiej postaci w niczym nie przypomina prawdziwego hasła i wymaga szerokiej wiedzy oraz wiele pracy, aby znaleźć prawdziwy ciąg znaków reprezentujący zakodowane hasło Łamanie haseł Łamanie haseł nie musi się wiązać z łamaniem prawa. Najczęstszym przykładem zupełnie legalnego łamania haseł jest sytuacja, kiedy użytkownik chce odzyskać zapomniane hasło. Istnieją oczywiście różne mechanizmy zapobiegające sytuacjom utraty hasła, ale czasem użytkownicy nie są przygotowani na taka ewentualność i hasło przepada. Programy do łamania haseł dają ponadto użytkownikom wiedzę, że ich konta nigdy nie są w pełni bezpieczne i pozwalają określić jak złożone powinno być hasło, aby jego złamanie trwało jak najdłużej oraz ustalić, z jaką częstotliwością należy hasło zmieniać, aby ustrzec się przed utratą danych. Istnieją różne metody odnajdywania hasła. Poniżej zostaną przedstawione dwie najbardziej popularne.
5 Metoda bruteforce Metoda bruteforce jest jedyną pewną metodą łamania haseł. Gwarancję tą trzeba jednak opłacić czasem wykonania tej operacji. Metoda przewiduje porównanie ze znalezionym hasłem każdego ciągu znaków akceptowanego jako hasło. Ponieważ łamane hasło jest zapisane w zakodowanej postaci, każde z potencjalnych haseł jest przetwarzane tą samą metodą i wynik tej operacji zostaje porównany z zapisanym ciągiem znaków. Jeśli te dwa zakodowane hasła są jednakowe, znaczy to, że hasło zostało znalezione. Metoda ta wymaga wcześniejszego zapoznania się ze sposobem zapisania hasła przez program je zapamiętujący. Jeśli nie będzie znany algorytm, jakim zostało zakodowane hasło, odgadniecie go nie będzie możliwe. Czasami producenci oprogramowania jawnie udostępniają informacje o sposobie oraz miejscu zapisu hasła, tym samym dając możliwość rozkodowania go. Nie jest to sytuacja zachęcająca do łamania haseł, bo hasła zapisane są na prywatnych komputerach, do których osoby postronne nie mają dostępu. Jeśli taki dostęp jest możliwy, hasła powinny zostać dodatkowo zabezpieczone lub dostęp do komputera uniemożliwiony Metoda słownikowa Metoda słownikowa posiada cechy wspólne z metodą bruteforce. Zasada jej działania jest taka sama, czyli polega na porównywaniu kolejnych słów z hasłem, które ma zostać złamane. Nie jest to jednak metoda gwarantująca złamanie hasła. Przy zastosowaniu tej metody nie zostają porównane wszystkie możliwe hasła, a jedynie zawarte w dołączonym słowniku. Metoda ta wykorzystuje słabość haseł, ponieważ większość z nich nie jest hasłami silnymi i możemy je znaleźć w zwykłym słowniku językowym. Często stosowane są modyfikacje tych słów. Już po dodaniu do hasła jednego znaku nie będącego literą użytkownik jest zapewniany o mocy swojego hasła. Wykorzystanie tego faktu i analogiczne działanie na słowach zawartych w słowniku automatycznie zwiększa pojemność słownika oraz pozwala nam na zwiększenie skuteczności wyszukiwania. Program łamiący hasła metodą słownikową może być bardzo skuteczny, jeśli uwzględni się w nim zwyczaje użytkowników podczas wymyślania haseł. Badania wykazują, że istnieją hasła, które powtarzają się zdecydowanie częściej niż inne. Hasła jak , qwerty czy password są tak popularne, że udział jednego słowa w liczbie wszystkich haseł jest w stanie przekroczyć 1%. Tym samym program zawierający dobrze dobrany słownik i umiejętnie nim operujący jest w stanie złamać zdecydowaną większość haseł przy niewielkim nakładzie pracy w porównaniu do podobnego programu łamiącego hasła metodą bruteforce. 3. Wybrane środowiska programowania równoległego Opracowana aplikacja do łamania haseł wykorzystuje algorytm oparty na słowniku. Została zaimplementowana w trzech środowiskach programowania równoległego: MPI (ang. Message Passing Interface), OpenMP (ang. Open Multi Processing) oraz w środowisku karty graficznej. Poniżej przedstawiono ogólny opis tych środowisk oraz bardziej szczegółowo funkcje wykorzystane w programie Środowisko MPI MPI (ang. Message Passing Interface) jest standardem interfejsu do przesyłania komunikatów na potrzeby programowania rzeczywistego na maszynach z pamięcią lokalną.
6 126 Pierwsza implementacja została przedstawiona w maju 1994 roku przez konsorcjum MPI Forum grupę badaczy z USA i Europy, reprezentujących producentów oraz użytkowników maszyn równoległych. MPI nie jest konkretnym pakietem oprogramowania, a formalną specyfikacją interfejsu. Najbardziej znaną implementacja MPI jest MPICH. Interfejs MPI dostarcza funkcje umożliwiające odbieranie oraz wysyłanie komunikatów i synchronizację zadań wykonywanych na różnych komputerach (procesorach). Jego zaletą jest fakt, że program może być wykonywany na maszynach o różnych architekturach. MPI zupełnie rezygnuje z koncepcji pamięci dzielonej. Każdy proces, nawet uruchomiony na tym samym procesorze, posiada swoją własną kopię wszystkich danych. Jedyną drogą komunikacji i wymiany danych miedzy procesami są komunikaty, które służą nie tylko do synchronizacji i wysyłania informacji kontrolnych, a głównie do wymiany danych między procesami [3, 4] Podstawowe funkcje użyte w programie Rozpoczęcie pracy: int MPI_Init(int *argc, char **argv[]) Funkcja inicjalizuje środowisko pracy i rozpoczyna pracę z biblioteką MPI. Funkcja m.in. tworzy domyślny komunikator MPI_COMM_WORLD. Dopiero po jej wywołaniu możemy korzystać z pozostałych funkcji MPI. Zakończenie pracy: int MPI_Finalize(void) Funkcja kończy pracę z biblioteką MPI i zwalnia używane przez nią zasoby przygotowując system do zamknięcia. Identyfikator procesu: int MPI_Comm_rank(MPI_Comm comm, int *rank) Funkcja pod adresem rank zapisuje identyfikator wywołującego ją procesu w obrębie komunikatora comm. Ilość procesów: int MPI_Comm_size(MPI_Comm comm, int *size) Funkcja pod adresem size zapisuje ilość procesów uruchomionych w obrębie komunikatora comm. Wysyłanie komunikatu: int MPI_Send(void *msg, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) Funkcja wysyła komunikat znajdujący sie pod adresem msg do procesu o identyfikatorze dest. Komunikacja odbywa się w obrębie komunikatora comm. Przesyłane dane są typu datatype i wielkości count, a komunikat jest oznaczony etykietą tag. int MPI_Isend(void *msg, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) Nieblokująca wersja funkcji MPI Send(). Program nie oczekuje na zakończenie działania funkcji.
7 Odbieranie komunikatu: int MPI_Recv(void *msg, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) 127 Funkcja czeka na wysłanie przez proces o identyfikatorze source za pomocą komunikatora comm komunikatu z etykieta tag. Wartość datatype musi być identyczna jak w komunikacie wysyłanym. Komunikat nie większy niż count jest zapisywany pod adresem msg, a status operacji do argumentu status. int MPI_Irecv(void *msg, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *request) Nieblokująca wersja funkcji MPI Recv(). Program nie oczekuje na zakończenie działania funkcji. Wysyłanie komunikatu do grupy procesów: int MPI_Bcast(void *msg, int count, MPI_Datatype datatype, int root, MPI_Comm comm) Funkcja wysyła komunikat do grupy procesów. Wysyłającym jest proces root, a wszystkie pozostałe procesy w obrębie komunikatora comm odbierają komunikat odczytany z adresu msg procesu root zapisywany pod adresem msg innych procesów. Typ i wielkość komunikatu to datatype i count. Dzielenie danych miedzy procesami: int MPI_Scatter(void *send_buf, int send_count, MPI_Datatype send_type, void *recv_buf, int recv_count, MPI_Datatype recv_type, int root, MPI_Comm comm) Funkcja dzieli dane typu send_type umieszczone pod adresem send procesu root na części wielkości send_count. Dane zostają rozsyłane do wszystkich procesów, które odbierają swoją część danych typu recv_type umieszczając pod adresem recv_buf o wielkości recv_count. Komunikacja odbywa się w obrębie komunikatora comm. Bariera: int MPI_Barrier(MPI_Comm comm); W miejscu wywołania funkcji program zatrzymuje swoje działanie i oczekuje aż wszystkie jego instancje dotrą do tego miejsca i wtedy wszystkie zaczynają dalszą pracę OpenMP OpenMP (ang. Open Multi Processing) to standard służący do tworzenia aplikacji równoległych na komputerach z pamięcią wspólną. Opracowany w latach 90-tych XX wieku przez największych producentów maszyn równoległych, a następnie przyjęty przez wszystkich producentów oprogramowania. Możliwe jest programowanie w środowiskach obsługujących standard OpenMP w systemach Unix/Linux, a od Visual Studio 2005 również Windows. Głównym filarem standardu są dyrektywy zrównoleglające. Dodatkowymi elementami są zmienne środowiskowe oraz biblioteka procedur, służących głównie do manipulacji tymi zmiennymi. Ponadto procedury pozwalają mierzyć czas oraz identyfikować maszyny [5].
8 128 Zmienne środowiskowe OMP SHEDULE określa sposób rozdzielania iteracji pomiędzy dostępne wątki, przyjmuje wartości: static, dynamic, Guidem OMP DYNAMIC określa czy środowisko uruchomieniowe może zmienić ilość wątków, aby lepiej wykorzystać zasoby, przyjmuje wartości: true, false OMP NUM THREADS określa ilość wątków wykorzystywanych przez program OMP NESTED określa czy możliwe jest zagnieżdżanie pętli, przyjmuje wartości: true, false Dyrektywy w języku C Definicja bloku równoległego: #pragma omp parallel [klauzule] [instrukcje] Po tej dyrektywie następuje blok instrukcji, którego wykonanie ma zostać zrównoleglone. Jako klauzule przy wywołaniu tej dyrektywy możemy zapisać: private([lista zmiennych lokalnych]) zadeklarowane zmienne zostaną zaalokowane dla każdego wątku z osobna, każdy będzie miał swoją prywatną kopię i brak dostępu do kopii należących do innych wątków, shared([lista zmiennych globalnych]) zadeklarowane zmienne będą współdzielone przez wszystkie wątki wykonujące zadeklarowany blok instrukcji, default(shared/none) jeśli shared to wszystkie niezadeklarowane zmienne będą globalne, a jeśli none to wszystkie zmienne muszą zostać jawnie zadeklarowane jako globalne lub lokalne, num threads([liczba]) zadeklarowanie liczby wątków dla zrównoleglonego bloku instrukcji. Zrównoleglenie pętli: #pragma omp for [klauzule] [petla for] Z dyrektywą można użyć klauzul wymienionych dla dyrektywy parallel oraz m.in. schedule(sposób rozdziału iteracji, [kwant]) klauzulą tą możemy w pewnym stopniu kontrolować sposób rozdzielania iteracji pomiędzy dostępne wątki, pierwszy parametr definiuje sposób przydzielania zbioru iteracji do wątków, a parametr drugi określa wielkość zbiorów iteracji.
9 3.3. CUDA 129 CUDA (ang. Compute Unified Device Architecture) to opracowana przez firmę NVIDIA, równoległa architektura obliczeniowa, która zapewnia radykalny wzrost wydajności obliczeń dzięki wykorzystaniu mocy układów GPU (ang. Graphics Processing Unit) [6]. Jest środowiskiem ogólnych celów obliczeniowych wykonywanych na kartach graficznych bądź specjalizowanych kartach zbudowanych na ich bazie czyli dla obliczeń GPGPU (ang. General Purpose computing on Graphics Processing Units). Do niedawna procesory kart graficznych można było wykorzystywać do obliczeń numerycznych tylko za pośrednictwem API (ang. Application Programming Interface) dla grafiki komputerowej jak OpenGL czy DirectX. Proces zrównoleglania w tej technologii polega na wykonywaniu jednocześnie przez wiele wątków tych samych partii kodu zwanych jądrami (ang. kernel), czyli funkcji opatrzonych kwalifikatorem global. Ilość wątków, którym przypisane jest to samo jądro, jest zdefiniowana przy jego wywołaniu. Wątki tworzą bloki, a te z kolei składają się na gridy[7, 8]. Wykonanie jądra konfigurujemy przy pomocy potrójnych nawiasów trójkątnych w sposób następujący: gdzie: Funkcja<<<liczbaBloków, liczbawatków>>>([parametry]) Funkcja nazwa jądra, liczbabloków ilość bloków w gridzie, liczbawatków ilość wątków w bloku, parametry parametry wywołania jądra. Ze względu na możliwości techniczne operacje wykonywane na karcie graficznej posiadają szereg ograniczeń ściśle związanych z architekturą konkretnego procesora graficznego. Ograniczone są wielkości bloków oraz gridów więc nie możemy uruchomić nieskończonej ilości wątków, a we wszystkich obecnie produkowanych układach jądro może wykonać maksymalnie 2 miliony operacji. Kwalifikatory funkcji: host Funkcja poprzedzona kwalifikatorem host jest wykonywana na CPU. global Funkcja poprzedzona kwalifikatorem global jest wywoływana z CPU, ale wykonywana na GPU. device Funkcja poprzedzona kwalifikatorem device jest wywoływana z GPU oraz wykonywana na GPU. launch_bounds ( maxthreadsperblock, minblockspermultiprocessor) Kwalifikator launch_bounds() jest wykorzystywany w sąsiedztwie kwalifikatora global. W nawiasie podaje się dwa parametry: maxthreadsperblock maksymalna ilość wątków w bloku, minblockspermultiprocessor minimalna ilość bloków na jednym procesorze.
10 130 Kwalifikator ten dla podanych parametrów wymusza na etapie kompilacji optymalizację ilości wykorzystywanych 32-bitowych rejestrów przez funkcje jądra. Ilość rejestrów dla jednego procesora jest ograniczona i niewielka, dlatego tak ważne jest ich rozsądne rozdysponowanie. Użycie tego kwalifikatora podczas kompilacji informuje nas o ilości wykorzystywanych rejestrów i o tym, czy ich ilość została zmniejszona, czy może podane parametry są zbyt duże. Proces optymalizacji może zawierać w sobie m.in. zwiększenie ilości wykonywanych operacji jeśli może się to przyczynić do zmniejszenia ilości używanych rejestrów. Podstawowe funkcje cudaerror_t cudamalloc (void ** devptr, size_t size) Funkcja alokuje miejsce w pamięci karty graficznej dostępnej za pomocą wskaźnika devptr. Rozmiar zarezerwowanej pamięci to size bajtów. cudaerror_t cudamemcpy (void * dst, const void * src, size_t count, enum cudamemcpykind kind) Funkcja kopiuje dane o rozmiarze count z src do dst. Należy zdefiniować, czy miejsce źródłowe oraz docelowe znajduje się w pamięci komputera, czy też w pamięci karty graficznej, służą do tego zdefiniowane stałe: cudamemcpyhosttohost, cudamemcpyhosttodevice, cudamemcpydevicetohost oraz cudamemcpydevicetodevice. cudaerror_t cudafree (void * devptr) Wywołanie funkcji zwalnia używane zasoby alokowane wcześniej pod adresem devptr. 4. Implementacje algorytmów łamania haseł metodą słownikową Na potrzeby aplikacji został przyjęty sposób zapisu haseł pod postacią: login hash gdzie hash jest wynikiem funkcji hashującej na ciągu znaków reprezentującym hasło. Dla naszego przypadku zostały przyjęte modyfikacje hasła przed poddaniem go funkcji hashującej. Po modyfikacjach wygląda ono następująco: login haslo Powyższy ciąg znaków jest podawany jako argument dla funkcji hashującej. Plik z hasłem zawiera więc następującą zawartość: login hash(login haslo) Powyższy opis charakteryzuje system zapisu haseł, dla którego możliwe jest złamanie hasła opisywanym programem. Do uproszczenia przebiegu testów plik z hasłami został nieco zmodyfikowany i zawiera kolejne pary: login/haslo. Program przed rozpoczęciem procesu łamania hasła najpierw poddaje je przetworzeniu funkcji hashującej stosując przedstawioną wyżej metodę. Po tym zabiegu program posiada zakodowane hasło i może przystąpić do jego łamania. Jako funk-
11 131 cję hashującą został wykorzystany algorytm MD5. Wykorzystana została jego darmowa implementacja udostępniona przez firmę Aladdin Enterprises [9]. Jako baza słów użyty został słownik języka polskiego do gier słownych zawierający ponad 2,7 mln słów [10]. Wszystkie programy zostały zaimplementowane i uruchomione w programie Microsoft Visual Studio 2008 w języku programowania C Implementacja sekwencyjna Program odczytuje z pliku pary haseł i loginów (nazw użytkowników). Ilość haseł do złamania może być dowolna program przed wczytaniem haseł do pamięci komputera najpierw liczy je, a potem alokuje potrzebną pamięć i zapisuje w niej hasła. Słownik również czytany jest z pliku przy wykorzystaniu podobnego algorytmu jak przy wczytywaniu haseł, czyli najpierw liczona jest ilość słów, a potem alokowana potrzebna pamięć i czytany do niej słownik. Wielkość słownika, z którego pobierane są wzorce, jest dowolna. Ograniczają ją jedynie sprzętowe możliwości alokowania tablicy zawierającej wszystkie słowa. Funkcja modyfikująca słowo przed porównaniem zwiększa zakres poszukiwań dla każdego jednego słowa ze słownika tworzonych jest 7 jego dodatkowych modyfikacji. Funkcja wywoływana jest w pętli ośmiokrotnie. Przy pierwszym wywołaniu słowo nie jest modyfikowane. Przy każdym kolejnym do słowa dopisywana jest cyfra z zakresu od 1 do 7. Fakt modyfikacji każdego słowa sprawia, że dla wykorzystanego słownika program jest w stanie dokonać prawie 22 mln porównań dla jednego hasła Implementacja w środowisku MPI Słownik jest dzielony na równe części przydzielane wszystkim procesom. Proces 0 czyta z pliku słownik oraz hasła do złamania. Najpierw je liczy, po czym alokuje potrzebną pamięć i do niej zapisuje zawartość plików. Potem oblicza ile słów przypada na jeden proces i wysyła do wszystkich potrzebne informacje. Na koniec dokonywany jest transfer słownika, aby każdy proces posiadał tylko tą jego cześć, na której ma operować. Pętla badająca kolejne słowa jest podzielona na mniejsze pętle po 10 tys. przejść. Zabieg ten ma na celu przerwanie pracy innych procesów po znalezieniu hasła przez jeden z nich. Aby nie tracić czasu na synchronizację wszystkich procesów w tym samym czasie, wysyłane są komunikaty nieblokujące. Procesem decydującym o zakończeniu poszukiwań jest proces 0. Każdy inny proces w przypadku złamania hasła wysyła do niego komunikat zgłaszający znalezienie hasła, po czym przesyła znalezione hasło. Proces 0 w przypadku otrzymania komunikatu o złamaniu hasła przez inny proces odbiera także komunikat zawierający złamane hasło. Jeśli proces 0 wie, że hasło zostało złamane, wysyła taką informacje do wszystkich pozostałych procesów. Tylko proces 0 wyświetla informacje o tym, jakie są złamane hasła. Steruje całą komunikacją oraz zbiera informacje od wszystkich procesów. Ilość komunikacji w przypadku kilku rdzeni (procesorów) nie jest jednak na tyle duża, by wymagała osobnego procesu do wykonywania tego zadania, więc proces 0 wykonuje poszukiwania, tak jak i wszystkie inne procesy. Każdy proces co 10 tys. haseł sprawdza, czy nie został do niego wysłany komunikat informujący o złamaniu hasła przez inny proces. Jeśli otrzyma taki komunikat przerywa pracę. Diagram aktywności dla implementacji w środowisku MPI przedstawia rys. 1.
12 132 Rys. 1. Diagram aktywności dla implementacji w środowisku MPI Fig. 1. Activity diagram for MPI implementation
13 133 Rys. 2. Diagram aktywności dla implementacji w środowisku OpenMP Fig. 2. Activity diagram for OpenMP implementation
14 Implementacja w środowisku OpenMP Algorytm wczytujący słownik z pliku do pamięci komputera działa w pętli. Jedno wykonanie pętli czyta słowo z pliku i zapisuje je do wcześniej zaalokowanej jednowymiarowej tablicy znaków. Dla każdego słowa przewidziane jest miejsce na 20 znaków. Słownik został sprawdzony i nie posiada dłuższych słów. Indeks położenia słowa w tablicy jest liczony przez pomnożenie numeru słowa przez 20. Program działający w ten sposób, alokuje słownik do pamięci w ciągu 2 sekund. Na rys. 2 przedstawiono diagram aktywności dla implementacji w środowisku OpenMP. Badany algorytm posiada pętlę, przy pomocy której kolejne słowa ze słownika porównywane są z szukanym hasłem. Jeśli hasło znajduje się wśród porównywanych słów, pętla jest przerywana. Środowisko OpenMP nie umożliwia przerwania zrównoleglonej pętli. Z tego powodu pętla przechodząca przez wszystkie słowa została podzielona na mniejsze wczytujące z tablicy 10 tys. słów każda. Pętla główna zmienia swój licznik, dodając do niego po każdym przejściu wartość 10 tys.. Mniejsze pętle wewnętrzne nie są zrównoleglone, więc kiedy w jednym z 10 tys. przejść odnajdą właściwe hasło są przerywane. W momencie znalezienia właściwego hasła zmieniany jest również specjalny znacznik informujący program podczas dalszego wykonania, że hasło zostało już znalezione. Zrównoleglona pętla zewnętrzna musi skończyć wszystkie swoje przejścia, których liczba była znana przed jej uruchomieniem. Jednak skoro znacznik informuje, że hasło zostało już znalezione, pętle wewnętrzne są natychmiast przerywane, a tym samy cały program w krótkim czasie zostaje zakończony wykonując jedynie niewielka ilość nadmiarowych obliczeń. Opisana wyżej pętla porównująca każde słowo jest wykonywana dla wszystkich wyszukiwanych haseł, a te z kolei również odczytywane są przy pomocy pętli czytającej kolejne hasła do złamania. Zrównoleglona cześć znajduje się wewnątrz tej pętli i na jej końcu znajduje się domyślna bariera. Jest ona potrzebna, ponieważ w razie jej braku wątek, który złamał hasło, mógłby przejść do poszukiwań kolejnego wcześniej niż inne. Znacznik po odnalezieniu hasła musi zostać na nowo wyzerowany i dopiero wtedy program może przejść do wyszukiwania kolejnego hasła. Pętle zostały zrównoleglone z dyrektywą schedule(dynamic), co znaczy że każdy wątek wykonuje jedną iterację pętli. Jeśli pętla nie została zakończona, a wątek zakończył swoją cześć to zostaje mu przydzielona kolejna iteracja. Słownik jest jednokrotnie zapisywany do pamięci komputera i każdy korzysta z tej samej kopii umieszczonej w pamięci dzielonej. W pamięci lokalnej poszczególnych wątków alokowane jest miejsce na kolejne pobierane ze słownika słowa oraz zmienne potrzebne do ich zakodowania Implementacja w technologii CUDA Słownik został w tym przypadku w całości skopiowany do pamięci karty graficznej. Najpierw zostały policzone słowa w słowniku oraz hasła do złamania. Alokowana została przestrzeń w pamięci RAM komputera, oraz przestrzeń w pamięci karty graficznej. Słownik oraz hasła do złamania zostały wczytane do tablicy w pamięci komputera po czym w całości skopiowane do pamięci karty graficznej. Ze względu na ograniczenia techniczne funkcja poszukująca hasła wykonywana na karcie graficznej zostaje wywołana kilkakrotnie. Wywołanie tej funkcji jądra jest równoległym wywołaniem wielu jej instancji wykonywanych przez pojedyncze wątki. W trakcie testów okazało się, ze najlepsze wyniki daje wywołanie funkcji jednocześnie w 8192 blokach zawierających 64 wątki każdy.
15 Rys. 3. Diagram aktywności dla implementacji w środowisku CUDA Fig. 3. Activity diagram for CUDA implementation 135
16 136 Pojedynczy kernel porównuje 1 słowo ze słownika. Przeprowadzone zostały również testy, gdzie kernel porównywał 1000 słów. Była to próba analogii do implementacji wykonanych w środowiskach MPI i OpenMP. W wymienionych środowiskach było to 10 tys. słów dla jednego wątku, ale funkcja jądra posiada ograniczenie ilości wykonanych operacji do 2 mln. Z tego powody możliwe było porównanie jedynie nieco ponad 1000 słów w jednym wywołaniu funkcji. Ta wersja programu została jednak zmieniona, ponieważ w trakcie testów okazało się, ze wywołując funkcje jądra dla jednego słowa szybkość wykonywania obliczeń zwiększyła się. Analogicznie jednak do innych implementacji jeśli hasło zostało złamane nie są porównywane kolejne słowa. Funkcja jądra została zoptymalizowana przy pomocy kwalifikatora launch_bounds (64,8) przy definicji funkcji. Kwalifikator ten zoptymalizował ilość wykorzystywanych rejestrów przez funkcje jądra, tak aby mogła działać wywołana na co najmniej 8 blokach zawierających nie więcej niż 64 wątki każdy. Ilość wątków w bloku została wybrana nieprzypadkowo. Ze względu na organizację pamięci, w celu uzyskania najlepszej wydajności, powinna to być wielokrotność liczby 64. Przyjęta została więc ilość wątków w bloku równa 64. Badana implementacja nie korzysta z możliwości dzielenia pamięci w obrębie bloku w związku z czym zwiększanie ilości wątków w bloku nie jest konieczne. Ilość bloków została wyznaczona podczas testowania programu, gdzie najlepsze wyniki zostały uzyskane przy ustawieniu ilości bloków na Na rys. 3 przedstawiono diagram aktywności dla implementacji w środowisku CUDA. 5. Badanie algorytmów Programy zostały przetestowane na dwóch maszynach: programy wykonywane na CPU korzystały z komputera z procesorem AMD Athlon II X4 635 posiadającym 4 rdzenie o częstotliwości 2900 MHz każdy i 2 GB pamięci RAM, program wykonywany na GPU korzystał z komputera z procesorem Intel Pentium Core 2 Duo P8700 posiadającym 2 rdzenie o częstotliwości 2530 MHz każdy i 4 GB pamięci RAM oraz kartę graficzną NVIDIA GeForce 9300M GS posiadającą 8 rdzeni o częstotliwości 580 MHz, pamięć wewnętrzną wielkości 256 MB. Oba komputery posiadały zainstalowany system operacyjny Microsoft Windows 7 Pro x64 oraz środowisko programistyczne Microsoft Visual Studio 2008 Pro. Programy zostały przetestowane dla jednakowych danych wejściowych. Poszukiwały 8 haseł mieszczących się w różnych miejscach słownika bądź nie znajdujących się w nim. Jako źródło wzorców do wyszukiwania haseł wykorzystany został słownik zawierający ponad 2,7 mln słów opisany wcześniej. Czas wykonania sekwencyjnej wersji programu wyniósł 147 sekund i do tego wyniku zostały wykonane porównania w dalszej części artykułu. Programy działające w środowiskach OpenMP oraz MPI zostały uruchomione kolejno na 1, 2, 3 i 4 rdzeniach procesora. Wyniki przedstawione są na wykresach zależności czasowych oraz przyspieszenia. Rysunek 4 pokazuje czasy wykonania programów zrównoleglonych w środowiskach MPI oraz OpenMP w zależności od liczby wykorzystanych rdzeni. Widać na nim, że kolejne wątki znacznie zmniejszają czasy wykonania, co świadczy o efektywności zaimplementowanych algorytmów.
17 137 Rysunek 5 przedstawia uzyskane przyspieszenia. W przypadku środowiska OpenMP wartości są bliskie ilości wykorzystanych rdzeni, co świadczy o bardzo dobrej efektywności programu, bliskiej idealnemu przyśpieszeniu. W przypadku środowiska MPI widać, że koszty związane z komunikacją oraz synchronizacją procesów wraz ze wzrostem liczby rdzeni są coraz większe i powodują spadek wartości przyspieszenia. Rysunek 6 porównuje czasy wykonania programu w wersji sekwencyjnej na CPU oraz zrównoleglonej na GPU. Jak widać w środowisku karty graficznej, czas wykonania został ponad trzykrotne skrócony. Rys. 4. Czasy wykonania programu dla różnej liczby rdzeni dla środowisk MPI i OpenMP Fig. 4. Wall-clock execution time for different number of cores for MPI and OpenMP environments Rys. 5. Przyspieszenie programów dla środowisk MPI i OpenMP Fig. 5. Speed-up for MPI and OpenMP environments Aby podsumować wyniki badań, na jednym wykresie (rys. 7) porównano czasy wykonania programu sekwencyjnego oraz programów równoległych uruchomionych we wszystkich testowanych środowiskach. Dane odzwierciedlone na wykresie dla środowisk OpenMP i MPI to wyniki dla aplikacji uruchomionej na 4 rdzeniach. Najkrócej wykonywał się program zaimplementowany w środowisku OpenMP. Nieco dłużej trwało jego wykonanie w technologii CUDA. Środowisko MPI dało najgorszy wy-
18 138 nik. Oczywiście kolejność uzyskanych czasów może ulec zmianie, głównie jeśli chodzi o czas uzyskany w środowisku GPU, który jest silnie zależny od użytej karty graficznej i może dać efekt lepszy niż aplikacja uruchomiona w środowisku OpenMP. Natomiast należy domniemać, iż czasy uzyskane dla implementacji MPI będą zawsze gorsze od implementacji OpenMP z powodu dużych kosztów czasowych związanych z przesyłaniem komunikatów. Rys. 6. Czasy wykonania algorytmów sekwencyjnego i zaimplementowanego w środowisku CUDA Fig. 6. Wall-clock execution time for sequential algorithm and algorithm implemented in CUDA environment Rys. 7. Czasy wykonania algorytmów sekwencyjnego oraz w środowiskach MPI, OpenMP i CUDA Fig. 7. Wall-clock execution time for sequential algorithm and algorithms implemented in MPI, OpenMP and CUDA environments 6. Wnioski Wyniki badań pokazują, że programy wykonywane w środowiskach programowania równoległego wykorzystują potencjał komputerów. Istnieją różne metody i narzędzia zrównoleglenia algorytmów. Na pewno różne środowiska programowania równoległego poz-
19 139 walają optymalnie przyśpieszyć inną klasę problemów, ale zawsze pozwalają na lepsze wykorzystanie posiadanego sprzętu niż wykonywanie jedynie programów sekwencyjnych. Do badanego problemu sprzęt, na którym testowane były programy, pozwolił na otrzymanie bardzo dobrych wyników dla programu wykonywanego w środowisku OpenMP. Wykres przyśpieszeń pozwala sądzić, że testowany algorytm jest w stanie przyjąć kolejne procesory do równoległego wykonywania programu, dając ciągle dość dobre wyniki. Implementacja w środowisku MPI niestety nie dała tak dobrych wyników. Program, mimo że uzyskał znaczne przyspieszenie w stosunku do wersji sekwencyjnej to nie może się równać z implementacjami OpenMP czy CUDA. Najciekawszą implementacją jest program wykonywany na procesorze karty graficznej. Co prawda nie uzyskał on najkrótszego czasu wykonania, ale należy wziąć po uwagę, że procesor komputera, na którym wykonywane były testy, jest procesorem wyższej klasy niż wykorzystana karta graficzna. Wykorzystany procesor nie występuje często w połączeniu z tą karta, a prawie zawsze z kartą o większej mocy. Niemniej jednak program wykonany na karcie graficznej dosięgnął niemal maksymalnych możliwości procesora komputera. Programowanie równoległe daje więc wielkie możliwości stworzenia w domowych warunkach laboratorium komputerowego i to bardzo małym kosztem. Dzisiaj praktycznie każdy procesor posiada kilka rdzeni, a karty graficzne wciąż mało znane, ale z wielkimi możliwościami oferują dużą moc obliczeniowa. Należy rozwijać gałąź informatyki związaną z programowaniem równoległym i przenosić ją do programów wykorzystywanych przez zwykłych użytkowników. Inaczej coraz więcej osób zacznie zauważać, że nowy sześciordzeniowy procesor nie działa szybciej od starego laptopa. A przecież ten procesor ma wielkie możliwości. L i t e r a t u r a [1] A l o n s o F., The Extinction of Password Authentication, ISSA Journal, December [2] S p r e n g e r s M., GPU-based Password Cracking. On the Security of Password Hashing Schemes regarding Advances in Graphics Processing Units, Radboud University Nijmegen [3] Message Passing Interface (MPI) Tutorial ( [4] K a r b o w s k i A., N i e w i a d o m s k a - S z y n k i e w i c z E., Programowanie równoległe i rozproszone, Oficyna Wydawnicza Politechniki Warszawskiej, Warszawa [5] OpenMP Tutorial ( [6] NVIDIA ( is cuda new pl.html). [7] NVIDIA CUDA, C Programing Guide, Version 3.2, NVIDIA Corporation, październik [8] NVIDIA CUDA, Reference Manual, Version 3.2 Beta, sierpień [9] Source Forge ( [10] Słownik Języka Polskiego (
Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego
Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego Mariusz Uchroński 3 grudnia 2010 Plan prezentacji 1. Wprowadzenie 2.
Programowanie 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...................................................
CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu
CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu inż. Daniel Solarz Wydział Fizyki i Informatyki Stosowanej AGH 1. Cel projektu. Celem projektu było napisanie wtyczki
Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1
Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1 Wprowadzenie Procesory graficzne GPU (Graphics Processing Units) stosowane są w kartach graficznych do przetwarzania grafiki komputerowej
Programowanie Równoległe wykład, 21.01.2013. CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej
Programowanie Równoległe wykład, 21.01.2013 CUDA, przykłady praktyczne 1 Maciej Matyka Instytut Fizyki Teoretycznej Motywacja l CPU vs GPU (anims) Plan CUDA w praktyce Wykład 1: CUDA w praktyce l aplikacja
Programowanie 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,
Algorytmy i Struktury Danych
POLITECHNIKA KRAKOWSKA - WIEiK KATEDRA AUTOMATYKI i TECHNIK INFORMACYJNYCH Algorytmy i Struktury Danych www.pk.edu.pl/~zk/aisd_hp.html Wykładowca: dr inż. Zbigniew Kokosiński zk@pk.edu.pl Wykład 12: Wstęp
Programowanie procesorów graficznych GPGPU
Programowanie procesorów graficznych GPGPU 1 GPGPU Historia: lata 80 te popularyzacja systemów i programów z graficznym interfejsem specjalistyczne układy do przetwarzania grafiki 2D lata 90 te standaryzacja
Aplikacja 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ę
Podstawy 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
Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,
Przetwarzanie równoległe PROJEKT OMP i CUDA Temat projektu dotyczy analizy efektywności przetwarzania równoległego realizowanego przy użyciu komputera równoległego z procesorem wielordzeniowym z pamięcią
znajdował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
Programowanie 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
Programowanie 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
FTP przesył plików w sieci
FTP przesył plików w sieci 7.5 FTP przesył plików w sieci Podstawowe pojęcia FTP (File Transfer Protocol) jest usługą sieciową pozwalającą na wymianę plików w sieci Internet. Osoby chcące wymienić między
Programowanie współbieżne Wykład 2. Iwona Kochańska
Programowanie współbieżne Wykład 2 Iwona Kochańska Miary skalowalności algorytmu równoległego Przyspieszenie Stały rozmiar danych N T(1) - czas obliczeń dla najlepszego algorytmu sekwencyjnego T(p) - czas
Operacje 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
Podstawy 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
JĘ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
Logiczny model komputera i działanie procesora. Część 1.
Logiczny model komputera i działanie procesora. Część 1. Klasyczny komputer o architekturze podanej przez von Neumana składa się z trzech podstawowych bloków: procesora pamięci operacyjnej urządzeń wejścia/wyjścia.
Lab 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
PRZETWARZANIE RÓWNOLEGŁE I ROZPROSZONE. Mnożenie macierzy kwadratowych metodą klasyczną oraz blokową z wykorzystaniem OpenMP.
P O L I T E C H N I K A S Z C Z E C I Ń S K A Wydział Informatyki PRZETWARZANIE RÓWNOLEGŁE I ROZPROSZONE. Mnożenie macierzy kwadratowych metodą klasyczną oraz blokową z wykorzystaniem OpenMP. Autor: Wojciech
Tryby 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
lekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Programowanie i techniki algorytmiczne
Temat 2. Programowanie i techniki algorytmiczne Realizacja podstawy programowej 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych 2) formułuje ścisły opis prostej
61 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
ZAŁĄCZNIK NR 1 DO REGULAMINU SERWISU ZNANEEKSPERTKI.PL POLITYKA OCHRONY PRYWATNOŚCI
ZAŁĄCZNIK NR 1 DO REGULAMINU SERWISU ZNANEEKSPERTKI.PL POLITYKA OCHRONY PRYWATNOŚCI Headlines Spółka z ograniczoną odpowiedzialnością i spółka spółka komandytowa szanuje i troszczy się o prawo do prywatności
CUDA część 1. platforma GPGPU w obliczeniach naukowych. Maciej Matyka
CUDA część 1 platforma GPGPU w obliczeniach naukowych Maciej Matyka Bariery sprzętowe (procesory) ok na. 1 10 00 la raz t y Gdzie jesteśmy? a ok. 2 razy n 10 lat (ZK) Rozwój 1985-2004 i dalej? O roku ów
która metoda jest najlepsza
która metoda jest najlepsza dr inż. Marek Żabka Instytut Matematyki Wydział Matematyki Stosowanej Politechnika Śląska 20 września 2012r Nowa metoda tworzenia grafiki na stronie internetowej: element,,canvas
Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie
Klient-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
Sesje i logowanie. 1. Wprowadzenie
Sesje i logowanie 1. Wprowadzenie Żądania od nawet tego samego użytkownika na serwerze nie są domyślnie w żaden sposób łączone ze sobą. Każde jest w pewnym sensie nowe i serwer nie jest w stanie stwierdzić,
Zapisywanie algorytmów w języku programowania
Temat C5 Zapisywanie algorytmów w języku programowania Cele edukacyjne Zrozumienie, na czym polega programowanie. Poznanie sposobu zapisu algorytmu w postaci programu komputerowego. Zrozumienie, na czym
Przewodnik użytkownika (instrukcja) AutoMagicTest
Przewodnik użytkownika (instrukcja) AutoMagicTest 0.1.21.137 1. Wprowadzenie Aplikacja AutoMagicTest to aplikacja wspierająca testerów w testowaniu i kontrolowaniu jakości stron poprzez ich analizę. Aplikacja
Moc płynąca z kart graficznych
Moc płynąca z kart graficznych Cuda za darmo! Czyli programowanie generalnego przeznaczenia na kartach graficznych (GPGPU) 22 października 2013 Paweł Napieracz /20 Poruszane aspekty Przetwarzanie równoległe
i3: internet - infrastruktury - innowacje
i3: internet - infrastruktury - innowacje Wykorzystanie procesorów graficznych do akceleracji obliczeń w modelu geofizycznym EULAG Roman Wyrzykowski Krzysztof Rojek Łukasz Szustak [roman, krojek, lszustak]@icis.pcz.pl
Wersja dokumentacji1.01. TeleToken API
Wersja dokumentacji1.01 TeleToken API Spis treści STATUS ZWRACANY PRZEZ FUNKCJE...1 OGÓLNE ZASADY...1 INTERPRETACJA STATUSU...1 FUNKCJE BIBLIOTEKI...3 TVTTAPI_INITIALIZE...3 TVTTAPI_RANDOMIZE...3 TVTTAPI_RAND...3
5. 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ęć
Raport Hurtownie Danych
Raport Hurtownie Danych Algorytm Apriori na indeksie bitmapowym oraz OpenCL Mikołaj Dobski, Mateusz Jarus, Piotr Jessa, Jarosław Szymczak Cel projektu: Implementacja algorytmu Apriori oraz jego optymalizacja.
Przetwarzanie Równoległe i Rozproszone
POLITECHNIKA KRAKOWSKA - WIEiK KATEDRA AUTOMATYKI I TECHNOLOGII INFORMACYJNYCH Przetwarzanie Równoległe i Rozproszone www.pk.edu.pl/~zk/prir_hp.html Wykładowca: dr inż. Zbigniew Kokosiński zk@pk.edu.pl
Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego
Wątki Wątek - definicja Ciąg instrukcji (podprogram) który może być wykonywane współbieżnie (równolegle) z innymi programami, Wątki działają w ramach tego samego procesu Współdzielą dane (mogą operować
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
Kompresja tablic obliczeń wstępnych alternatywa dla tęczowych tablic. Michał Trojnara.
Kompresja tablic obliczeń wstępnych alternatywa dla tęczowych tablic Michał Trojnara Michal.Trojnara@pl.abnamro.com Cel prezentacji Zaproponowanie rozwiązania alternatywnego wobec popularnych ataków na
Wykł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
Regulamin korzystania z systemu poczty elektronicznej Okręgowej Izby Radców Prawnych w Warszawie przez członków OIRP w Warszawie
Załącznik do uchwały Nr 1032/2019 Rady OIRP w Warszawie z 18.09.2019 r. Regulamin korzystania z systemu poczty elektronicznej Okręgowej Izby Radców Prawnych w Warszawie przez członków OIRP w Warszawie
Wykorzystanie architektury Intel MIC w obliczeniach typu stencil
Wykorzystanie architektury Intel MIC w obliczeniach typu stencil Kamil Halbiniak Wydział Inżynierii Mechanicznej i Informatyki Kierunek informatyka, Rok IV Instytut Informatyki Teoretycznej i Stosowanej
Zadania badawcze prowadzone przez Zakład Technik Programowania:
Zadania badawcze prowadzone przez Zakład Technik Programowania: - Opracowanie metod zrównoleglania programów sekwencyjnych o rozszerzonym zakresie stosowalności. - Opracowanie algorytmów obliczenia tranzytywnego
Modele 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.
Architektura komputerów
Architektura komputerów Wykład 7 Jan Kazimirski 1 Pamięć podręczna 2 Pamięć komputera - charakterystyka Położenie Procesor rejestry, pamięć podręczna Pamięć wewnętrzna pamięć podręczna, główna Pamięć zewnętrzna
Operacje 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
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Pętle. Dodał Administrator niedziela, 14 marzec :27
Pętlami nazywamy konstrukcje języka, które pozwalają na wielokrotne wykonywanie powtarzających się instrukcji. Przykładowo, jeśli trzeba 10 razy wyświetlić na ekranie pewien napis, to można wykorzystać
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Język programowania prosty bezpieczny zorientowany obiektowo wielowątkowy rozproszony przenaszalny interpretowany dynamiczny wydajny Platforma
Równoległość i współbieżność
Równoległość i współbieżność Wykonanie sekwencyjne. Poszczególne akcje procesu są wykonywane jedna po drugiej. Dokładniej: kolejna akcja rozpoczyna się po całkowitym zakończeniu poprzedniej. Praca współbieżna
Równoległość i współbieżność
Równoległość i współbieżność Wykonanie sekwencyjne. Poszczególne akcje procesu są wykonywane jedna po drugiej. Dokładniej: kolejna akcja rozpoczyna się po całkowitym zakończeniu poprzedniej. Praca współbieżna
Modele 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ść
Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?
Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz
Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
Programowanie 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
Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.
Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane
Budowa komputera Komputer computer computare
11. Budowa komputera Komputer (z ang. computer od łac. computare obliczać) urządzenie elektroniczne służące do przetwarzania wszelkich informacji, które da się zapisać w formie ciągu cyfr albo sygnału
PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),
PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ), Program 351203 Opracowanie: Grzegorz Majda Tematyka zajęć 2. Przygotowanie środowiska pracy
Przykładowe sprawozdanie. Jan Pustelnik
Przykładowe sprawozdanie Jan Pustelnik 30 marca 2007 Rozdział 1 Sformułowanie problemu Tematem pracy jest porównanie wydajności trzech tradycyjnych metod sortowania: InsertionSort, SelectionSort i BubbleSort.
Definicje. Algorytm to:
Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi
Ćwiczenie 8 Implementacja podpisu cyfrowego opartego na standardzie X.509
Ćwiczenie 8 Implementacja podpisu cyfrowego opartego na standardzie X.509 CEL: Poszerzenie wiadomości na temat podpisu cyfrowego oraz zastosowanie w praktyce standardu X.509. NARZĘDZIA: Oprogramowanie
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE WINDOWS 1 SO i SK/WIN 007 Tryb rzeczywisty i chroniony procesora 2 SO i SK/WIN Wszystkie 32-bitowe procesory (386 i nowsze) mogą pracować w kilku trybach. Tryby pracy
Programowanie Współbieżne
Programowanie Współbieżne Agnieszka Łupińska 5 października 2016 Hello World! helloworld.cu: #include global void helloworld(){ int thid = (blockidx.x * blockdim.x) + threadidx.x; printf("hello
Ję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
Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?
Kadry Optivum, Płace Optivum Jak przenieść dane na nowy komputer? Aby kontynuować pracę z programem Kadry Optivum lub Płace Optivum (lub z obydwoma programami pracującymi na wspólnej bazie danych) na nowym
ZAŁĄCZNIK Nr 3 do CZĘŚCI II SIWZ
ZAŁĄCZNIK Nr 3 do CZĘŚCI II SIWZ WYMAGANIA BEZPIECZEŃSTWA DLA SYSTEMÓW IT Wyciąg z Polityki Bezpieczeństwa Informacji dotyczący wymagań dla systemów informatycznych. 1 Załącznik Nr 3 do Część II SIWZ Wymagania
Programowanie w języku C++ Grażyna Koba
Programowanie w języku C++ Grażyna Koba Kilka definicji: Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i zasad
Metody optymalizacji soft-procesorów NIOS
POLITECHNIKA WARSZAWSKA Wydział Elektroniki i Technik Informacyjnych Instytut Telekomunikacji Zakład Podstaw Telekomunikacji Kamil Krawczyk Metody optymalizacji soft-procesorów NIOS Warszawa, 27.01.2011
Przetwarzanie równoległe
Przetwarzanie równoległe Kostka równoległe przesyłanie i przetwarzanie Rafał Malinowski, Marek Musielak 1. Cel projektu: Celem projektu było stworzenie i przetestowanie oprogramowania działającego na serwerze
Komunikator internetowy w C#
PAŃSTWOWA WYśSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie Komunikator internetowy w C# autor: Artur Domachowski Elbląg, 2009 r. Komunikacja przy uŝyciu poczty internetowej
Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.
Procesory wielordzeniowe (multiprocessor on a chip) 1 Procesory wielordzeniowe 2 Procesory wielordzeniowe 3 Konsekwencje prawa Moore'a 4 Procesory wielordzeniowe 5 Intel Nehalem 6 Architektura Intel Nehalem
Programowanie 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ć
Algorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
Temat 20. Techniki algorytmiczne
Realizacja podstawy programowej 5. 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych problemów; 2) formułuje ścisły opis prostej sytuacji problemowej, analizuje
Zadania jednorodne 5.A.Modele przetwarzania równoległego. Rafał Walkowiak Przetwarzanie równoległe Politechnika Poznańska 2010/2011
Zadania jednorodne 5.A.Modele przetwarzania równoległego Rafał Walkowiak Przetwarzanie równoległe Politechnika Poznańska 2010/2011 Zadanie podzielne Zadanie podzielne (ang. divisible task) może zostać
Architektura komputerów
Architektura komputerów Tydzień 4 Tryby adresowania i formaty Tryby adresowania Natychmiastowy Bezpośredni Pośredni Rejestrowy Rejestrowy pośredni Z przesunięciem stosowy Argument natychmiastowy Op Rozkaz
Jak 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
156.17.4.13. Adres IP
Adres IP 156.17.4.13. Adres komputera w sieci Internet. Każdy komputer przyłączony do sieci ma inny adres IP. Adres ten jest liczbą, która w postaci binarnej zajmuje 4 bajty, czyli 32 bity. W postaci dziesiętnej
Memeo Instant Backup Podręcznik Szybkiego Startu
Wprowadzenie Memeo Instant Backup pozwala w łatwy sposób chronić dane przed zagrożeniami cyfrowego świata. Aplikacja regularnie i automatycznie tworzy kopie zapasowe ważnych plików znajdujących się na
SYSTEM ZARZĄDZANIA RELACJAMI Z KLIENTEM CRM7
SYSTEM ZARZĄDZANIA RELACJAMI Z KLIENTEM CRM7 Administracja instrukcja Panel administracyjny jest dostępny z menu po lewej stronie ekranu. Użytkownicy bez uprawnień administracyjnych mają tylko możliwość
Programowanie kart graficznych
CUDA Compute Unified Device Architecture Programowanie kart graficznych mgr inż. Kamil Szostek AGH, WGGIOŚ, KGIS Wykorzystano materiały z kursu Programowanie kart graficznych prostsze niż myślisz M. Makowski
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
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,
Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska Programowanie aplikacji sieci Ethernet Przykład 1 Na podstawie: Monk S.: Arduino dla początkujących, HELION, Gliwice 2014 2 Arduino z nakładką
Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Obliczenia 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............................................
Tworzenie 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
VinCent v.1.40 zmiany w programie
VinCent v.1.40 zmiany w programie W związku z wprowadzaną ustawą RODO, nakładającą na podmioty szereg nowych obowiązków związanych z ochroną danych osobowych, wprowadziliśmy kilka zmian które mogą pomóc
Nowoczesne technologie przetwarzania informacji
Projekt Nowe metody nauczania w matematyce Nr POKL.09.04.00-14-133/11 Nowoczesne technologie przetwarzania informacji Mgr Maciej Cytowski (ICM UW) Lekcja 2: Podstawowe mechanizmy programowania równoległego
Analiza ilościowa w przetwarzaniu równoległym
Komputery i Systemy Równoległe Jędrzej Ułasiewicz 1 Analiza ilościowa w przetwarzaniu równoległym 10. Analiza ilościowa w przetwarzaniu równoległym...2 10.1 Kryteria efektywności przetwarzania równoległego...2
Instrukcja obsługi archiwów zabezpieczonych hasłem. ( na przykładzie oprogramowania 7-Zip )
Instrukcja obsługi archiwów zabezpieczonych hasłem. ( na przykładzie oprogramowania 7-Zip ) Do utworzenia zabezpieczonego archiwum użyjemy oprogamowania 7-Zip z paru powodów. Oprogramowanie to jest darmowym
PROE 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
Emil Wilczek. Promotor: dr inż. Dariusz Chaładyniak
Emil Wilczek Promotor: dr inż. Dariusz Chaładyniak Warszawa 2011 TESTY I ANALIZY Wydajności sieci celem jest sprawdzenie przy jakich ustawieniach osiągane są najlepsze wydajności, Zasięgu sieci - sprawdzanie
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia: