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


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.