Praca magisterska 2, Rok akad


1. Wstęp

Literatura

Dodatek

  1. Wstęp

    1. Wprowadzenie

Pierwsze komputery i języki programowania sięgają lat 50-tych naszego stulecia. Od tamtego czasu informatyka rozwija się bardzo szybko. Nowe technologie wytwarzania procesorów, nowe rozwiązania w budowie różnych podzespołów, nowe trendy w informatyce sprawiają, że ta dziedzina staje się coraz ważniejsza i bliższa każdemu człowiekowi. Rozpęd z jakim komputery ogarnęły świat przerósł wszelkie oczekiwania. Informatyka funkcjonuje w prawie każdej dziedzinie nauki.

Nowe badania, symulacje, testy przeprowadzane są przy użyciu komputerów. Tak ważna dziedzina jak medycyna większość nowych badań, a także nowych metod leczenia (dokonywanie operacji i zabiegów) opiera na informatyce.

Jednak każda dziedzina nauki, przemysłu ma zupełnie inne problemy i trudno te rzeczy ze sobą powiązać. Dlatego ciągle powstają nowe kierunki rozwoju w informatyce. Jednym z nich jest na pewno programowanie równoległe i rozproszone, a co z tym się wiąże to problem przetwarzania coraz większej ilości informacji w „rozsądnym czasie”, przyspieszenie działania algorytmów i programów, bardziej optymalne i równomierne rozłożenie obciążenia w całej sieci, wykonywanie jednego zadania przez grupę procesorów, komputerów. Problem ten dotyczy każdej dziedziny.

Zagadnienie przyspieszenia i poprawy pracy systemu jest zadaniem bardzo ważnym. W tym celu ciągle powstają i są rozwijane języki do programowania współbieżnego i rozproszonego. Programowanie równoległe wiąże się z szeregiem problemów. Część z nich została lepiej lub gorzej rozwiązana.

    1. Cel pracy

Celem pracy było zbadanie i ocena działania programów napisanych w języku CC++ przeznaczonym do programowania współbieżnego i rozproszonego. Zaimplementowane algorytmy zostały przetestowane pod kątem poprawności wyników i szybkości działania.

Wyniki zostały porównane z wersją sekwencyjną napisaną w C++, a jeden z programów w CC++ z programem napisanym pod systemem PVM (ang. Parallel Virtual Machine) przeznaczonym do programowania równoległego i rozproszonego. Na tej podstawie została wydana ocena przydatności języka CC++, a także ogólnie języków do programowania współbieżnego i rozproszonego.

Testy przeprowadzono na komputerze Cray CS 6400 zainstalowanym w Centralnym Ośrodku Informatyki Politechniki Warszawskiej.

    1. Organizacja pracy

Rozdział pierwszy ma charakter wstępny.

Rozdział drugi przedstawia definicje, podstawowe informacje i zagadnienia z dziedziny programowania równoległego i rozproszonego. Omówiono kilka języków współbieżnych z podaniem kluczowych informacji o każdym z nich. Wymieniono i opisano biblioteki do programowania równoległego. Komputery równoległe w tym Cray opisane zostały na końcu rozdziału.

Rozdział trzeci przedstawia język CC++. Wymienione zostały systemy operacyjne dla CC++ oraz kompilatory C++ zgodne z kodem generowanym przez preprocesor CC++. Omówiono główne idee oraz nowe instrukcje języka CC++ wraz z przykładami. Przedstawiony został krótki sposób instalacji programu CC++ oraz podany adres serwera z pełną dokumentacją i programem instalacyjnym.

Rozdział czwarty omawia sposoby i narzędzia do śledzenia wątków. Przedstawia programy do mierzenia obciążenia zarówno całego systemu, jak też każdego procesora osobno. Na podstawie tych narzędzi wykonane zostały testy zaimplementowanych algorytmów i pomiary obciążenia systemu.

Rozdział piąty wymienia napisane programy. Szczegółowo omówiono poszczególne algorytmy uzasadniając ich użycie oraz przedstawiono fragmenty kodu, które zostały zrównoleglone.

