সমান্তরাল "যে কোনও" বা "সমস্ত" হাস্কেলের মধ্যে


9

একটি প্যাটার্ন যা আমি বেশ কয়েকবার এসেছি সেগুলি হ'ল সেই মানটির তালিকাতে কিছু পরীক্ষা ম্যাপ করে এবং কোনও বা সমস্ত উপাদান উত্তীর্ণ হয়েছে কিনা তা দেখে পরীক্ষা করে নেওয়া দরকার। সাধারণ সমাধানটি কেবল সুবিধাজনক বিল্ট-ইনগুলি ব্যবহার করার জন্য allএবং any

সমস্যা হ'ল এগুলি সিরিয়ালে মূল্যায়ন করে। বেশিরভাগ ক্ষেত্রে কোনও থ্রেডের জন্য "মিথ্যা" বা "সত্য" এর সন্ধান পেলে প্রক্রিয়া সমাপ্ত হওয়ার সাথে সমান্তরালভাবে মূল্যায়ন করা আরও দ্রুত হবে । আমি নিশ্চিত যে শর্ট-সার্কিট আচরণটি নিয়ন্ত্রণ ব্যবহার করে প্রয়োগ করা যাবে না। প্যারালাল কারণ এর জন্য আন্ত-প্রক্রিয়া যোগাযোগ প্রয়োজন এবং এটি এখনও বাস্তবায়নের জন্য কন্ট্রোল।কন্ট্রোরালের কাছাকাছি কোথাও বুঝতে পারি না।allany

এটি গণিতে একটি সাধারণ প্রচলিত প্যাটার্ন (যেমন মিলার-রবিন আদিমত্ব) তাই আমি মনে করি ইতিমধ্যে ইতিমধ্যে কেউ এর সমাধান নিয়ে এসেছেন তবে সুস্পষ্ট কারণে "সমান্তরাল বা / এবং / যে কোনও / সমস্ত তালিকার জন্য গুগল অনুসন্ধান করছেন। haskell "অনেক প্রাসঙ্গিক ফলাফল দেয় না।



2
unambগ্রন্থাগার দিয়ে এটি সম্ভব
লুউকি

1
@ ললকি আকর্ষণীয়; আমি এই সাথে চারপাশে জগাখিচুড়ি করব। আমি যদি এর সাথে ভাল / অন্য কোনও সমান্তরাল লিখি তবে আমি এটি একটি উত্তর হিসাবে পোস্ট করব।
আর্কুরিটেক

11
যে কোনও বিষয়কে সমান্তরাল করার চেষ্টা করার আগে, একটি নতুন প্রক্রিয়াটি কাঁটা লাগার সময় আপনি কতগুলি শর্ত পরীক্ষা করতে পারবেন তা বিবেচনা করুন।
চ্যানার

2
@ চেপার আপনি কি সম্পর্কে কথা বলছেন? আমরা এখানে বাশ নিয়ে কথা বলছি না! আমরা থ্রেডগুলির সাথে সামঞ্জস্য এবং সমান্তরালতা করতে পারি (এটি pthreadsসি বা সবুজ থ্রেড হ্যাসকেলে থাকুক ) আপনি একযোগে ওয়েব অনুরোধগুলি পরিচালনা করতে একাধিক ওয়েবসার্ভার শুরু করবেন না, পরিবর্তে আপনি একক প্রক্রিয়াতে একাধিক থ্রেড চালাবেন! সমান্তরালতার ক্ষেত্রেও একই প্রযোজ্য। আপনার সিপিইউ রয়েছে যতগুলি থ্রেড ছড়িয়ে যায় এবং আপনার কাজকে সমানভাবে বিভক্ত করে দেয়, এভাবে সিপিইউ বাউন্ড টাস্কগুলির যত্ন নেওয়া। নিজেকে github.com/lehins/haskell-scheduler
লেহিনস

উত্তর:


2

অনেক বাস্তববাদী প্রোগ্রামগুলিতে আপনি এই উদ্দেশ্যে সমান্তরাল কৌশল ব্যবহার করতে পারেন। কারণ, অপ্রয়োজনীয় গণনা বাতিল করার জন্য সুস্পষ্ট পদ্ধতি না থাকলেও আবর্জনা সংগ্রাহক চললে স্পষ্টতই এটি ঘটবে। একটি দৃ concrete় উদাহরণ হিসাবে, নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন:

