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 "?