GMP

Cos'è

GNU MP, spesso abbreviata a GMP (acronimo di GNU Multiple Precision) è una libreria multipiattaforma scritta in C per aritmetica a precisione arbitraria su numeri interi, razionali e a virgola mobile. Punta a fornire l'aritmetica più veloce possibile per tutte le applicazione che hanno bisogno di una precisione maggiore rispetto a quella fornita direttamente dai tipi base del C (int, long, etc. etc.)

Molte applicazioni utilizzano solo poche centinaia di bit di precisione; ma alcuni programmi possono aver bisogno di migliaia o persino milioni di bit. GMP è progettata per avere buone performance per entrambe le necessità, scegliendo gli algoritmi in base alla dimensione degli operandi riducendo al minimo il lo sforzo di calcolo.

La velocità di GMP è ottenuta usando le fullwords come tipo aritmetico di base, usando algoritmi sofisticati, includendo codice assembly per i loop interni più comuni per molte diverse CPU, e con una generale enfasi sulla velocità (piuttosto che alla semplicità o eleganza).

Il codice assembly è attentamente ottimizzato per queste CPU: ARM, DEC Alpha 21064, 21164 e 21264, AMD 29000, AMD K6, K6-2 e Athlon, Hitachi SuperH e SH-2, HPPA 1.0, 1.1 e 2.0, Intel Pentium, Pentium Pro/II/III, Pentium 4, CPU compatibili x86 generiche, Intel IA-64, i960, Motorola MC68000, MC68020, MC88100 e MC88110, Motorola/IBM PowerPC 32 e 64, National NS32000, IBM POWER, MIPS R3000, R4000, SPARCv7, SuperSPARC, SPARCv8 generico, UltraSPARC, DEC VAX e Zilog Z8000. Ci sono alcune ottimizzazioni anche per sistemi Cray, Clipper, IBM ROMP (RT) e Pyramid AP/XP.

La GMP è distribuita sotto licenza GNU LGPL. Questa licenza permette di usare, condividere, migliorare e distribuire il tuo lavoro. La licenza dà delle libertà, ma pone anche severe restrizioni all'utilizzo con programmi non liberi.

GMP ha un suo sito web su cui troverete tutti gli ultimi aggiornamenti, novità e informazioni: http://www.swox.com/gmp.

GMP fa parte di un progetto molto più vasto: GNU. Per Altre informazioni visitate il sito ufficiale di GNU.

GMP è un software di altissima qualità, è utilizzato ad esempio da GnuPG, dalla Java Virtual Machine open source Kaffeine e anche dal blasonato Mathematica della Wolfram Research.

Come funziona

Questa sarà una semplicissima introduzione. Per i dettagli fate riferimento alla guida di GMP che trovate sul suo sito ufficiale. Contiene le descrizioni di tutte le funzioni incluse nella libreria e il loro utilizzo. È estremamente chiara e contiene tutto quello di cui avete bisogno. Quindi: prima di contattarmi per problemi controllate che la soluzione che vi serve non sia già nella guida di GMP, chiaro?

Le funzioni della libreria GMP sono divise in sei classi:

  • Funzioni aritmetiche per interi con segno, i cui nomi iniziano per mpz_. Il tipo associato è mpz_t. Ci sono circa 160 funzioni in questa categoria.
  • Funzioni aritmetiche per i numeri razionali (A/B), i cui nomi iniziano per mpq_. Il tipo associato è mpq_t. Ci sono circa 40 funzioni in questa categoria, ma le funzioni per mpz_t possono essere tutte applicate separatamente a numeratore e denominatore.
  • Funzioni aritmetiche per numeri a virgola mobile (floating-point), i cui nomi iniziano per mpf_. Il tipo associato è mpf_t. Ci sono circa 60 funzioni in questa classe.
  • Funzioni di compatibilità con la Berkeley MP. Le dll che distribuisco qui sono compilate senza il supporto di queste funzioni.
  • Operazioni veloci a basso livello. Queste funzioni sono utilizzate da quelle delle categorie precedenti per svolgere il loro compito e possono anche essere utilizzate direttamente. Il nome di queste funzioni inizia per mp_ e il tipo associato è mp_limb_t. Ci sono 30 funzioni (difficili da usare) in questo gruppo.
  • Funzioni varie, utilizzate per generare numeri casuali (n.b.: non crittograficamente sicuri) e impostare funzioni di allocazione della memoria personalizzate.

