Rozszerzanie składni pFortranu Implementacja elementów Fortranu 90 Daniel Rychcik Co będzie? Trochę historii Dlaczego pFortran? Cel pracy Narzędzia pFortran od środka Przebieg pracy Osiągnięcia Umiejscowienie pracy FORTRAN 66 FORTRAN 77 Fortran 90 Fortran 95 Shared Memory Message Passing SHMEM (Cray) MPI Co-Array Fortran PVM OpenMP ? pFortran HPF pFortran Minimalne rozszerzenie FORTRANU 77 Programowanie równoległe w modelu SPMD Preprocesor – nie kompilator! Tłumaczenie rozszerzeń na kod MPI pFortran Operator referencji @ • A@N=A@M A=A@N • Ograniczenia stosowania • Operator redukcji {} • SUM=+{PSUM} • Implementacja – drzewo binarne Dlaczego pFortran? Prostota !!! Łatwość nauczenia się Minimalne zmiany w istniejących programach Niezależność od biblioteki message passing Dlaczego pFortran? CALL MPI_BCAST(N,1,MPI_INTEGER, 0,MPI_COMM_WORLD) N=N@0 CALL MPI_REDUCE(myPi,Pi,1, MPI_DOUBLE_PRECISION, MPI_SUM,0,MPI_COMM_WORLD, IERR) Pi=+{myPi} IF (thisProc.EQ.0) THEN CALL MPI_SEND(B,1,MPI_BYTE,DEST,TAG, MPI_COMM_WORLD,IERR) END IF B@DEST=B@0 Fortran 90 Duże unowocześnienie języka Free-form syntax Nowe instrukcje strukturalne Procedury rekurencyjne Rozbudowane funkcje intrinsic Cel pracy Porównanie narzędzi programowania równoległego Opanowanie narzędzi pomocniczych: – – lex yacc Poznanie pFortranu „od środka” Implementacja niektórych elementów Fortranu 90 lex i yacc lex – generator analizatorów leksykalnych – – – Zajmuje się warstwą „słownikową” Wyszukuje wzorce i zamienia je na tokeny Nie analizuje „sensu” wyrażeń yacc – generator parserów gramatyki – – – Rozpoznaje struktury wyrażeń Jako wejście przyjmuje strumień tokenów Pozwala definiować akcje dla wyrażeń pFortran od środka Część większego pakietu pLanguages Interesujący nas katalog: pf/src Dwie podstawowe części preprocesora – – Analizator leksykalny: pf/src/lex Analizator składni, generator kodu: pf/src Jak te dwie części współpracują ze sobą? pFortran od środka Analizator leksykalny: Zaczerpnięty z pakietu f2c Brak dostępu do pliku źródłowego lex Wprowadzenie poprawek – ręczna analiza maszynowo wygenerowanego kodu pFortran od środka Analizator gramatyki: Również oparty o źródła f2c Zmodyfikowana gramatyka yacc Dostępny plik opisujący gramatykę Wprowadzenie poprawek – głównie praca nad definicją gramatyki Przebieg pracy „Oczyszczenie” kodu, dodanie komentarzy Analiza i wybór rozszerzeń do implementacji Wybór narzędzia i sposobu realizacji Analiza kodu źródłowego pFortranu Rozbudowa języka Dokumentacja Wprowadzone rozszerzenia Procedury i funkcje rekurencyjne Rozszerzona semantyka DO...LOOP Deklaracja IMPLICIT NONE Instrukcja wyboru SELECT…CASE Instrukcje kontroli pętli EXIT i CYCLE Nowe funkcje intrinsic: CEILING, FLOOR, MODULO itp. Postać /= operatora „różny od” Zauważone niedociągnięcia Rozsyłanie dużych struktur – Preprocesor generuje błędny kod Efektywność operacji redukcji – Zwykłe drzewo binarne zamiast hypercube Podsumowanie Zasada działania translatora – ułatwienie Budowa preprocesora - utrudnienie Reverse-engineering Metoda modyfikacji kodu Możliwość dodawania kolejnych rozszerzeń – – – Rozszerzenia deklaracji zmiennych Domyślne argumenty procedur Typy danych użytkownika Pytania