Rozdział szósty zawiera całą procedurę testowania opisanych algorytmów. Przedstawia modyfikacje kodu w celu przyspieszenia wykonania się programu oraz rezultaty zmian. Wykresy, pomiary i wnioski prezentują cechy i ocenę języka CC++.

Rozdział siódmy zawiera podsumowanie i wnioski końcowe.

  1. Podstawowe definicje i zagadnienia

    1. Program

Program jest to plik wykonywalny, utworzony zazwyczaj przy użyciu programu łączącego i znajdujący się w pamięci dyskowej. Jedynym sposobem spowodowania wykonania się programu przez system Unix jest wywołanie funkcji systemowej exec.

    1. Proces

Proces powstaje w momencie, gdy program wykonywany jest przez system operacyjny. Każdy proces ma przydzielony przez system pewien obszar pamięci. Pamięć podzielona jest na kilka części:

Każdy proces otrzymuje od procesora(-ów) pewne zasoby potrzebne do wykonywania się procesu.

    1. Wątek

Różnica między procesem a wątkiem polega przede wszystkim na sposobie wykorzystywania dostępnych zasobów. Proces w zależności od potrzeby może mieć utworzonych kilka wątków. Wątki korzystają z pamięci procesu. Wątki procesu mogą wykonywać się współbieżnie. Wątki mogą być synchroniczne lub asynchroniczne. Wątki synchroniczne same przekazują sobie sterowanie, natomiast przy asynchronicznych synchronizacja musi być oprogramowana.

    1. Program współbieżny (równoległy)

Program współbieżny składa się z procesów, które wzajemnie komunikują się i synchronizują w sposób określony przez programistę. Typowym przykładem programu współbieżnego jest system operacyjny, który składa się z wielu procesów współpracujących ze sobą i obsługujących różne zasoby systemu.

    1. Program rozproszony

Program rozproszony ma takie samo znaczenie jak program współbieżny, jednak tego terminu używa się w przypadku sieci komputerowych i systemów rozproszonych. W takich przypadkach jedynym sposobem wymiany informacji między procesami jest wysłanie komunikatu, natomiast w programie współbieżnym procesy mogą komunikować się przez zmienne globalne.

    1. Semafor

Semafor używany jest do synchronizacji procesów . Na semaforze można wykonywać tylko dwie operacje:

Dzięki tym operacjom semafor umożliwia wstrzymywanie i wznawianie procesów.

    1. Monitor

Monitor jest to zbiór zmiennych oraz procedur i funkcji, które działają na tych zmiennych. Podstawową cechą monitora jest fakt, że wykonanie procedury lub funkcji monitora jest sekcją krytyczną wykonującego go procesu. Oznacza to, że tylko jeden spośród współbieżnie działających procesów może wykonywać procedurę monitora. Oprócz tego istnieje możliwość wstrzymywania i wznawiania procesów wewnątrz procedury monitora.

    1. Sekcja krytyczna

Sekcja krytyczna zapewnia, że w danej chwili tylko jeden spośród współbieżnie działających procesów może wykonywać instrukcje objęte jej zasięgiem.

    1. Komputery równoległe

      1. Wprowadzenie

Komputery równoległe są to maszyny wieloprocesorowe wyposażone w specjalne szyny danych do szybkiego przekazywania informacji między procesorami. W zależności od ilości procesorów projektowana jest cała struktura połączeń pomiędzy nimi. Opracowywane są mechanizmy komunikacji zarówno pomiędzy poszczególnymi procesorami, jak także pomiędzy pamięcią wspólną i pamięcią lokalną (ang. cache) każdego procesora.

Odświeżanie buforów każdego procesora, podział zadania między procesory, automatyczne przekazywanie części zadania do mniej obciążonego procesora, badanie obciążenia każdego procesora, informowanie innych procesorów o zakończeniu zadania, przekazywanie danych między sobą to zadania, które muszą być rozwiązane podczas projektowania takiego komputera. Minimalizuje się ilość potrzebnych zapisów i odczytów zarówno z pamięci dyskowej, jak i globalnej (wspólnej pamięci dzielonej).