Le funzioni di GMP hanno generalmente la variabile in cui verrà registrato il risultato prima delle variabili di input della funzione. E' possibile utilizzare la stessa variabile come argomento e come destinazione di un'operazione. Ad esempio per calcolare il quadrato di una certa variabile x, di tipo mpz_t, si può utilizzare:

mpz_mul(x, x, x);

Prima di assegnare un valore ad una variabile di GMP bisogna prima inizializzarla (pena accessi alla memoria non validi) utilizzando una delle apposite funzioni di inizializzazione. Una volta terminato di utilizzarla bisogna liberare la memoria allocata utilizzando la funzione per quello scopo. Quale funzione dobbiate inizializzar dipende dal tipo della variabile, ad esempio per gli interi con segno le funzioni da utilizzare sono rispettivamente mpz_init e mpz_clear. Evitate di inizializzare e resettare inutilmente le variabili di GMP per non avere impatti negativi sulle performance. In genere dovreste inizializzare le variabili all'inizio della routine che le utilizzano e liberarle al termine.

Consultando la documentazione, vedrete che esistono molti init diversi: quello "liscio", quello per determinare da subito la dimensione in bit che avrà la variabile (in modo da allocare immediatamente lo spazio necessario), per assegnare immediatamente un valore e cos� via.

Per quanto riguarda l'utilizzo della memoria la GMP si regola così: le variabili mpz_t e mpq_t non deallocano mai memoria finchè non vengono liberate. Questa è la policy migliore in quanto evita frequenti riallocazioni della memoria. Le mpz_f hanno una dimensione fissa determinata all'inizializzazione della variabile.

Download

Utilizzare la GMP su linux, unix et similia è abbastanza semplice in quanto questi OS sono già forniti degli strumenti necessari per la compilazione dei sorgenti (bash, gcc, make, sed, ...). Questa pagina è dedicato all'uso della GMP sotto Windows, quindi non troverete nulla per gli altri OS, ma solo le dll per CPU x86 compatibili. Se utilizzate un sistema unix-like potete installare GMP con il solito mantra:

./configure
make
make check
make install

Il passaggio make check serve per effettuare dei test che controllano che la compilazione ha avuto successo e che GMP funzionerà correttamente. Tali test sono necessari poichè GMP spinge spesso al limite i compilatori e non viene compilata correttamente.

Compilare la GMP può essere piuttosto scomodo per chi utilizza Windows e non utilizza MinGW/MSYS. Potete scaricare da qui le build delle dll ottimizzate per le varie CPU e anche le librerie per il linking statico. La versione della dll che trovate qui è l'ultima disponibile mentre scrivo, la 4.2.1.

Clicca qui per iniziare il download (1176 KiB).

La build "i386" utilizza codice assembly che dovrebbe andare ragionevolmente bene su tutti i processori x86. Le dll per "i586", "pentium", "pentium MMX" vanno bene per i processori specificati (di generazione P5), ma sono considerevolmente più lenti su CPU di generazione P6, vale a dire Pentium Pro, Pentium II e Pentium III. Se la dll che volete utilizzare dovrà girare sia su sistemi con processori di generazione P5 che di generazione P6, vi conviene utilizzare la build "i386".

La dll per Pentium 4 sfrutta le istruzioni SSE2 per essere il più performante possibile. L'utilizzo di questa build su processori Pentium 4 (che tanto per la cronaca sono di generazione P7) consente un incremento delle prestazioni della GMP tra le 2 e le 3 volte rispetto alla build "i386".

Una particolare nota va alla build contenuta nella cartella "fat_binary". Il codice di quella build infatti è in grado di determinare il tipo di microprocessore su cui sta girando e seleziona automaticamente il codice più performante. Probabilmente è la scelta più conveniente se non in pochissimi casi particolari.

Installazione

L'installazione della libreria per Dev-C++ è estremamente semplice: copiate i file *.a nella cartella Dev-Cpp\lib e i file .h in Dev-Cpp\include. Se utilizzate MinGW/MSYS le cartelle da utilizzare sono mingw\lib e mingw\include.

Purtroppo il compilatore della Microsoft richiede che i file per il linking statico e dinamico siano in formato .lib (e che io sappia è l'unico compilatore con tali richieste). Se sapete come fare per generare tali file, fatemelo sapere, grazie :)

IppatsuMan v0.4