2017-09-20 66 views
6

Pracowałem nad wersją script, w której miałem nadzieję skorzystać z wielu procesorów w mojej maszynie, zamieniając mapM na Async.mapConcurrently.Paralelizm równoległy z biegunem stosu

Nie obserwując wzrostu prędkości w tym przypadku, chciałem sprawdzić, czy runghc może rzeczywiście wykorzystywać wiele rdzeni.

Biorąc plik Foo.hs:

import Control.Concurrent 

main = print =<< Control.Concurrent.getNumCapabilities 

Jeśli mogę skompilować plik następująco:

stack ghc -- -threaded Foo.hs 

a następnie uruchomić go w następujący sposób:

./Foo 

zwraca wynik 1 . Jest to oczekiwane, ponieważ nie dostarczono żadnych opcji RTS. Uruchomienie go zamiast następująco:

./Foo +RTS -N 

zwraca liczbę 6, gdyż istnieje 6 procesorów w moim komputerze (zgadzając się z nproc).

Jednak kiedy uruchomić skrypt w trybie „interpretowane” tak:

GHCRTS="-N" stack runghc Foo.hs 

To daje następujący tekst o błędzie:

Running /home/kostmo/.stack/programs/x86_64-linux/ghc-nopie-8.0.2/bin/ghc-pkg --no-user-package-db list --global exited with ExitFailure 1 

ghc-pkg: the flag -N requires the program to be built with -threaded 

Czy możliwe jest wykorzystanie wielu rdzeni ze stosu " skrypty "?

Odpowiedz

4

Dzięki za tym pytaniem, myślę stos powinien obsługiwać zmienną GHCRTS środowiskową specjalnie i otworzył ten problem https://github.com/commercialhaskell/stack/issues/3444 i dokonaniu tej zmiany https://github.com/commercialhaskell/stack/pull/3445

Niestety, to nie rozwiąże tej sprawy, ponieważ sama runghc (GHC) przetworzy GHCRTS i nie jest zbudowany z gwintowanym środowiskiem uruchomieniowym. Tak więc nie można użyć rozwiązania zmiennego środowiskowego.

Myślę, że powinno być możliwe dostarczenie flagi -with-rtsopts -N do, ale to nie działa, wymaga dalszego dochodzenia. To nie działa z runghc, ponieważ używa interpretera.