2017-09-20 2 views
6

Je travaillais sur un script dans lequel j'espérais profiter de plusieurs processeurs dans ma machine en remplaçant mapM par Async.mapConcurrently.parallélisme multicœur avec pile runge

En n'observant aucune augmentation de vitesse dans cette instance, j'ai voulu vérifier que runghc peut en effet utiliser plusieurs cœurs.

Suivant un fichier Foo.hs:

import Control.Concurrent 

main = print =<< Control.Concurrent.getNumCapabilities 

Si je compile le fichier comme suit:

stack ghc -- -threaded Foo.hs 

puis exécutez comme suit:

./Foo 

il renvoie le résultat 1 . Ceci est prévu, car aucune option RTS n'a été fournie. Courir plutôt comme suit:

./Foo +RTS -N 

renvoie le nombre 6, car il y a 6 processeurs dans ma machine (en accord avec nproc).

Cependant, quand je lance le script en mode "interprété" comme ceci:

GHCRTS="-N" stack runghc Foo.hs 

Il donne le texte d'erreur suivant:

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 

Est-il possible d'utiliser plusieurs cœurs avec pile " scripts "?

Répondre

4

Merci d'avoir posé cette question, je pense que la pile doit gérer la variable d'environnement GHCRTS spécialement, et a ouvert cette question https://github.com/commercialhaskell/stack/issues/3444 et fait ce changement https://github.com/commercialhaskell/stack/pull/3445

Malheureusement, il ne résout pas ce cas, parce que lui-même runghc (GHC) va traiter GHCRTS, et il n'est pas construit avec le runtime threadé. La solution de variable d'environnement ne peut donc pas être utilisée.

Je pense qu'il devrait être possible de fournir -with-rtsopts -N drapeau à stack script --compile, mais cela ne semble pas fonctionner, a besoin d'une enquête plus approfondie. Cela ne fonctionne pas avec runghc, car il utilise l'interpréteur.