Haskell Language
समानता
खोज…
पैरामीटर
प्रकार / समारोह | विस्तार |
---|---|
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 लिए मूल्यांकन किया जा सकता।