Rozbudowa takiego systemu o jeden procesor wiąże się często z przebudową całej struktury. Podwojenie ilości procesorów nie oznacza przyspieszenia pracy dwukrotnie.

Komputer wieloprocesorowy dużo czasu traci na komunikację i synchronizację między procesorami, procesami oraz pamięcią zarówno lokalną, jak globalną.

Pod zaprojektowaną architekturę komputera równoległego powstają specjalnie opracowane systemy operacyjne potrafiące maksymalnie wykorzystać moc takiego komputera. Systemy takie wyposażone są w biblioteki procedur i funkcji do obsługi wszystkich urządzeń i mechanizmów komputera. Biblioteki umożliwiają zarządzanie procesorami, pamięcią, komunikacją. Dopiero pod gotowe biblioteki i systemy operacyjne opracowywane są języki do programowania równoległego.

Programista pisząc program na maszynę równoległą musi znać mniej lub bardziej dokładnie specyfikację i budowę całego systemu w zależności od tego jakie mechanizmy będzie chciał sam oprogramować.

      1. Podstawowe informacje o komputerze Cray CS 6400

Przedstawiony komputer znajduje się na Politechnice Warszawskiej w COI (Centralny Ośrodek Informatyki). Na nim zostały przetestowane programy równoległe i sekwencyjne opisane w tej pracy.

    1. Języki równoległe

      1. Wprowadzenie

Języki równoległe zyskały uznanie i są coraz częściej stosowane w sieciach komputerowych, systemach rozproszonych, komputerach jedno i wieloprocesorowych. Mechanizmy do tworzenia nowych procesów, komunikacji między procesami, synchronizacji procesów stały się bardzo wygodne podczas programowania. Umożliwienie programowania równoległego ułatwiło programowanie w systemach rozproszonych, a także spowodowało powstanie wielu nowych algorytmów uwzględniających i wykorzystujących równoległe wykonywanie się pewnych zadań.

Wiele zagadnień i algorytmów wymagających dużej mocy obliczeniowej komputerów stara się rozbić na mniejsze części i w ten sposób wykorzystać moc obliczeniową kilku komputerów lub procesorów. Wiąże się to z nowymi trudnościami takimi jak wspólny dostęp do danych, integralność danych, odświeżanie buforów z danymi w sieciach rozległych, przekazywanie dużych ilości informacji. Ułatwienie oprogramowania komunikacji między procesami powoduje większą przejrzystość i czytelność programów, a także powoduje większą niezawodność i skuteczność.

Przedstawione poniższe języki do programowania współbieżnego mają długą historię. Problemy i nowe potrzeby dotyczące programowania równoległego są ciągle aktualne, a przykładem jest język CC++, który powstał dopiero na początku lat 90-tych.

      1. Język Pascal_C

Pascal_C powstał w Instytucie Informatyki Uniwersytetu Warszawskiego. Język ten został wzbogacony o dwie instrukcje wykonania współbieżnego cobegin, coend oraz możliwość deklarowania monitorów i procesów w taki sam sposób jak deklaruje się procedury i funkcje.

      1. Język Concurrent Pascal

Concurrent Pascal został rozszerzony o mechanizmy programowania współbieżnego. Można definiować specjalne typy: monitorowy i procesowy. W języku został zdefiniowany typ kolejkowy (ang. queue). Na zmiennych tego typu można wykonywać operacje czekania (ang. delay, wait), wznawiania (ang. continue, signal) oraz funkcję do sprawdzania czy kolejka jest pusta (ang. empty).

      1. Język Pascal Plus

Podstawowym pojęciem w Pascal Plus jest koperta (ang. envelope). Koperta ma podobne znaczenie jak monitor tzn. można w niej deklarować zmienne, procedury i funkcje z tą różnicą, że nie ma ograniczenia na ilość procesów współbieżnych korzystających jednocześnie z jej procedur.

      1. Język Modula 2

