खोज…


पैरामीटर

प्रकार / समारोह विस्तार
data Eval a एवल एक मोनाड है जो समानांतर रणनीतियों को परिभाषित करना आसान बनाता है
type Strategy a = a -> Eval a एक फ़ंक्शन जो एक समानांतर मूल्यांकन रणनीति का प्रतीक है। फ़ंक्शन इसके तर्क के कुछ हिस्सों (अंशों) का पता लगाता है, जो समानांतर या अनुक्रम में सबएक्सप्रेस का मूल्यांकन करता है
rpar :: Strategy a अपने तर्क को चिंगारी (समानांतर में मूल्यांकन के लिए)
rseq :: Strategy a कमजोर सामान्य सिर के लिए अपने तर्क का मूल्यांकन करता है
force :: NFData a => a -> a अपने तर्क की पूरी संरचना का मूल्यांकन करता है, तर्क को वापस करने से पहले इसे सामान्य रूप में कम करता है। यह Control.DeepSeq मॉड्यूल द्वारा प्रदान किया गया है

टिप्पणियों

सिमोन मार्लो की पुस्तक , कॉन्सल्ट और पैरलल प्रोग्रामिंग इन हास्केल, बकाया है और अवधारणाओं की एक भीड़ को कवर करती है। यह भी नवीनतम हास्केल प्रोग्रामर के लिए बहुत अधिक सुलभ है। यह अत्यधिक अनुशंसित है और मुफ्त में पीडीएफ या ऑनलाइन में उपलब्ध है।

समांतर बनाम समवर्ती

साइमन मार्लो इसे सबसे अच्छा कहते हैं :

एक समानांतर प्रोग्राम वह है जो कम्प्यूटेशनल हार्डवेयर (जैसे, कई प्रोसेसर कोर) की बहुलता का उपयोग करता है ताकि एक कम्प्यूटेशन को और अधिक तेज़ी से किया जा सके। उद्देश्य एक ही समय में निष्पादित करने वाले विभिन्न प्रोसेसर के लिए अभिकलन के विभिन्न भागों को सौंपकर, पहले उत्तर पर पहुंचना है।

इसके विपरीत, संगामिति एक प्रोग्राम-स्ट्रक्चरिंग तकनीक है जिसमें नियंत्रण के कई सूत्र हैं। वैचारिक रूप से, नियंत्रण के धागे "एक ही समय में" निष्पादित होते हैं; अर्थात्, उपयोगकर्ता उनके प्रभावों को देखता है। चाहे वे वास्तव में एक ही समय में निष्पादित हों या नहीं एक कार्यान्वयन विवरण है; एक समवर्ती कार्यक्रम एक एकल प्रोसेसर पर interleaved निष्पादन या कई भौतिक प्रोसेसर के माध्यम से निष्पादित कर सकता है।

कमजोर सिर सामान्य रूप

यह जानना महत्वपूर्ण है कि आलसी-मूल्यांकन कैसे काम करता है। इस अध्याय का पहला खंड WHNF में एक मजबूत परिचय देगा और यह कैसे समानांतर और समवर्ती प्रोग्रामिंग से संबंधित होगा।

द एवल मोनाड

हास्केल में समानांतरवाद का उपयोग कर व्यक्त किया जा सकता Eval से इकाई Control.Parallel.Strategies का उपयोग कर, rpar और rseq (दूसरों के बीच) काम करता है।

f1 :: [Int]
f1 = [1..100000000]

f2 :: [Int]
f2 = [1..200000000]

main = runEval $ do
  a <- rpar (f1) -- this'll take a while...
  b <- rpar (f2) -- this'll take a while and then some...
  return (a,b)

ऊपर main रनिंग तुरंत निष्पादित और "वापस" होगा, जबकि दो मान, a और b की गणना rpar माध्यम से पृष्ठभूमि में की जाती है।

नोट: सुनिश्चित करें कि आप समानांतर निष्पादन के लिए -threaded के साथ संकलित करें।

rpar

rpar :: Strategy a दी गई कार्यनीति को क्रियान्वित करती है (याद रखें: type Strategy a = a -> Eval a ) in समानांतर:

import Control.Concurrent
import Control.DeepSeq
import Control.Parallel.Strategies
import Data.List.Ordered

main = loop
  where 
    loop = do
      putStrLn "Enter a number"
      n <- getLine

      let lim = read n :: Int
          hf  = quot lim 2
          result = runEval $ do
            -- we split the computation in half, so we can concurrently calculate primes
            as <- rpar (force (primesBtwn 2 hf))
            bs <- rpar (force (primesBtwn (hf + 1) lim))
            return (as ++ bs)

      forkIO $ putStrLn ("\nPrimes are: " ++ (show result) ++ " for " ++ n ++ "\n")
      loop

-- Compute primes between two integers
-- Deliberately inefficient for demonstration purposes
primesBtwn n m = eratos [n..m]
  where
    eratos []     = []
    eratos (p:xs) = p : eratos (xs `minus` [p, p+p..])

इसे चलाने से समवर्ती व्यवहार प्रदर्शित होगा:

Enter a number
12
Enter a number

Primes are: [2,3,5,7,8,9,10,11,12] for 12

100
Enter a number

Primes are: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100] for 100

200000000
Enter a number
-- waiting for 200000000    
200
Enter a number

Primes are: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200] for 200

-- still waiting for 200000000

rseq

हम rseq :: Strategy a उपयोग कर सकते हैं rseq :: Strategy a तर्क को कमजोर करने के लिए मजबूर करने के लिए सामान्य रूप:

f1 :: [Int]
f1 = [1..100000000]

f2 :: [Int]
f2 = [1..200000000]

main = runEval $ do
  a <- rpar (f1) -- this'll take a while...
  b <- rpar (f2) -- this'll take a while and then some...
  rseq a
  return (a,b)

यह तेजी से rpar उदाहरण के शब्दार्थ को बदलता है; जबकि बाद पृष्ठभूमि में मूल्यों की गणना, जबकि तुरंत वापसी होगी, इस उदाहरण जब तक इंतजार करेंगे a WHNF लिए मूल्यांकन किया जा सकता।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow