Programmare in Fortran su Raspberry PI è possibile

Fortran punched card raspberry

Per quanto oggi appaia desueto programmare in Fortran, esisterà sempre un vecchio codice da tradurre. Vediamo come gestire il problema sul PI.

Fortran è acronimo di Formula Translator, e rappresenta un linguaggi0 di programmazione: compilato e imperativo, particolarmente adatto per il calcolo numerico e la scienza computazionale.

Si tratta di uno dei primi linguaggi di programmazione, sviluppato a partire dal 1954 da un gruppo di lavoro guidato da John Backus; Il primo compilatore FORTRAN fu sviluppato a partire dal 1954 per il calcolatore IBM 704.

Un po’ di storia

Diverse sono le versioni Fortran apparse: il FORTRAN I nel 1957, il FORTRAN II nel 1958, il FORTRAN III nel 1958 (usato da una ventina di clienti dell’IBM, ma mai pubblicato come prodotto commerciale per la sua mancanza di portabilità), il FORTRAN IV nel 1961 (la versione di maggiore uso e diffusione), il FORTRAN 66 nel 1966, il FORTRAN 77 nel 1977, il Fortran 90 nel 1990, il Fortran 95 nel 1995, il Fortran 2003 nel 2003 e il Fortran 2008 nel 2008. In particolare il Fortran 90 è il primo a riconoscere la programmazione strutturata a blocchi e la ricorsione, consentendo al linguaggio di abbandonare il nomignolo di “spaghetti Fortran” che il codice si era meritato a causa deile numerose istruzioni goto utilizzate.

Fortran IBM704
Un IBM 704 con la codificatrice di schede perforate in primo piano

Oggi il Fortran è stato quasi del tutto abbandonato; come il COBOL, sopravvive in ambienti ristretti e asettici, su applicazioni accademiche di calcolo scientifico o parallelo, su schede acceleratrici speciali e in laboratori di calcolo. Ma dal momento che molti benchmark per computer furono inizialmente progettati in Fortran, potrebbe essere interessante valutare le prestazioni di una macchina utilizzando gli stessi parametri di valutazione, anziché ricorrere ad una versione di codice tradotta (e ottimizzata) in C che i primi computer non potevano permettersi.

Tra i packages rilasciati con ciascuna versione di Linux è fortunatamente presente il programma gfortran, che al pari del gcc si occupa della compilazione di codice specifico. Ovviamente sia Raspbian che Ubuntu dispongono di una versione portabile per processore ARM che oggi andremo ad esaminare.

Installazione di gfortran

Per installare il compilatore GNU Fortran sul Raspberry PI occorre seguire pochi semplici passaggi. Ovviamente il pacchetto è preso dal repository, quindi la procedura vale sia per il Raspberry OS che per le macchine con Ubuntu.

Apriamo un terminale e allineiamo il software caricato con il comando

Ora che abbiamo aggiornato il sistema con le ultime librerie, possiamo scaricare il compilatore Fortran dal repository:

Voila. Siamo pronti ad iniziare. Per sicurezza, controlliamo che l’installazione sia andata a buon fine con il comando

che ci offrirà la versione, le opzioni di compilazine utilizzate per il pacchetto, le variabili di ambiente utilizzate, la configurazione ed il compilatore.

Hello world!

E’ giunto il momento di scrivere il nostro primo programma. Come nelle migliori famiglie, anche in questo caso scrivere un “hello world” in Fortran è il modo migliore per iniziare.

Apriamo il nostro editor di fiducia, e scriviamo il seguente codice:

Salviamo il file con il nome “hello.f90” e compiliamo con

quindi lanciamo il programma con

Perché l’estensione .f90 anziché .f?

Come abbiamo detto, il Fortran ha 70 anni di storia e di evoluzioni, ma la stragrande maggioranza di codice che gira risale alle versioni FortranIV/Fortran77. Il Fortran90 ha iniziato a diffondersi dopo la presentazione di linguaggi strutturati (a blocchi) come ADA, Pascal e C, ma quasi nessuno si è preso la briga di ritradurre la vecchia base di codice sulla nuova piattaforma di compilazione, seguendo l’adagio “ciò che funziona non si cambia”.

