2010-10-24 11 views
8

Szukam kompilatora JIT lub małej biblioteki kompilatora, która może być osadzona w moim programie. Używam go do kompilacji generowanego dynamicznie kodu, który wykonuje arytmetyczną liczbę złożoną. Wygenerowany kod ma bardzo prostą strukturę: nie ma pętli, nie ma warunków warunkowych, ale może być dość długi (kilka MB po skompilowaniu przez GCC). Wydajność wynikowego kodu maszynowego jest ważna, podczas gdy ja nie bardzo zależy mi na szybkości samej kompilacji. Który kompilator JIT jest najlepszy dla mojego celu? Dzięki!Kompilatory JIT do matematyki

Szczegółowe wymagania

  • Wsparcie podwójnej precyzji złożone arithmetics numer
  • Pomoc podstawowa optymalizacji
  • wsparcie wielu procesorów (x86 i x86-64 przynajmniej) stosowanie
  • Producent SSE na obsługiwanych procesorów
  • Stos obsługi lub duży zestaw rejestrów zmiennych lokalnych
  • Interfejs ANSI-C lub C++
  • wieloplatformowym (głównie Linux, Unix)

Odpowiedz

7

Być może zechcesz rzucić okiem na LLVM.

+0

Interesujące. Patrząc teraz na to. – ssquidd

0

Brzmi jak chcesz, aby móc skompilować w locie, a następnie dynamicznie załadować skompilowany biblioteki (DLL lub .so). Zapewniłoby to najlepszą wydajność, z interfejsem ANSI-C lub C++. Zapomnij o JITing i rozważ kompilowanie kompilatora C/C++.

Zakłada to oczywiście, że można zainstalować kompilator w punkcie, w którym generowany jest dynamicznie wygenerowany kod.

+0

To jest właśnie to, co teraz robię. Do kompilacji kodu służy kompilator GCC lub Intel C, a wynikowy plik .so jest ładowany dynamicznie. Problem polega jednak na tym, że trudno jest spakować pełnowartościowy kompilator do mojego programu. Problemy z licencjami na bok, tylko część techniczna może być za dużo pracy. – ssquidd

3

Cint jest środowiskiem C++ (ish), które oferuje możliwość mieszania skompilowanego kodu i interpretowanego kodu. Jest zestaw optimization tools for the interpreter. ROOT rozszerza to jeszcze bardziej, wspierając kompilowanie i łączenie w czasie wykonywania w czasie wykonywania (patrz ostatnia sekcja http://root.cern.ch/drupal/content/cint-prompt), chociaż wydaje się, że używa kompilatora systemowego, a zatem może nie pomóc. Cały kod jest open source.

Regularnie wykorzystuję wszystkie te funkcje w ramach mojej pracy.

Nie wiem, czy aktywnie korzysta z instrukcji SIMD, ale wydaje się, że spełnia wszystkie inne wymagania.


Jak widzę, że używasz do kompilacji biblioteki dynamicznej w link na methond latać, można rozważyć TCC, choć nie wierzę, że robi wiele optymalizacji i podejrzewam, że nie obsługuje SIMD.

+0

Nie wiedziałem, że Cint faktycznie kompiluje kod do bajtu-kodu w locie. Dobrze wiedzieć. Ale spróbowałem kilku przykładów, a wydajność rozczarowuje. Generowany kod jest zwykle kilka razy wolniejszy niż kod z GCC, czasami wolniejsze rzędy wielkości. – ssquidd

+0

Zawsze przestawiałem się na skompilowany kod systemu już na samym początku i nigdy nie testowałem środowiska REPL.Jednak znalazłem [stronę, która omawia poziomy optymalizacji dostępne w kompilatorze kodu bajtowego] (http://root.cern.ch/viewvc/trunk/cint/doc/bytecode.txt). Nie wiem, czy to widziałeś. Moje dochodzenie wykazało, że jedna z funkcji, o której myślałem, że faktycznie należy do ROOT-u, zmieni się. – dmckee