import Control.Concurrent
import Control.Parallel.Strategies
import Data.Int
import System.Mem

lcgs :: Int32 -> [Int32]
lcgs = iterate lcg
  where lcg x = 1664525 * x + 1013904223

hasWaldo :: Int32 -> Bool
hasWaldo x = waldo `elem` take 40000000 (lcgs x)

waldo :: Int32
waldo = 0

main :: IO ()
main = do
  print $ or (map hasWaldo [1..100] `using` parList rseq)

এটি waldo = 0প্রতিটি মিলিয়ন পিআরএনজি 100 টি পিআরএনজি স্ট্রিমের আউটপুট অনুসন্ধান করার জন্য (যা কখনই খুঁজে পাওয়া যাবে না) সমান্তরাল তালিকার কৌশল ব্যবহার করে। এটি সঙ্কলন এবং চালনা:

ghc -threaded -O2 ParallelAny.hs
./ParallelAny +RTS -s -N4

এবং এটি প্রায় 16 দশকের জন্য চারটি কোরকে পেজ করে, শেষ পর্যন্ত মুদ্রণ করে False। পরিসংখ্যানগুলিতে নোট করুন যে সমস্ত 100 টি স্পার্কগুলি "রূপান্তরিত" এবং তাই সমাপ্তির দিকে চালিত হয়:

SPARKS: 100(100 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

এখন, waldoএমন কোনও মানতে পরিবর্তন করুন যা প্রথম দিকে পাওয়া যায়:

waldo = 531186389   -- lcgs 5 !! 50000

এবং main10 সেকেন্ডের জন্য থ্রেডটি জীবিত রাখতে সংশোধন করুন :

main :: IO ()
main = do
  print $ or (map hasWaldo [1..100] `using` parList rseq)
  threadDelay 10000000

আপনি এটি পর্যবেক্ষণ করতে পারবেন যে এটি Trueপ্রায় অবিলম্বে মুদ্রণ করা হবে, তবে 4 টি কোর 100% সিপিইউতে থাকবে (কমপক্ষে কিছু সময়ের জন্য), উদাহরণস্বরূপ যে অপরিবর্তিত গণনাগুলি চলতে থাকে এবং সংক্ষিপ্ত বৃত্ত হয় না, যেমনটি আপনি ভয় পেয়েছিলেন।

কিন্তু , উত্তর পাওয়ার পরে যদি আপনি কোনও জঞ্জাল সংগ্রহ করতে বাধ্য করেন তবে জিনিসগুলি পরিবর্তন হয়:

main :: IO ()
main = do
  print $ or (map hasWaldo [1..100] `using` parList rseq)
  performGC
  threadDelay 10000000

এখন, আপনি দেখতে পাবেন যে সিপিইউ মুদ্রণের অল্প সময়ের মধ্যে অলস হয়ে পড়েছে Trueএবং পরিসংখ্যানগুলি দেখায় যে বেশিরভাগ গণনা চালানোর আগে আবর্জনা সংগ্রহ করা হয়েছিল:

SPARKS: 100(9 converted, 0 overflowed, 0 dud, 91 GC'd, 0 fizzled)

বাস্তববাদী প্রোগ্রামগুলিতে, একটি স্পষ্ট প্রয়োজন performGCহবে না, অবশ্যই অবশ্যই জিসি অবশ্যই নিয়মিতভাবে সম্পাদিত হবে। উত্তরটি সন্ধানের পরে কিছু অপ্রয়োজনীয় গণনা চলতে থাকবে, তবে অনেক বাস্তব পরিস্থিতিতে, অপ্রয়োজনীয় গণনাগুলির ভগ্নাংশ বিশেষত গুরুত্বপূর্ণ কারণ হতে পারে না।

বিশেষত, তালিকাটি যদি বৃহত হয় এবং তালিকার উপাদানগুলির প্রতিটি স্বতন্ত্র পরীক্ষা দ্রুত হয় তবে সমান্তরাল কৌশলগুলির মধ্যে দুর্দান্ত বাস্তব-বিশ্বের পারফরম্যান্স থাকবে এবং দর কষাকষির মধ্যে কার্যকর করা সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.