Folosind opțiunea rsopts ghc ca pragma

Încerc să rezolv un puzzle de algoritm în Haskell și pentru a face acest lucru am nevoie de o structură de date destul de mare. Cu toate acestea, site-ul de rezolvare a problemelor pe care mi-l prezint soluția mea, nu utilizează opțiuni de run-time pentru a permite o stivă mai mare, dar am auzit că pot folosi opțiunile de compilatoare ca pragma. Am încercat folosind pragma în codul meu:

{-# OPTIONS_GHC -O2 -rtsopts -with-rtsopts=-K32m #-}

Apoi compilați cu ghc --make algo.hs . Cu toate acestea, atunci când rulez pe mașina mea pe unele teste mari, programul se blochează cu suprapunerile de stivă și raportează că mărimea stivei actuale este de 8MB. Pe de altă parte, când compilez așa:

ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp

Programul funcționează foarte bine pe aceleași date, fără adăugarea oricăror argumente + RTS . Eu folosesc GHC 7.0.2, dar site-ul de rezolvare a problemelor foloseste 6.12.3, asa ca de preferat caut o solutie care sa functioneze si cu vechea versiune.

0

1 răspunsuri

Remember that the compilation of almost any kind of native binary consists of at least two steps: Actual object compilation (.hs -> .o), and linking (.o, .a, .lib -> executable/.exe/.so/.dll etc)

Când compilați cu aceasta:

ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp

... ceea ce se întâmplă de fapt în spatele scenei este în esență:

# object compilation - creates algo.o
ghc -c algo.hs -fforce-recomp
# linking - links together algo.o and libHSsomepackage.a into the "algo" binary
# (we assume that `algo.hs` included some module from the package `somepackage`
#  e.g. `Data.Package.Some`)
ghc -rtsopts -with-rtsopts=-K32M -o algo -package somepackage algo.o

I.E. opțiunea - make îi spune GHC să compileze automat fișierele obiect înainte de a conecta rezultatul și o umple pentru o tonă de semne. Luați notă de locurile în care se termină instrucțiunile individuale de linie de comandă.

Când specificați că pragma în partea de sus a fișierului, acesta este în schimb ce se întâmplă (cu ghc --make algo.hs ):

ghc -c algo.hs -rtsopts -with-rtsopts=-K32M
ghc -o algo -package somepackage algo.o

Pragma OPTIONS_GHC spune compilatorului despre opțiunile de adăugare a la compilarea respectivului modul specific într-un fișier obiect . Deoarece -rtsopts este o opțiune linker (îi spune GHC să se lege într-un alt set de chestii de manipulare a liniei de comandă), nu o puteți specifica atunci când compilați un fișier obiect . Trebuie să o specificați la conectare și astfel de opțiuni nu pot fi specificate în antetul unui modul.

Există două soluții:

  1. Utilizați Cabal pentru a crea materiale pentru dvs. și pentru a specifica în fișierul .cabal ce opțiuni GHC doriți
  2. Fixați-vă algoritmul astfel încât să nu aveți nevoie de spațiu de stivă, de exemplu, folosind recursivitatea cozii și mai multă strictețe în pliuri. Pentru mai multe informații, consultați wiki .
0
adăugat