Język Modula 2 zaprojektowany został przez Wirth'a jako rozszerzenie języka Pascal. Kluczowym elementem jest pojęcie modułu. W module mogą być deklarowane zmienne, procedury, funkcje. Moduł Processes służy do programowania współbieżnego. Zawiera procedurę do tworzenia i uruchamiania nowego procesu, a także typ SIGNAL. Na zmiennych typu SIGNAL zdefiniowane są operacje czekania (ang. wait), wysłania komunikatu (ang. send), zainicjowania (ang. init). Dzięki priorytetom, które są nadawane modułowi, moduł może pełnić funkcję monitora.

      1. Język Modula 3

Język Modula 3 powstał na podstawie Modula 2 i Modula 2+. Zrezygnowano tutaj z procesów na rzecz wątków. Główną zaletą wątków jest wspólna przestrzeń adresowa. Każdy wątek ma dostęp do wszystkich danych procesu, co nie powoduje dużych narzutów czasowych podczas tworzenia nowego wątku. Wadą jest., że wszystkie operacje na zmiennych wymagają synchronizacji.

Omawiany język CC++ w głównej mierze opiera się także tylko na wątkach.

    1. Biblioteki do programowania równoległego

      1. Wprowadzenie

Biblioteki do programowania współbieżnego mogą być dołączane do programów napisanych w językach C, Fortran, rzadziej C++. Procedury zawarte w tych bibliotekach pozwalają tworzyć programy równoległe.

      1. PVM (ang. Parallel Virtual Machine)

PVM jest to zbiór bibliotek i narzędzi do programowania równoległego i rozproszonego. System PVM traktuje sieć z różnymi komputerami jako jedną maszynę. W ten sposób potrafi wykorzystać wszystkie dostępne komputery jedno i wieloprocesorowe do równoległego i rozproszonego przetwarzania. Biblioteki PVM dostępne są w trzech językach C, C++ i Fortran. PVM działa pod systemem Unix, Windows.

System PVM składa się z dwóch części. Pierwsza jest to demon pvmd3, który lokuje się na każdym dostępnym komputerze w sieci. W ten sposób buduje on jedną wirtualną maszynę. Drugą częścią systemu jest biblioteka funkcji PVM. Zawiera ona pełen zestaw procedur potrzebnych do tworzenia procesów, zarządzania i komunikowania się z nimi oraz konfigurowania maszyny wirtualnej.

Zarządzanie procesami na poziomie PVM wygląda podobnie jak w systemie Unix tzn. są grupy procesów, są procesy macierzyste i procesy potomne i każdy z nich ma unikalny identyfikator. A zatem możliwe jest usuwanie grupy, jak i pojedynczych procesów.

      1. MPI (ang. Multiprocess Interface)

System MPI działa podobnie jak PVM. PVM stosowane jest głównie do łączenia systemów rozproszonych. MPI używamy pisząc program na maszynę wieloprocesorową.

      1. BLAS (ang. Basic Linear Algebra Subprograms)

Biblioteka procedur matematycznych BLAS przeznaczona jest do operacji numerycznych w algebrze liniowej. Biblioteka składa się z trzech części. Pierwszy zbiór procedur przeznaczony jest do działań na obiektach wektor-wektor. Drugi na obiektach macierz-wektor. Natomiast trzeci na obiektach macierz-macierz. Ten trzeci zbiór często jest wykorzystywany w algorytmach działających na macierzach.

Biblioteka dopuszcza cztery typy danych, na których wykonuje obliczenia:

Wszystkie procedury BLAS pisane były z myślą o kompilatorze FORTRAN, jednak przy pewnym wysiłku można je uruchamiać także z C. Przystosowane zostały do wykorzystania mechanizmów równoległych i maszyn wieloprocesorowych. Pozwalają wykorzystać komputery równoległe bez zagłębiania się w tajniki tworzenia wątków i procesów. Procedury BLAS są napisane tak, aby w maksymalny sposób wykorzystać możliwość równoległego wykonywania algorytmów numerycznych.

  1. Język CC++

    1. Historia