Per convenzione, la maggior parte degli attuali compilatori Fortran selezionano lo standard di linguaggio da utilizzare interpretando il suffisso del file contenente il codice sorgente: FORTRAN 77 per .f (o meno comunemente .for), Fortran 90 per .f90, Fortran 95 per .f95. Altri standard, qualora supportati, possono essere selezionati sulla linea di compilazione attraverso il flag -std=fxx (ad esempio std=f95).

Per i più curiosi, ecco come appariva lo stesso programma in Fortran77:

In cui c rappresenta una “scheda commento” del linguaggio (anche il Fortran utilizzava le schede perforate per la programmazione…).

Salvate il programma con hello.f  compilate come sopra ed eseguite:

In questo modo avremo due file sorgente, indicati dall’estensione .f e .f90 ed i relativi eseguibili hello ed hello1.

Per i più curiosi, che volessero conoscere quali siano i comandi intrinsic della libreria di base, suggeriamo di leggere questo articolo e compilarne gli esempi.

Programmi più impegnativi

Ora che abbiamo imparato come compilare semplici programmi in Fortran, vediamo qualche esempio.

Il seguente programma, scritto in Fortran77, calcola il Massimo Comun Divisore utilizzando l’algoritmo di Euclide:

Il programma principale si occupa di richiedere i dati e di testarne la validità, quindi chiama la funzione NGCD, che cicla sin quando non si ottiene il risultato desiderato. Come nel C, la funzione restituisce un valore che viene stampato nel main. Notare la sintassi dei confronti (ad esempio NB.LE.0 per less or equal) e la gestione dell’input tramite READ.

Un altro esempio in Fortran77, un po’ più “complesso”, utilizza i numeri complessi come tipo di dato implicito:

X viene definito complesso, e viene acceduto come REAL(X) e AIMG(X). Il costrutto IF viene utilizzato per decidere se porre il segno meno (“-“) alla parte immaginaria. Notare anche i due goto impliciti contraddistinti dalle label 1 e 2.

L’output del programma è rappresentato dalla tabella seguente:

Programmazione parallela in Fortran

E passiamo a qualcosa di più “tosto”, utilizzando le features del Fortran90.

Scriveremo innanzi tutto un semplice programma per la gestione delle matrici:

I due cicli DO…END DO contengono l’input e l’output. Il tipo mat() predefinito consente di operare in automatico per righe senza necessità di nidificazione.

Ora che sappiamo come operare su vettori e matrici, vediamo come scrivere il classico crivello di Eratostene per la riceca di numeri primi.

Nella prima versione sequenziale vettorizzata avremo:

A parte la sintassi un po’ criptica, il senso è abbastanza chiaro: le operazioni che agiscono sui vettori vengono automaticamente parallelizzate ove possibile.

Si può fare di meglio? Certamente! Il codice che segue sostituisce l’isctruzione DO con una FORALL, che si occupa di parallelizzare la ricerca vettoriale su più vettori (numeri, in questo caso) contemporaneamente, rendendo peraltro il sorgente più compatto.

Considerazioni finali

Abbiamo visto come installare un compilatore Fortran sul nostro Raspberry PI, e iniziare a lavorarci in modo praticamente seamless. Il PI, con i suoi 4 cores utilizzabili, si dimostrerà un’ottima palestra per chiunque vorrà cimentarsi in modo più approfondito. Ma ovviamente non è tutto. Dal momento che il gfortran che abbiamo utilizzato è un package del repository di Ubuntu Linux, possiamo aggiungere le librerie MPI (Messasge Passing Interface) e creare un cluster di Raspberry programmabili per eseguire task distribuiti e/o paralleli in architettura NUMA, aggiungendo moduli ogniqualvolta sia necessaria maggior potenza. E dal momento che anche i SBC della serie Nvidia Jetson sono basati su Ubuntu (o possono caricarlo), nulla ci vieta di estendere le potenzialità di questi oggettini alle accelerazioni CUDA, utilizzando 128, 256 o 384 core paralleli come sistemi di calcolo attraverso le API di programmazione: infatti, oltre alle note interfacce in C, Nvidia rende disponibili le operazioni CUDA anche ai programmatori Fortran, con evidenti vantaggi dal punto di vista della gestione di codice complesso.

Niente male, vero?

 

Join our groups on Telegram…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.