2010-10-24 16 views
8

Sto cercando un compilatore JIT o una piccola libreria del compilatore che possa essere incorporata nel mio programma. Indento di usarlo per compilare codice generato dinamicamente che esegue aritmetica di numeri complessi. Il codice generato è di struttura molto semplice: nessun loop, nessun condizionale, ma possono essere piuttosto lunghi (alcuni MB se compilati da GCC). Le prestazioni del codice macchina risultante sono importanti, mentre non mi interessa la velocità della compilazione stessa. Quale compilatore JIT è il migliore per il mio scopo? Grazie!Compilatori JIT per matematica

requisiti dettagliati

  • supporto doppia precisione numero complesso Arithmetics
  • supporto di ottimizzazione di base
  • supporto molte CPU (x86 e x86-64 almeno) uso
  • Marchio di SSE sulle CPU supportate
  • Stack di supporto o un ampio set di registri per variabili locali
  • interfaccia ANSI-C o C++
  • piattaforma Croce (principalmente Linux, Unix)

risposta

7

Si potrebbe voler dare un'occhiata a LLVM.

+0

Interessante. Guardando in questo momento. – ssquidd

0

Suona come si vuole essere in grado di compilare al volo e quindi caricare dinamicamente la libreria compilata (DLL o .so). Questo ti darebbe le migliori prestazioni, con un'interfaccia ANSI-C o C++. Quindi, dimentica JITing e considera la generazione di un compilatore C/C++ per la compilazione.

Questo ovviamente presuppone che un compilatore possa essere installato nel punto in cui il codice generato dinamicamente viene effettivamente generato.

+0

Questo è davvero quello che sto facendo ora. Sia il compilatore GCC o Intel C viene utilizzato per compilare il codice e il file .so risultante viene caricato dinamicamente. Il problema, tuttavia, è che trovo difficile compattare un compilatore a tutti gli effetti nel mio programma. Problemi di licenza a parte, solo la parte tecnica può essere troppo lavoro. – ssquidd

3

Cint è un ambiente C++ (ish) che offre la possibilità di combinare codice compilato e codice interpretato. C'è un set di optimization tools for the interpreter. ROOT estende ulteriormente questo aspetto supportando la compilazione e il collegamento in fase di esecuzione in fase di esecuzione (vedere l'ultima sezione di http://root.cern.ch/drupal/content/cint-prompt), anche se sembra che utilizzi il compilatore di sistema e quindi potrebbe non essere di aiuto. Tutto il codice è open source.

Faccio regolarmente uso di tutte queste funzionalità come parte del mio lavoro.

Non so se fa un uso attivo delle istruzioni SIMD, ma sembra che soddisfi tutti gli altri requisiti.


Per come la vedo che si sta utilizzando la compilazione di libreria dinamica al link sulla methond volo, si potrebbe considerare TCC, anche se non credo che lo fa molto ottimizzazione e il sospetto che non supporta SIMD.

+0

Non sapevo che Cint in realtà compili codice in byte-code al volo. Bello sapere. Ma ho provato alcuni esempi e la performance è deludente. Il codice che genera è in genere un paio di volte più lento di quelli di GCC, a volte più lento di ordini di grandezza. – ssquidd

+0

Mi sono sempre spostato sul codice compilato dal sistema in modo ragionevole e non ho mai eseguito il benchmark dell'ambiente REPL.Tuttavia, ho trovato [una pagina che illustra i livelli di ottimizzazione disponibili nel compilatore bytecode] (http://root.cern.ch/viewvc/trunk/cint/doc/bytecode.txt). Non so se l'hai visto. E le mie indagini hanno dimostrato che una delle funzionalità che stavo pensando appartenga effettivamente a ROOT, verrà modificata. – dmckee