2017-09-20 9 views
6

के साथ मल्टीकोर समांतरता script पर काम कर रहा था जिसमें मुझे mapMAsync.mapConcurrently के साथ mapM को स्वैप करके मेरी मशीन में एकाधिक प्रोसेसर का लाभ उठाने की उम्मीद थी।स्टैक runghc

उस उदाहरण में कोई गति वृद्धि नहीं देखते हुए, मैं सत्यापित करना चाहता था कि runghc वास्तव में एकाधिक कोर का उपयोग कर सकता है।

import Control.Concurrent 

main = print =<< Control.Concurrent.getNumCapabilities 

अगर मैं फ़ाइल संकलन इस प्रकार है::

stack ghc -- -threaded Foo.hs 

और फिर इसे चलाने के इस प्रकार है:

एक फ़ाइल Foo.hs को देखते हुए

./Foo 

यह परिणाम देता है 1 । इसकी उम्मीद है, क्योंकि आरटीएस विकल्पों की आपूर्ति नहीं की गई है। (nproc साथ सहमत हो)

./Foo +RTS -N 

संख्या 6 देता है, वहाँ के रूप में मेरी मशीन में 6 प्रोसेसर हैं: बजाय इसे चल रहा है इस प्रकार है।

हालांकि, जब मैं बहुत की तरह "व्याख्या मोड" में स्क्रिप्ट चलाने:

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 

यह ढेर के साथ कई कोर का उपयोग करना संभव है ":

GHCRTS="-N" stack runghc Foo.hs 

यह निम्न त्रुटि पाठ पैदावार स्क्रिप्ट "?

उत्तर

4

इस सवाल पूछने के लिए धन्यवाद, मुझे लगता है कि ढेर विशेष रूप से GHCRTS वातावरण चर संभाल चाहिए, और इस मुद्दे https://github.com/commercialhaskell/stack/issues/3444 खोला और https://github.com/commercialhaskell/stack/pull/3445

दुर्भाग्य से यह बदलाव किया है, यह इस मामले क्योंकि runghc ही (GHC) का समाधान नहीं होता, GHCRTS को संसाधित करेगा, और यह थ्रेडेड रनटाइम के साथ नहीं बनाया गया है। तो पर्यावरण परिवर्तनीय समाधान का उपयोग नहीं किया जा सकता है।

मुझे लगता है कि -with-rtsopts -Nstack script --compile पर ध्वज प्रदान करना संभव है, लेकिन ऐसा लगता है कि काम नहीं कर रहा है, आगे की जांच की आवश्यकता है। यह runghc के साथ काम नहीं करता है, क्योंकि यह दुभाषिया का उपयोग करता है।