C-1 ZPRACOVANI PROGRAMU VE FORTRANU Obsah 1. Uvod ....................................................... 1 2. Fortransky program na pocitaci CRAY ........................ 2 3. Priklad fortranskeho programu .............................. 3 4. Preklad a sestaveni v jednom kroku pomoci cf77 ............. 3 5. Dulezite vlastnosti a volby cf77 ........................... 4 6. Preklad pomoci cft77 ....................................... 6 7. Tiskove sestavy ............................................ 6 8. Sestaveni pomoci segldr .................................... 7 9. Spusteni programu .......................................... 8 10. Konverze fortranskeho programu na pocitac CRAY ............. 8 10.1 Vstupni a vystupni operace ................................. 8 10.1.1 Implicitne pripojene jednotky .............................. 9 10.1.2 Presmerovani I/O ........................................... 9 10.1.3 Pripojeni souboru k fortranske jednotce .................... 9 10.1.4 Prikazy OPEN .............................................. 10 10.1.5 NAMELIST I/O .............................................. 10 10.1.6 Jine nestandardni I/O prikazy a volani knihoven ........... 10 10.1.7 Delka formatovanych vet ................................... 10 10.2 Pouzivani presnosti ....................................... 10 10.2.1 Polovicni presnost ........................................ 11 10.2.2 Dvojnasobna presnost ...................................... 11 10.3 Pouzivani logickych vyrazu ................................ 11 10.4 Pouzivani maskovacich a posouvacich operatoru ............. 11 10.5 Vnitrni funkce v cft77 .................................... 12 10.6 Rozsireni ANSI Fortranu 77 ................................ 12 10.6.1 Symbolicka jmena .......................................... 12 10.6.2 Prikaz DO/END DO .......................................... 12 10.6.3 Prikaz DO WHILE/END DO .................................... 13 10.6.4 Vlozene poznamky .......................................... 13 10.6.5 Prikaz INCLUDE ............................................ 13 10.6.6 Prikaz IMPLICIT NONE ...................................... 13 10.6.7 Pole ...................................................... 13 10.6.8 Rekurzivni volani ......................................... 14 10.6.9 Pointry ................................................... 14 10.6.10 Pokracovaci radky ......................................... 14 10.6.11 Poradi prikazu ............................................ 14 10.7 Vektorizace ............................................... 14 11. Literatura ................................................ 14 1. UVOD Touto priruckou zahajilo Stredisko automatizace a vypocetni tech- niky Fyzikalniho ustavu AV CR vydavani prirucek rady C pro uzivatele pocitace CRAY Y-MP EL. Tato rada bude na uvodni urovni informovat jak o problematice prekladu, vektorizace a optimalizace fortranskych pro- gramu, tak o nekterych organizacnich a spise technickych zalezitostech (zadavani davkovych uloh, prace s tiskarnami a magnetickymi paskami, jisteni souboru apod.). Samostatne prirucky budou venovany operacnimu systemu UNICOS, editoru vi a grafickemu systemu X (X Window System). Prirucky budou k dispozici u operatorek postupne tak, jak budou vydavany. Obsah techto prirucek je dostupny i v "on-line" tvaru na obrazovce, zatim na pracovnich stanicich Sun jako soucast informacniho systemu info, ktery umoznuje pohodlne listovani pomoci menu a volby kapitol. System se spousti povelem ginfo a jeho soucasti je rovnez na- vod k pouzivani. Prirucky SAVT se volaji volbou fzinfo z hlavniho menu a volbou jmena prirucky z nasledujiciho menu. Aktualni verze prirucky ve forme vystupniho souboru z ChiWriteru 3 je pristupna vsem uzivatelum site prostrednictvim ftp na pocitaci router1@fzu.cz po zalogovani jako anonymous (jako heslo napisete Vase uzivatelske_jmeno). Doporucene parametry pro tisk na laserovou tiskar- nu z ChiWriteru 3 jsou Margin Offset: 13, Pitch: Elite, Quality: Firm- ware. V tistenem textu pouzivame az na vyjimky nasledujici konvenci pro typ pisma: to, co pise uzivatel na klavesnici, je znazorneno tucnym pismem (bold), s vyjimkou nazvu formalnich promennych, ktere jsou ve scriptu, odezva pocitace je napsana kurzivou (italics). Nove zavadene pojmy a casto i nazvy jednotlivych souboru v textu jsou psany rovnez kurzivou. Chceme uzivatelum poskytnout tyto prirucky v co nejkratsim case, a tak predpokladame, ze jejich obsah dozna zmen v jejich dalsich vyda- nich na zaklade zkusenosti, ktere se teprve rodi. Uvitame proto vsech- ny Vase pripominky jak k obsahu, tak k forme techto informaci. Muzete pouzit e-mail na adresu office@fzu.cz nebo primo na adresu autora pri- slusne prirucky. Toto je 2. vydani prirucky C-1: Zpracovani programu ve fortranu, ktere obsahuje nektere doplnky a upravy vydani prvniho. 2. Fortransky program na pocitaci CRAY Stal jste se novym uzivatelem pocitace CRAY Y-MP EL a pravdepo- dobne potrebujete prenest svuj zdrojovy program, psany pro prostredi jineho pocitace, na tento pocitac. S velkou pravdepodobnosti v nem bu- dete muset provest nektere zmeny (zvlaste zahrnuje-li nestandardni konstrukce), aby preklad na pocitaci CRAY probehl uspesne. Pokyny k tomu najdete v odst. 10. Jestlize jste jiz ve Vasem programu udelal vsechny potrebne zme- ny, muzete ho na pocitaci CRAY spustit tak jako na jinych pocitacich v nasledujicich trech krocich: . Prelozite program z puvodniho zdrojoveho tvaru (source code) do ciloveho souboru (object file). . Z ciloveho souboru sestavite proveditelny program (executable file). . Spustite, a pripadne odladite svuj program. Drive vsak nez zacnete s rutinnimi vypocty, doporucujeme Vam, abyste si zjistili spotrebovany cas a pokusili se optimalizovat a zrychlit ty casti, ktere jsou nejnarocnejsi na strojovy cas CPU. I po- merne male usili casto vede ke zkraceni vypocetniho casu o nekolik ra- du, a to Vam umozni efektivneji pocitac vyuzit. Informace o fortranske optimalizaci je predmetem prirucky C-2: Optimalizace programu ve for- tranu, kde je take podrobneji vysvetlen princip vektorizace. Casto se zde odvolavame na publikace firmy Cray Research. Jsou do- stupne v nasi knihovne CRAY, nektere z nich jsou dostupne i jako on- line dokumenty vyvolanim docview primo na pocitaci CRAY. Taktez povel man Vam umozni "listovat" v manualu UNICOS User Commands (Reference Manual) (SR-2011). Sama tato informativni prirucka, kterou prave cte- te, je prepracovanym prekladem kapitoly 7 publikace SDSC CRAY User Guide, vydane Superpocitacovym strediskem v San Diegu. Abyste vytvorili proveditelny program z fortranskeho zdrojoveho souboru, muzete provest preklad s pouzitim prekladace cft77 a sestave- ni pomoci sestavovaciho programu segldr, nebo zkombinovat tyto kroky tak, ze pouzijete cf77. Jednoznacne doporucujeme pouzit jeden povel cf77, protoze tak muzete navic vyuzit preprocesoru fpp, ktery jeste zlepsuje optimalizaci provedenou vlastnim prekladacem cft77. Povely cf77, cft77 a segldr jsou popsany v nasledujicich odstavcich. Rovnez je probrana problematika, spojena s konverzi fortranskeho kodu z jine- ho pocitace, a tez rozsireni moznosti prekladace cft77 vuci standardu ANSI Fortran 77. Poznamenejme, ze Vas program, prelozeny a sestaveny na nasem po- citaci CRAY Y-MP EL, bude spustitelny v binarnim tvaru bez dalsich uprav na kteremkoli jinem pocitaci rady CRAY Y-MP. 3. Priklad fortranskeho programu Nasledujici program series.f budeme v tomto textu pouzivat jako priklad pro demonstraci prekladu, sestaveni a spusteni fortranskeho programu. program sample integer f(100) write(6,*) 'How long a series would you like (max 100)?' read(5,*) n f(1) = 1 f(2) = 2 do 10 i = 3,n f(i) = f(i-1) + f(i-2) 10 continue write(6,*) (f(i),i=1,n) stop end Zkopirovani tohoto programu do sveho domovskeho adresare a jeho pojme- novani jmenem series.f muzete provest povelem cp /usr/SAVT_source/examples/series.f series.f ktery napisete za znak vyzvy (prompt). 4. Preklad a sestaveni v jednom kroku pomoci cf77 Povelem cf77 vyvolate vlastni prekladac cft77, sestavovaci pro- gram segldr, ale i preprocesor fpp pro predbeznou vektorizacni analy- zu. Zakladni povel k provedeni cf77 je cf77 [volby] soubory kde soubory mohou znamenat ruzne typy souboru vcetne fortranskych zdrojovych a cilovych souboru. Nevyskytnou-li se chyby, cf77 vytvori proveditelny soubor (executable file). Vice informaci o volbach v po- velu cf77 ziskate v odst. 5 nebo povelem man cf77. Abyste tedy prelozili a sestavili program series.f pomoci cf77, napisete pouze cf77 series.f 5. Dulezite vlastnosti a volby cf77 Povel cf77 umoznuje ruzne volby (options). Jelikoz cf77 muze obecne vyvolat cft77, segldr nebo preprocesor fpp, je mozne volby pro kazdy z techto programu specifikovat na povelove radce pro cf77. Uved- me nejuzitecnejsi z nich: -c pro pripad, ze soubory maji byt prelozeny, nikoliv vsak se- staveny. Misto proveditelneho souboru bude vytvoren pre- mistitelny (relocatable) soubor.o, casto tez nazyvany cilovy soubor. -l seznam-knihoven specifikuje knihovny, ktere maji byt navic pripojeny k Vasim cilovym souborum. Oddeluji se carkami a musi se popsat vcetne cesty k nim (pathname). Vyjimka nasta- va, je-li knihovna umistena v adresari /usr/lib a ma jmeno ve tvaru libjmeno.a. V tomto pripade muzete misto vypsani cesty specifikovat knihovnu pouhym -l jmeno. -o proveditelny-soubor specifikuje jmeno proveditelneho soubo- ru. Implicitni predvolba je a.out. -g pripravi symbolicke tabulky pro ladici prostredek cdbx, pri- cemz jsou vsak automaticky potlaceny vsechny optimalizace. -Zv vyvola preprocesor fpp (Fortran dependence analyzer). Pouzi- ti teto volby muze vyznamne zrychlit chod programu. -ZV zpusobi totez jako predchozi volba, navic vsak zachova sou- bor s implicitnim jmenem soubor.m, ktery je produktem pre- procesoru fpp. Je to v podstate nas zdrojovy soubor.f s vy- znacenymi direktivami pro cft77, pripadne dalsimi zmenami pro plne vyuziti vektorizace. -Wd"fpp-retezec" preda argumenty preprocesoru fpp, pricemz fpp-retezec musime uvest ve dvojitych uvozovkach. Nektere dulezite volby pro fpp jsou tyto: -l tiskovy-soubor umoznuje preprocesoru fpp zachovani tiskove sestavy pod timto jmenem. -e retezec umoznuje (enable) nebo -d retezec znemoznuje (disable) volby specifikovane v retezci. Nejpouzivanejsi volbou je: 6 umoznuje rozvoj (in-line expansion) volanych podprogramu do smycky, ze ktere jsou volany -Wf"cft77-retezec" predava argumenty fortranskemu prekla- daci cft77, pricemz cft77-retezec je uzavren v uvozov- kach. Nektere dulezite volby pro cft77 jsou: -a alokace urcuje zpusob prideleni (alocation) pame- ti, pricemz alokace muze byt static kdy cela pamet je pridelena (aloko- vana) staticky. Tato volba vytvari rych- lejsi a bezpecnejsi proveditelny soubor a nevyhovuje pouze pri pouzivani rekur- zivnich podprogramu. stack kdy vsechny polozky jsou v zasobniku (stack), s vyjimkou polozek v prikazu DATA nebo SAVE nebo v COMMON blocich. Tato volba je implicitni. -e retezec umoznuje nebo -d retezec znemoznuje volby vyjmenovane v retezci, pricemz retezec muze byt kombinaci moz- nych voleb. Bezne uzivane volby jsou: m umoznuje vytvoreni tiskove sestavy (source listing) s vyznacenymi smyckami. Vystup je zapsan do souboru soubor.l, je-li soubor.f jmeno prekladaneho zdro- joveho souboru. Implicitni predvolba je znemozneni. x vytvari tabulku krizovych odkazu (cross- references) v tiskove sestave soubor.l. Implicitni predvolba je znemozneni. p dovoluje dvojitou presnost (je implicit- ne predvoleno, pro potlaceni tedy pouzi- jeme -dp) -Rbc umoznuje kontrolu mezi u poli a kontrolu pri- pustnosti (conformance) vyrazu s poli. Objevi-li se v prubehu prekladu problem, preklad je ukoncen. Stane-li se to v prubehu vypoctu, je vydano hlase- ni, avsak vypocet pokracuje. Tato volba muze velmi podstatne prodlouzit vypocetni cas. Neni implicit- ne predvoleno. -m msglev urcuje nejnizsi uroven vydavanych hlaseni prekladace, pricemz uroven 0 je comment, 1 je no- te, 2 je caution, 3 je warning a 4 je error (uro- ven 4 vsak nelze potlacit). Implicitni predvolba je 3. Vysvetleni ruznych hlaseni on-line ziskate povelem explain cft77-cislo-hlaseni. -o optim urcuje uroven optimalizace prekladace a ma rozmanite volby. Kazda z voleb (s vyjimkou off) muze byt opatrena prefixem no. Nejuzivanejsi volby jsou tyto: aggress urcuje agresivni optimalizaci a muze prodlouzit dobu prekladu. Implicit- ni predvolba je noaggress. scalar umoznuje plnou skalarni optimaliza- ci. Implicitni predvolba je scalar. vector umoznuje skalarni optimalizaci a vektorizaci. Predvolba je vector. off vypina veskerou optimalizaci a vekto- rizaci. Implicitni predvolbou je optima- lizace a vektorizace zapnuta. -Wl"segldr-retezec" predava argumenty spojovacimu programu segldr, pricemz opet segldr-retezec musi byt uveden v uvo- zovkach. Nejpouzivanejsi volby jsou: -o proveditelny-soubor pro specifikaci jmena proveditel- neho modulu. -l seznam-knihoven pro specifikaci knihoven, ktere maji byt sestaveny spolecne s Vasimi cilovymi soubory. Obe tyto volby vsak uvedeme nejspise jako parametry primo pro cf77, takze pak volbu -Wl vubec nepouzijeme. Jmena souboru souvisejicich s cf77 jsou tato: soubor.f specifikuje zdrojovy soubor, ktery ma byt prelo- zen soubor.m specifikuje produkt preprocesoru fpp soubor.l specifikuje tiskovou sestavu prekladace soubor.o specifikuje premistitelne binarni soubory, ktere maji byt sestaveny (cilove soubory) soubor.x je doporucene jmeno proveditelneho modulu Doporucujeme Vam v beznych situacich pouzivat prekladace cf77 s temito volbami: cf77 -Zv -Wd"-e6" -Wf"-emx -dp -a static -o aggress" -o Tuto kombinaci voleb muzete mit ulozenu v souboru .cshrc jako alias cfg, takze preklad a sestaveni souboru series.f provedeme pak takto: cfg series.x series.f 6. Preklad pomoci cft77 Vyjimecne muzete potrebovat zdrojovy program pouze prelozit. Za- kladni povelova radka pro cft77 je cft77 [volby] soubor.f kde soubor.f specifikuje zdrojovy soubor obsahujici Vas fortransky program, a volby jsou volby pro prekladac, popsane podrobne prikazem man cft77. Abychom prelozili program series.f, napiseme povel cft77 series.f Neni-li specifikovano jinak, prekladac vytvari cilove soubory s pripo- nou .o, v nasem pripade tedy series.o. Znovu vsak doporucujeme pouzi- vat souhrnny prekladac cf77, umoznujici volani preprocesoru fpp. Ne- chceme-li sestavit proveditelny soubor, uzijeme pro cf77 jiz zminene volby -c. 7. Tiskove sestavy Tiskova sestava soubor.l obsahuje protokol o prekladu, tj. ocis- lovane radky zdrojoveho souboru a diagnostickou informaci s pripadnymi chybovymi hlasenimi. Smycky jsou graficky oznaceny, byly-li vektorizo- vany, rozvinuty nebo zpracovany skalarne. Zdrojovy program je doplnen direktivami, dodanymi preprocesorem fpp, pripadne jsou urcite useky zameneny za optimalizovane knihovni podprogramy. Podle volby je sesta- va doplnena o tabulku krizovych odkazu. Pro rozsahlejsi programy muze byt uzitecna velmi podrobna tiskova sestava, ktera je vystupem povelu cflist soubor.f Obsahuje podrobne tabulky pouzitych promennych, argumentu v podprogra- mech, informace o vektorizovanych smyckach, krizove odkazy, a tez zpravy na urovni varovani (considerata report) o nepouzitych nebo ne- definovanych promennych apod. Jsou uvedeny i ruzne statistiky o vysky- tech a uziti jednotlivych promennych, o procentu vektorizace smycek na urovni jednotlivych podprogramu i celeho programu. Povel cflist zpracovava pomocny informacni soubor.T. Aby byl ten- to soubor vytvoren, je nutno pro prekladac cft77 zadat volbu -ca. Bo- huzel povel spravne funguje, neni-li vyvolan preprocesor fpp. (Toto omezeni muzete obejit tak, ze si produkt preprocesoru soubor.m prejme- nujete na soubor.f, kdyz jste si predtim puvodni soubor.f nejak docas- ne prejmenovali). Za ucelem vytisteni musite samozrejme standardni vy- stup povelu (stdout) presmerovat do nejakeho pojmenovaneho souboru, ktery pak vytisknete. Obdobnym zpusobem pracuje povel cflint soubor.f jehoz vystup je podmnozinou vystupu povelu cflist (obsahuje pouze zpravy na urovni varovani). Pracujete-li v grafickem systemu X (X Window System), mame pro interaktivni analyzu zdrojoveho programu k dispozici nastroj xbrowse, ktery bude popsan v prirucce C-8: Graficky system X. 8. Sestaveni pomoci segldr Cilove soubory vytvorene prekladacem sestavime spolu s knihovnami do proveditelneho souboru spojovacim programem (loader). Operacni sys- tem UNICOS podporuje firemni spojovaci program segldr (segment loader) a standardni UNIXovsky spojovaci program ld. Doporucuje se uzivat segldr, protoze ten ma navic nektere povelove volby specificke pro prostredi UNICOS. Zakladni povelova radka pro segldr je segldr [volby] soubor1.o soubor2.o ... souborn.o kde soubor1.o, soubor2.o az souborn.o specifikuji cilove soubory, kte- re maji byt sestaveny. V nasem prikladu sestavite proveditelny soubor takto: segldr series.o Implicitni jmeno proveditelneho souboru je a.out. Nasledujicim prika- zem pojmenujete proveditelny soubor jmenem series.x: segldr -o series.x series.o Volby pro segldr jsou tytez, ktere jsme jiz uvedli v odst. 5 jako volby pro segldr-retezec ve volbe -Wl. Vice informaci o segldr najdete v manualu [2] nebo je ziskate povelem man segldr. 9. Spusteni programu Chcete-li spustit program po jeho sestaveni, napisete jednoduse za prompt jeho jmeno. Mate-li programy segldr nebo cf77 vytvoren pro- veditelny soubor s implicitnim jmenem a.out, spustite tento program pouhym napsanim a.out Mate-li nas cvicny program prejmenovan na series.x, napisete series.x Chcete-li, aby program bezel na pozadi (background), pripojite & na konec povelove radky: series.x & Tento zpusob vsak pouzivejte vyjimecne a jen pro kratke programy. Jestlize se totiz odlogujete drive, nez Vas program na pozadi skoncil, bude tim ukoncen. Chcete-li, aby program pokracoval i po Vasem odlogo- vani, musite pouzit davkoveho rezimu (batch system) s pouzitim NQS. Pro ucely ladeni a hledani chyb je mozne interaktivni sledovani prubehu vypoctu povelem cdbx series.x coz vsak predpoklada, ze preklad byl proveden s volbou -g (viz odst. 5). O pouziti cdbx bude vydana prirucka C-3: Ladeni programu ve for- tranu. 10. Konverze fortranskeho programu na pocitac Cray Standardni fortransky program pripraveny pro jiny pocitac obecne nemusi byt modifikovan, aby na nasi instalaci pocitace Cray fungoval. Nicmene ma-li Vas program nestandardni fortranske prikazy, bude asi pro prekladac cf77 vyzadovat urcite upravy. Volba -en v cft77-retezci v prikazu cf77 Vam tato mista ve zdrojovem programu pomuze identifiko- vat. V nasledujicich odstavcich jsou naznaceny doporucene kroky pri kontrole Vaseho programu. 10.1 Vstupni a vystupni operace Konvertujete-li program pro pocitac CRAY, vetsina Vasi prace muze spocivat v konverzi vstupnich a vystupnich (I/O) prikazu. Jedna z moz- nosti je uzivat standardnich fortranskych prikazu OPEN a CLOSE k pri- pojeni a odpojeni datovych souboru (viz odst. 10.1.4), a standardnich prikazu READ a WRITE k prenosu dat. Jine moznosti jsou popsany v odst. 10.1.1 a 10.1.2. 10.1.1 Implicitne pripojene jednotky Cisla pro I/O jednotky ve fortranskem programu musi byt v rozmezi 0 - 102. Jednotky se otevrou bud explicitne, nebo je implicitne ote- vre prvni odkaz I/O. Jednotky 100, 101, 102 jsou napevno pripojeny ke standardnim unixovskym souborum stdin, stdout a stderr. Nasledujici tabulka ukazuje automaticka prirazeni souboru (pro vstup, vystup a chyby) a priklad pouziti kazde z techto jednotek: u--------------------------------------------------------------------o p Jednotka Implicitni pouziti Priklad pouziti p u--------------------------------------------------------------------o p 100 Standardni vstupni soubor (stdin) READ(100,*), READ(*,*) p p 101 Standardni vystupni soubor (stdout) WRITE(101,*), PRINT* p p 102 Standardni chybovy soubor (stderr) WRITE(102,*) p [--------------------------------------------------------------------] Namisto I/O jednotek 100, 101 a 102 muzete pouzit i beznejsich jednotek 5, 6 a 0 pro stdin, stdout a stderr s tim rozdilem, ze jed- notky 5, 6 a 0 lze primo pripojit i na jine soubory nez stdin, stdout a stderr. 10.1.2 Presmerovani stdin, stdout, stderr Nasledujici priklady ukazuji presmerovani standardnich unixov- skych souboru stdin, stdout a stderr v C-shellu (v ostatnich shellech je presmerovani I/O ponekud rozdilne): 1. a.out 2. a.outvystypni-soubor 4. a.outvystupni-soubor 5. a.out&vystupni-a-chybovy-soubor 6. a.outvystupni-soubor>&chybovy-soubor V prikladu 1 se cte z terminalu a pise se na nej. V prikladu 2 se cte ze vstupniho-souboru. V prikladu 3 se pise na vystupni-soubor. V pri- kladu 4 se cte ze vstupniho-souboru a zapisuje do vystupniho-souboru. V prikladu 5 se cte ze vstupniho-souboru a standardni chybovy soubor (stderr) spolu se standardnim vystupem (stdout) jsou zapisovany do vystupniho-a-chyboveho-souboru. V prikladu 6 se cte ze vstupniho- souboru, stderr se zapisuje do chyboveho-souboru a stdout do vy- stupniho-souboru. 10.1.3 Pripojeni souboru k fortranske jednotce Vsechny zbyle jednotky (1 - 4, 7 - 99) lze pouzit, aniz se pri- slusny soubor explicitne otvira. Napr. prikaz WRITE(19,*) zapisuje im- plicitne do souboru fort.19, a prikaz READ(12,*) cte implicitne ze souboru fort.12 bez pouziti prikazu OPEN. Chcete-li pripojit jednotku 19 primo k souboru jineho nez impli- citniho jmena (bez pouziti prikazu OPEN), pouzijete prikaz assign. Na- pr. chcete-li urcit, ze vystup na jednotce 19 ma byt zapsan do souboru data.out, napisete assign -a data.out u:19 Vice informaci o assign se dozvite povelem man assign. Prikaz assign lze obecne pouzit pro vsechny jednotky 0 - 99; protoze vsak knihovny ci graficke systemy obecne pouzivaji jednotek I/O mezi 1 a 10, doporu- cujeme Vam pouzivat cisel jednotek I/O v rozmezi 11 az 99. Pro praci se standardnimi soubory doporucujeme pouzivat oznaceni * (viz odst. 10.1.1). 10.1.4 Prikaz OPEN Implementace prikazu OPEN v cft77 vyhovuje standardu ANSI. Dale zahrnuje nekolik rozsireni, napr. parametr POSITION. Ten urcuje pozici souboru pri jeho otvirani a pouziva se nasledovne: POSITION=p kde p je REWIND (je predvoleno implicitne) pro nastaveni na zacatek souboru, nebo APPEND pro nastaveni souboru na polohu tesne pred jeho koncem. 10.1.5 NAMELIST I/O NAMELIST I/O je nestandardni fortransky prikaz. Presto vetsina fortranskych prostredi, UNICOS v to pocitaje, ho v nejakem tvaru pod- poruje. Pouzivate-li tedy NAMELIST, zkontrolujte si jeho pouziti, zda je v souladu s implementaci pod UNICOSem. Podrobnosti naleznete v ma- nualu [1]. 10.1.6 Jine nestandardni I/0 prikazy a volani knihoven Rozsireni vzhledem ke standardnimu I/O prostredi jsou ve vetsine fortranskych prostredi bezna. Neprekvapuje ani, ze tato rozsireni jsou pro kazde z techto prostredi jina. S nejvetsi pravdepodobnosti si vsechny nestandardni I/O prikazy ze sveho programu odstranite. Odrazu- jeme Vas od jejich pouzivani snad s jedinou vyjimkou, ma-li I/O opti- malizace primarni dulezitost. O ruznych rozsirenich ke standardnim prikazum I/O, pripustnych v operacnim systemu UNICOS, se dozvite v ma- nualech [1] a [3]. 10.1.7 Delka formatovanych vet Nespecifikujete-li jinak, muzete cist i zapisovat formatovane ve- ty pouze do delky 267 znaku. Jak lze toto omezeni obejit se doctete v manualu [1] v odst. 7.22. 10.2 Pouzivani presnosti Implicitni velikost pro jednoduchou presnost realnych cisel v po- hyblive carce je 64-bitove (8 Bytove) CRAY slovo s 48-bitovou manti- sou, coz odpovida presnosti cca 14 platnych dekadickych cislic. Pripo- menme, ze tato velikost slova cini jednoduchou presnost na pocitaci CRAY rovnocennou dvojnasobne presnosti na 32-bitovych pocitacich (na- pr. SIEMENS 7536). 10.2.1 Polovicni presnost Prekladac cft77 nepodporuje polovicni presnost, takze pozadavek zobrazit cislo jen ve ctyrech bytech ma stejny ucinek jako implicit- nich osm bytu na cislo. Tudiz nasledujici prikazy jsou pro cft77 ekvi- valentni: REAL X1,X2 REAL*8 X1,X2 REAL*4 X1,X2 10.2.2 Dvojnasobna presnost Cisla v dvojnasobne presnosti (se zhruba 28 platnymi cislicemi) nejsou obvykle nezbytna. Navic podstatnym zpusobem zpomaluji beh pro- gramu. Abyste svuj program zrychlili, zmente promenne z dvojnasobne presnosti na jednoduchou. Prejete-li si vsak ponechat svuj program v jeho puvodnim tvaru s dvojnasobnou presnosti tak, aby zustal prenosi- telny, pouzijte prekladac cft77 nebo cf77 s volbou -dp. Ta zamezi uzi- ti dvojnasobne presnosti tim, ze konvertuje vsechny deklarace dvojna- sobne presnosti na deklarace jednoduche presnosti a zameni volani fun- kci ve dvojnasobne presnosti jejich ekvivalenty v jednoduche presnosti (zkusenosti vsak ukazuji, ze takto prelozeny program bezi pomalu, a doporucuje se tedy vsechny explicitni deklarace dvojite presnosti ruc- ne odstranit). Tuto volbu vsak kazdopadne nepouzivejte v pripade, za- visi-li logika Vaseho programu na velikosti slova daneho pocitace (na- pr. pouzivate-li prikazu EQUIVALENCE pro promenne ve dvojnasobne a jednoduche presnosti). Potrebujete-li presto dvojnasobnou presnost, vyzadate si ji ne- kterou z techto deklaraci: DOUBLE PRECISION X1,X2, ... REAL*16 X1,X2, ... 10.3 Pouzivani logickych vyrazu Vnitrni (numericke) hodnoty .TRUE. a .FALSE. nejsou v ruznych prekladacich stejne. Abyste se vyhnuli neocekavanym vysledkum pri kon- verzi Vaseho programu, prirazujte logicke hodnoty pouze primo (nikoli cislem), napr. LOGICAL MYVAR,YOURVAR MYVAR=.TRUE. YOURVAR=.FALSE. 10.4 Pouzivani maskovacich a posouvacich operatoru Prekladac cft77 poskytuje vnitrni funkce pro maskovani (masking) a posuv (shifting) (podrobnosti najdete v manualu [1]), rovnez tak standardni booleovske funkce. Prohlednete si peclive vsechny maskovaci a posouvaci operace ve svem programu, ktere byly napsany pro jiny po- citac. Pozornost si zaslouzi zejmena: . Vymazani nadbytecnych bitu. . Rozdily v delce slova mezi jinymi pocitaci a 64-bitovym pocita- cem CRAY. . Syntaxe pro specifikaci logickych (booleovskych) konstant. V cft77 jsou oktalove konstanty specifikovany priponou "b" na konci retezce oktalovych cislic (napr. 17777b). Hexadecimal- ni konstanty jsou specifikovany uzavrenim konstanty mezi jednoduche uvozovky a umistenim predpony "x" pred retezec (napr. x'ffff'). . Rozdil mezi kruhovymi posuvy (circular shifts) (bity se "toci" okolo) a logickymi posuvy (logical shifts) (bity jsou "zaha- zovany"). . Poradi bytu: CRAY, ktery je tzv. Big Endian Machine, ma opacne poradi bytu ve srovnani s nekterymi jinymi pocitaci, napr. DEC VAX, ktery je tzv. Little Endian Machine. To muze byt problem, prenasite-li binarni soubory zapsane na jinych po- citacich, nebo pouzivate-li prikaz EQUIVALENCE pro promenne znakovych a numerickych typu. 10.5 Vnitrni funkce v cft77 Prekladac cft77 nabizi standardni vnitrni funkce a poskytuje na- vic nektere vnitrni funkce, ktere jsou rozsirenim standardu ANSI. Vsechny tyto vnitrni funkce jsou shrnuty v Apendixu B v manualu [1]. Vznikl-li Vas program na systemu IBM, urcite zmente trigonometricke funkce, napr. ARSIN na ASIN, ARCOS na ACOS atp. 10.6 Rozsireni ANSI Fortranu 77 Prekladac cft77 podporuje mnoha rozsireni, ktera nejsou soucasti standardu ANSI pro Fortran 77 a jsou vetsinou navrzena pro Fortran 90 [4]. Nektera z techto rozsireni nyni popiseme. Doporucujeme je vsak uzivat opatrne, protoze nemusi byt nutne dostupna v prostredich jinych pocitacu, na ktere pripadne budete svuj program prenaset. Vice infor- maci o rozsirenich pro cft77 najdete opet v manualu [1]. 10.6.1 Symbolicka jmena Symbolicka jmena v cft77, identifikujici promenne, konstanty, funkce, COMMON bloky, podprogramy a externi procedury, mohou mit 1 - 31 alfanumerickych znaku (standard ANSI pro Fortran 77 je 1-6 alfanu- merickych znaku) vcetne $ a _ (podtrzeni). Velka a mala pismena jsou zamenna (s vyjimkou vyskytu ve znakovych retezcich). 10.6.2 Prikaz DO/END DO Navesti v prikazech DO je volitelne (nepovinne). Smycka DO bez navesti musi byt pak zakoncena prikazem END DO, jako napr. DO I = 1,100 A(I) = B(I) + C(I) END DO 10.6.3 Prikaz DO WHILE/END DO Prikaz DO WHILE dovoluje provadeni smycky, je-li logicky vyraz pravdivy, jako napr. FLAG = .TRUE. I = 1 DO WHILE (FLAG) A(I) = B(I) + C(I) IF (A(I).GT.D(I)) FLAG = .FALSE. I = I + 1 IF (I.EQ.1000) GO TO 10 END DO 10 CONTINUE 10.6.4 Vlozene poznamky Navic ke standardnimu fortranskemu prikazu pro poznamku, cft77 podporuje vlozene poznamky (embedded comments). Vlozenou poznamkou se rozumi poznamka, ktera je na stejne radce jako je fortransky prikaz. Vlozena poznamka zacina vykricnikem "!" a libovolny text po ! je pak chapan jako poznamka. 10.6.5 Prikaz INCLUDE Prekladac cft77 podporuje prikaz INCLUDE, ktery umoznuje prekla- daci cist fortranske prikazy z jineho nez zdrojoveho souboru, specifi- kovaneho jako vstup do prekladace. To je uzitecne napr. pri duplikaci deklaraci v COMMON blocich. Tvar prikazu je INCLUDE 'jmeno-souboru' kde jmeno-souboru je uplne jmeno souboru (tj. vcetne cesty), ktery ma byt zahrnut do zdrojoveho programu. 10.6.6 Prikaz IMPLICIT NONE Prekladac cft77 podporuje prikaz IMPLICIT NONE, ktery zabranuje uziti implicitniho urceni typu promenne a vyzaduje deklaraci vsech promennych a externich funkci v programu. Prikaz IMPLICIT NONE plati pouze v programove jednotce, ve ktere se vyskytuje, a musi byt prvnim specifikacnim prikazem. 10.6.7 Pole Prekladac cft77 umoznuje psat aritmeticke a relacni vyrazy s poli a castmi poli (array sections) (napr. s radky matice). Tyto konstrukce jsou popsany v manualu [1]. Umoznuje tez pouzivani aktualnich poli s promennymi mezemi (automatic array). 10.6.8 Rekurzivni volani Prekladac cft77 dovoluje rekurzivni volani podle navrhovaneho standardu pro ANSI Fortran [4]. Ke specifikaci rekurzivni subrutiny nebo funkce uzijeme predpony RECURSIVE, napr. RECURSIVE SUBROUTINE SORT(A) cimz se umozni, aby subrutina nebo funkce volala sama sebe. 10.6.9 Pointry Prekladac cft77 podporuje prikaz POINTER. Prikaz POINTER deklaru- je promennou jako pointer a jinou jako pointee. Hodnota pointeru je adresou promenne pointee. Deklarace POINTER ma tvar POINTER (p,a) [,(p,a)] ... kde p je pointer a a je pointee odpovidajici p. 10.6.10 Pokracovaci radky Prekladac cft77 pripousti az 99 pokracovacich radek, cimz je umoznena prenositelnost z pocitacu IBM. 10.6.11 Poradi prikazu Prekladac cft77 vyzaduje urcite poradi prikazu pro deklarace, formaty, vykonne prikazy apod. Napr. deklarace a jine specifikacni prikazy se nemohou vyskytovat za vykonnymi prikazy. Podrobnosti najde- te v manualu [1]. 10.7 Vektorizace Prekladac cf77 provadi automatickou analyzu smycek DO, a tam, kde je to mozne, je vektorizuje. Vice informaci o vektorizaci najdete v prirucce C-2: Optimalizace programu ve fortranu. 11. Literatura [1] CF77 Compiling System, Vol.1: Fortran Reference Manual (SR-3071) [2] Segment Loader (SEGLDR) and ld Reference Manual (SR-0066) [3] Fortran Library Reference Manual (SR-2079) [4] M.Metcalf, J.Reid: Fortran 90 Explained (Oxford University Press 1990)