Język CC++ (ang. Compositional C++) powstał na uczelni Caltech. Został stworzony przez członków Compositional Systems Research Group. Prace nad językiem częściowo finansowane były przez NSERC. Ostatnia wersja CC++ 0.4 powstała w roku 1995. Na tej wersji oparte zostały badania i testy.

    1. Wprowadzenie

Język CC++ jest rozszerzeniem języka C++ o kilka dodatkowych dyrektyw i bibliotekę funkcji do programowania równoległego i rozproszonego. Oznacza to, że przed przystąpieniem do kompilacji w C++, pewne dyrektywy z języka CC++ muszą najpierw zostać przetłumaczone na kod zgodny z C++. Dlatego kod źródłowy musi zostać przeanalizowany przez preprocesor CC++, a następnie skompilowany przez C++. Po tych dwóch operacjach otrzymujemy plik wynikowy EXE.

    1. Systemy operacyjne dla CC++

Język CC++ został zaimplementowany pod następującymi systemami operacyjnymi:

    1. Kompilatory zgodne z CC++

Preprocesor języka CC++ może generować kod dla następujących kompilatorów:

Solaris 2.3 and 2.4

AIX 3.2.5

SunOS 4.1.3

HP/UX 9.05

Każdy ze wspomnianych systemów operacyjnych musi mieć dodatkowo zainstalowany pakiet do obsługi wątków (ang. threads package).

    1. Nowe instrukcje i słowa kluczowe w CC++

Język CC++ dostarcza kilka nowych słów kluczowych. Są to tak naprawdę dyrektywy, ponieważ CC++ jest prekompilatorem do C++. Nowe instrukcje pozwalają w łatwy sposób tworzyć nowe wątki i procesy, wykonywać niektóre operacje równolegle, wykorzystywać do wykonania części zadań dodatkowe dostępne procesory i komputery w sieci.

Lista instrukcji z opisem i przykładami:

      1. Instrukcja par.

Instrukcje ujęte w bloku par będą wykonywane równolegle. Oznacza to, że dla każdego wyrażenia z tego bloku zostanie stworzony oddzielny wątek, który wykona dane wyrażenie. Jeśli jakieś wyrażenia z bloku par zostaną ujęte w klamry {..}, to dla nich zostanie stworzony jeden wątek. Pierwsza instrukcja po bloku par zostanie wykonana dopiero po zakończeniu działania wszystkich stworzonych wątków. W bloku par nie można umieszczać następujących instrukcji: goto, break, continue, return.

Przykład:

0x01 graphic

Instrukcje z bloku par zostaną wykonane równolegle. Dlatego nie wiadomo, które z dwóch przypisań wykona się jako pierwsze. Jednak efekt końcowy w tym przypadku będzie prawidłowy.

Schemat wykonania instrukcji par:

0x01 graphic

Gdyby zamiast zmiennych s1 i s2 była tylko jedna zmienna, do której chcielibyśmy zapisać zarówno jedno, jak i drugie słowo, to efekt końcowy mógłby być zupełnie inny. Wiąże się to z naruszeniem zasady dostępu (sekcja krytyczna). W dalszej części zostanie wyjaśnione jak do tego nie dopuścić.

Następujący program jest przykładem naruszającym zasadę dostępu do danych oraz budzący wątpliwości co do wyników zmiennych po bloku par:

0x01 graphic

Nie wiadomo czy najpierw wykona się przypisanie wartości zmiennym „b” i „c”, czy obliczenie wartości zmiennych „a” i „d”.

Fragment programu naruszający zasadę definiowania i zasięgu zmiennej:

0x01 graphic

W powyższym przykładzie zostaną utworzone dwa wątki. Jednak zmienna zdefiniowana w jednym wątku nie będzie widoczna (dostępna) w drugim. Zmienna „i” jest zmienną lokalną.

      1. Instrukcja parfor.

