এই গল্ফের জন্য একাধিক থ্রেড বা প্রক্রিয়াগুলির মধ্যে ভাগের একটি কল্পিত হিসাব প্রয়োজন।
কিছু ভাষাগুলি অন্যদের তুলনায় এটিকে সমন্বয় করা সহজ করে তোলে, তাই এটি ল্যাং অজোনস্টিক। অসম্পূর্ণ উদাহরণ কোড সরবরাহ করা হয়েছে তবে আপনার নিজের অ্যালগরিদম বিকাশ করা উচিত।
প্রতিযোগিতার লক্ষ্যটি হ'ল এন কে গণনার জন্য কে সবচেয়ে সংক্ষিপ্ত (বাইটে, সেকেন্ড নয়) মাল্টিকোর ফ্যাক্টরিয়াল অ্যালগরিদম নিয়ে আসতে পারে তা দেখতে হবে! ভোট হিসাবে পরিমাপ হিসাবে প্রতিযোগিতা বন্ধ যখন। মাল্টিকোরের সুবিধা থাকতে হবে, সুতরাং আমাদের এটি প্রয়োজন হবে যে এটি এন N 10,000 এর জন্য কাজ করা উচিত। লেখক কীভাবে এটি প্রসেসর / কোরগুলির মধ্যে কাজটি ছড়িয়ে দেয় এবং গল্ফের দৃis়তার ভিত্তিতে ভোট দেয় তার একটি বৈধ ব্যাখ্যা দিতে ব্যর্থ হলে ভোটারদের ভোট দেওয়া উচিত।
কৌতূহলের জন্য, দয়া করে কিছু পারফরম্যান্স নম্বর পোস্ট করুন। কোনও সময়ে বনাম গল্ফ স্কোর ট্রেড অফ হতে পারে, গল্ফের সাথে প্রয়োজনীয়তা পূরণের সাথে এতক্ষণ যেতে হবে go আমি কখন জানতে আগ্রহী হতে চাই।
আপনি সাধারণত উপলব্ধ সিঙ্গল কোর বড় পূর্ণসংখ্যার লাইব্রেরি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, পার্ল সাধারণত বিগিন্টের সাথে ইনস্টল করা থাকে। তবে নোট করুন যে কেবল কোনও সিস্টেম সরবরাহিত ফ্যাক্টরিয়াল ফাংশনকে কল করা সাধারণত কাজটিকে একাধিক কোর জুড়ে বিভক্ত করে না।
আপনাকে অবশ্যই STDIN বা ARGV থেকে ইনপুট N এবং আউটপুট এন এর মানটি মানতে হবে !. আপনি প্রোগ্রামটিতে প্রসেসরের সংখ্যা / কোরগুলির সংখ্যা সরবরাহ করতে optionচ্ছিকভাবে একটি ২ য় ইনপুট প্যারামিটার ব্যবহার করতে পারেন যাতে এটি নীচে যা দেখায় তা করে না :-) অথবা আপনি যা কিছু পেয়েছেন তা 2: 4 এর জন্য আপনি স্পষ্টভাবে ডিজাইন করতে পারেন।
আমি নীচে আমার নিজস্ব ওডবল পারল উদাহরণ পোস্ট করব, পূর্বে বিভিন্ন ভাষায় ফ্যাক্টরিয়াল অ্যালগরিদমের আওতায় স্ট্যাক ওভারফ্লোতে জমা দেওয়া । এটি গল্ফ নয়। অন্যান্য অসংখ্য উদাহরণ জমা দেওয়া হয়েছিল, তাদের মধ্যে বেশিরভাগ গল্ফ রয়েছে তবে অনেকগুলি তা নয়। শেয়ার-অ্যালক লাইসেন্সের কারণে, উপরের লিঙ্কের যে কোনও উদাহরণে কোডটি বিন্দু হিসাবে বিন্দুতে ব্যবহার করতে বিনা দ্বিধায় থাকুন।
আমার উদাহরণে পারফরম্যান্স বেশ কয়েকটি কারণে অপ্রয়োজনীয়: এটি অনেকগুলি প্রক্রিয়া, অত্যধিক স্ট্রিং / বিগিন্ট রূপান্তর ব্যবহার করে। যেমনটি আমি বলেছিলাম এটি ইচ্ছাকৃতভাবে ওডবলের উদাহরণ। এটি হিসাব করবে 5000! এখানে একটি 4 কোর মেশিনে 10 সেকেন্ডের মধ্যে। তবে / পরবর্তী লুপের জন্য আরও সুস্পষ্ট দুটি লাইনার 5000 করতে পারে! 3.6 এর মধ্যে চারটি প্রসেসরের একটিতে।
আপনাকে অবশ্যই এর থেকে আরও ভাল করতে হবে:
#!/usr/bin/perl -w
use strict;
use bigint;
die "usage: f.perl N (outputs N!)" unless ($ARGV[0] > 1);
print STDOUT &main::rangeProduct(1,$ARGV[0])."\n";
sub main::rangeProduct {
my($l, $h) = @_;
return $l if ($l==$h);
return $l*$h if ($l==($h-1));
# arghhh - multiplying more than 2 numbers at a time is too much work
# find the midpoint and split the work up :-)
my $m = int(($h+$l)/2);
my $pid = open(my $KID, "-|");
if ($pid){ # parent
my $X = &main::rangeProduct($l,$m);
my $Y = <$KID>;
chomp($Y);
close($KID);
die "kid failed" unless defined $Y;
return $X*$Y;
} else {
# kid
print STDOUT &main::rangeProduct($m+1,$h)."\n";
exit(0);
}
}
এ সম্পর্কে আমার আগ্রহটি সহজভাবে (1) একঘেয়েমি দূর করতে; এবং (২) নতুন কিছু শিখতে হবে। এটি আমার জন্য হোমওয়ার্ক বা গবেষণার সমস্যা নয়।
শুভকামনা!
