লুপের জন্য সমান্তরাল করা


9

আমি forনিম্নলিখিত কোডের লুপগুলিকে সমান্তরাল করতে চাই । এই কিভাবে করবেন?

#!/bin/bash
N=$1 
n=$2
for (( i=1; i<=$N; i++ )); do
  min=100000000000000  //set min to some garbage value
  for (( j=1; j<=$n; j++ )); do
    val=$(/path/to/a.out)
    val2=`echo $val | bc`  

      if (( $val2 < $min )); then
        min=$val2; 
      fi
  done
  arr=("${arr[@]}" "$min")
done


উত্তর:


10
#!/bin/bash
# set -x # debug version
N=${1:-123}
n=${2:-45}
workers=${workers:-${3:-10}}
((workers < 1)) && ((workers = 1))
((workers > 20)) && ((workers = 20))

((min=100000000000000))  #set min to some garbage value

work() {
  for i in ${*}; do
    for (( j=1; j<=${n}; j++ )); do
      val=$(/path/to/a.out)
      val2=$(echo ${val} | bc)
      (( val2 < min )) && (( min = val2 ));
    done
    echo ${min}
    # # debug version
    # echo ${i} ${j} ${min}
  done
}

# --
arr=($(
  seq ${N} | xargs -n$[N/workers + 1] | while read i; do
    work ${i} &
  done
  wait
))
echo ${arr[*]}
# --

# # debug version
# seq ${N} | xargs -t -n$[N/workers + 1] | while read i; do
#  work ${i} &
# done
# wait

একটি প্যারামিটারাইজড সংখ্যক প্রক্রিয়া তৈরি করার সময় সর্বদা শ্রমিক ব্যবহার করুন এবং সর্বাধিক সংখ্যক কর্মী সীমাবদ্ধ করুন যা স্পোন করতে পারে

xargs -n | while read ব্যাচগুলির তালিকাগুলির পুনরাবৃত্তি করার একটি সহজ উপায়।

  • seq 1 থেকে N পর্যন্ত সংখ্যার একটি তালিকা তৈরি করে
  • xargs -n সেই তালিকাটি এন / কর্মীদের + 1 ব্যাচে ভাগ করে।
    • উদাহরণস্বরূপ এন = 100 কর্মী = 10 1 থেকে 100 পর্যন্ত 11 সংখ্যার 10 লাইন তৈরি করবে।
  • while read i সংখ্যা প্রতিটি লাইন পড়েন।
  • work ${i} &শুধু সংখ্যা ব্যাচ workসহ ফাংশন কল ${i}

ডিবাগ করতে আমি মন্তব্য-আউট ডিবাগ কোড যুক্ত করেছি। কেবলমাত্র তার ডিবাগ সংস্করণটির সাথে echoডিবাগ সংস্করণ এবং কোডটির সাথে প্রতিস্থাপন করুন # --এবং আপনি দেখতে পাচ্ছেন যে এটি কীভাবে ব্যাচগুলিতে কাজ করে। Uncomment set -xআরো বিস্তারিত ডিবাগ আউটপুট যা আপনি একটি ফাইলে পুনর্নির্দেশ করতে চান তাদের জন্য।

এটি কীভাবে পরিচালিত হয় তা দেখার জন্য বিভিন্ন পরামিতি সহ কেবল ডিবাগ সংস্করণটি চালান:

parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20

দাবি অস্বীকার: এই কোডটি minকর্মী প্রক্রিয়াগুলির মধ্যে মানটি সিঙ্ক্রোনাইজ করে না । সর্বনিম্ন মান অর্জন করা কোনও ভয়াবহ অনুশীলন নয়। এটি সম্ভবত:

parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1

অথবা কেবল স্ক্রিপ্টে এটি যুক্ত করুন:

echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1

আপনি কোড ব্যাখ্যা করতে পারেন? আপনি এখানে কর্মী থ্রেড কীভাবে ব্যবহার করেছেন তা আমার কাছে পরিষ্কার নয়।
রিচার্ড উইলিয়ামস

@ প্রসেনজিৎ হয়ে গেছে আমি আশা করি এটি সহায়ক।
নিকরোবোট

8

জিএনইউ সমান্তরাল ব্যবহার:

#!/bin/bash

N=$1
n=$2

arr=($(
# Generate all combinations of 1..n and 1..N
parallel -k --tag /path/to/a.out {1} {2} '|' bc :::: <(seq $N) <(seq $n) |
  perl -ane 'BEGIN{$min=1e30} $last||=$F[0]; if($F[0] != $last) {print $min,"\n";$min=1e30;$last=$F[0]} $min = $F[2]<$min ? $F[2] : $min; END {print $min,"\n"}'
))
echo ${arr[*]}

এটি /path/to/a.outপ্রতিটি সিপিইউতে চলবে । আউটপুটটি এমন হবে:

1 1 19269
1 2 6158
1 3 2794
1 4 25104
2 1 13160
2 2 32683
2 3 12535
2 4 15197
3 1 8228
3 2 7673
3 3 8428
3 4 24463

পার্ল স্ক্রিপ্টটি প্রথম কলামে দেখায় এবং সর্বনিম্ন তৃতীয় কলামে একই প্রথম কলামে সন্ধান করে।

আপনি জিএনইউ সমান্তরাল সহজেই এটি ইনস্টল করতে পারেন:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

আরও জানতে ইন্ট্রো ভিডিওগুলি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


আপনার শেষ অনুচ্ছেদে লিঙ্কটি একটি ফেসবুক সন্ধানী পৃষ্ঠায় লিঙ্ক করেছে যা দর্শনার্থীকে বলে যে তিনি একচেটিয়া উপহার (বিজ্ঞাপন বা কেলেঙ্কারী) জিতেছেন। কোনও ভিডিও নেই। আপনার এটি অপসারণ করা উচিত।
মার্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.