Wszystkie iteracje z pętli parfor odbywają się równolegle. Wiąże się z tym szereg ograniczeń m.in. ilość iteracji musi być znana z góry i nie można jej zmienić w trakcie wykonywania się jednej z nich. Po drugie trzeba być bardzo ostrożnym, aby nie naruszyć zasad dostępu do danych. Dodatkowo nie mogą być używane takie instrukcje jak goto, break, continue, return.

Przykład:

0x01 graphic
Przypisanie wartości do kolejnych elementów tablicy zostanie wykonane równolegle.

Schemat wykonania instrukcji parfor:

0x01 graphic

      1. Instrukcja spawn.

Instrukcja spawn uruchamia funkcję w nowym niezależnym wątku. Oznacza to, że synchronizacja między wywołaniem tej funkcji a czekaniem na pełne wykonanie się musi być zrealizowana przez program. CC++ umożliwia czekanie na zakończenie działania takiego wątku. Typowym rozwiązaniem w takim przypadku jest skorzystanie z własności zmiennych typu sync.

Używając instrukcji spawn należy pamiętać o kilku rzeczach:

Przykład 1:

0x01 graphic

Przykład 2:

0x01 graphic

      1. Słowo kluczowe sync.

Typ sync służy do synchronizacji procesów. Zmienna typu sync ma podobne własności jak zmienna typu const w C++. W obu przypadkach zmiennym takim można tylko raz przypisać wartość. Można to zrobić w momencie deklaracji zmiennej lub w trakcie wykonywania się programu. Dopóki zmiennej typu sync nie zostanie przypisana wartość, dopóty wszelkie czynności związane z odczytem, porównywaniem, itd. zostają zawieszone (zaczną być wykonywane dopiero po przypisaniu wartości tej zmiennej).

Przykład:

0x01 graphic

Jeśli zmienne a, b, c, d nie byłyby dodatkowo typu sync końcowe wyniki tych czterech operacji mogłyby być zupełnie inne, np. przez nieprawidłową kolejność wykonania się tych instrukcji (dodawanie dwóch zmiennych zanim zostanie im przypisana sensowna wartość).

Schemat wykonania się programu wykorzystującego zmienne typu sync:

0x01 graphic

      1. Funkcje z dyrektywą atomic.

Funkcje z dyrektywą atomic oznaczają, że będą wykonywane sekwencyjnie. Konsekwencją tego żadne dwie funkcje typu atomic nie mogą być wykonywane jednocześnie. Funkcji tych używa się w sekcjach krytycznych. Funkcje typu atomic mogą być deklarowane tylko jako metody klasy.

Przykład: 0x01 graphic

Celem przestawionego programu jest znalezienie wartości minimalnej w tablicy A[]. Wyszukiwanie i przypisywanie wartości minimalnej mogło być wykonywane równolegle, ponieważ funkcja check klasy Min została zadeklarowana jako atomic. Ze względu na własność dyrektywy atomic, kolejne wywołania funkcji check zostaną wykonane sekwencyjnie.

Schemat działania programu z dyrektywą atomic:

0x01 graphic

      1. Obiekt processor object.

Dotychczas omówiono instrukcje par, parfor, spawn, które działały w ten sposób, że tworzyły wątki mające dostęp do wspólnego obszaru pamięci. Oznaczało to, że komunikacja i wymiana danych między takimi wątkami niczym nie różniła się od programu z jednym wątkiem, ponieważ zmienne były dostępne i widoczne w ten sam sposób z każdego wątku. Jednak, aby zapobiec nieoczekiwanym sytuacjom należało synchronizować dostęp do danych przez zmienne typu sync lub funkcje o typie atomic.

Obiekt processor object różni się tym, że po pierwsze ma odrębną pamięć, a po drugie dostęp do danych tego obiektu jest znacznie kosztowniejszy. Obiekty te używane są w programowaniu rozproszonym. Obiekt taki może zostać uruchomiony na innej maszynie. Stąd dostęp do danych i przesyłanie ich jest czasochłonne. Typ proc_t definiuje obiekt processor object. Podczas definicji należy podać nazwę pliku wykonywalnego oraz miejsce (nazwę serwera), gdzie obiekt (program) zostanie uruchomiony.

Przykład z obiektem processor object (składa się z trzech plików):

0x01 graphic

0x01 graphic

0x01 graphic

Następnie kompilujemy pliki cc++:

0x01 graphic

Wywołanie programu dist_Hello.out:

0x01 graphic

W wyniku wywołania dist_Hello.out uruchomione zostaną trzy obiekty (procesy) Greeter na następujących maszynach: dwa na Cray1 i jeden na Cray2.

      1. Słowo kluczowe global.

W CC++ są dwa typy wskaźników: globalne i lokalne. Wskaźniki globalne (typ global) mogą odwoływać się do danych z innych obiektów processor object., natomiast lokalne tylko do danych obiektu procesora, w którym zostały utworzone. Dostęp do danych przez wskaźniki globalne jest dużo kosztowniejszy.

Wskaźniki globalne deklarowane są przez dodanie słowa kluczowego global np.

Globalne wskaźniki mogą wskazywać na typy proste (tzn. int, double, char) i struktury definiowane przez użytkownika. Wskaźniki takie nie mogą wskazywać na funkcje.

Mechanizm wywoływania funkcji z danego obiektu, pobrania lub ustawienia wartości atrybutu odbywa się na zasadzie mechanizmu RPC (ang. Remote Procedure Call). Po stronie zdalnej tworzony jest nowy wątek zarządzający całym przebiegiem operacji. Jeśli wywoływana funkcja zwraca wartość, to wynik przekazywany jest z powrotem. Wątek kończy działanie wraz z zakończeniem się funkcji.

Schemat wywołania funkcji przez mechanizm RPC:

0x01 graphic

      1. Funkcje do wysyłania i odbierania danych z obiektów processor object.

Każdy typ danej, która jest wysyłana lub odbierana z obiektu processor object musi mieć zdefiniowane operatory do transferu tego typu. Funkcje takie są automatycznie wywoływane w razie potrzeby. W CC++ są już zdefiniowane funkcje dla wszystkich typów prostych, a także do kilku dodatkowych typów m.in. do klas CCArray, VectorDouble zaimplementowanych w CC++.

Funkcja CCVoid& operator<<(CCVoid&, const TYPE& obj_in)definiuje jak typ TYPE powinien być spakowany przed przesłaniem do innego obiektu processor object. Natomiast funkcja CCVoid& operator>>(CCVoid&, const TYPE& obj_out) definiuje jak typ TYPE powinien być rozpakowany po odebraniu z innego obiektu processor object.

Programista może zaimplementować powyższe operatory dla typów danych przez niego zdefiniowanych np. dla klas, struktur. Operatory takie będą automatycznie użyte podczas transferu danych o typach prostych i złożonych.

    1. Podsumowanie nowych instrukcji w CC++

Opisane instrukcje są tylko pewnym podzbiorem języka CC++. Jednak już one wyraźnie wskazują na duże możliwości tego języka. Okazały się bardzo wygodne i skuteczne w programowaniu równoległym i rozproszonym.

Nowe mechanizmy wykorzystano w algorytmach opartych na macierzach i w sortowaniu. Warto spróbować wykorzystać je w innego typu algorytmach np. w przetwarzaniu dużej ilości rekordów w bazie danych i próbie przyspieszenia i zoptymalizowania algorytmu.

Przedstawione instrukcje i przykłady zostały zaczerpnięte z dokumentacji do języka CC++. Szczegółowe dane odnośnie języka CC++ znajdują się w plikach na serwerze ftp://ftp.compbio.caltech.edu w katalogu cc++/docs.

    1. Instalacja prekompilatora CC++

Skompilowane wersje programu CC++, kod źródłowy programu CC++ oraz dokumentacja znajdują się na serwerze ftp://ftp.compbio.caltech.edu. Na wskazany serwer należy zalogować się jako użytkownik anonymous podając jako hasło własny adres e-mail.

Translator CC++ można zainstalować na dwa sposoby:

1) Korzystając ze skompilowanej wersji programu CC++