This shows you the differences between two versions of the page.
isrm:laboratoare:new:02 [2021/03/15 13:37] dragos.niculescu [Procesare multicore] |
isrm:laboratoare:new:02 [2021/03/15 13:55] (current) dragos.niculescu |
||
---|---|---|---|
Line 403: | Line 403: | ||
</code> | </code> | ||
- | <code bash> | ||
- | awc() { awk "BEGIN{print $*}"; } | ||
- | for i in `seq 10 2 20`; do awc "$i / 10"; done | ||
- | </code> | ||
==== Aritmetica în shell scripting ==== | ==== Aritmetica în shell scripting ==== | ||
- | Bash face toate calculele pe integer. | + | Bash face **toate calculele pe integer**, deci nu poate fi folosit pentru a calcula medii (mean, median, standard deviation). |
<code bash> | <code bash> | ||
- | x=5; echo $(($x / 3)) | + | $ x=5; echo $(($x / 3)) |
+ | 1 | ||
</code> | </code> | ||
<code bash> | <code bash> | ||
- | x=24 | + | $ x=24 |
- | y=25 | + | $ y=25 |
- | b=`expr $x = $y` # Test equality. | + | $ b=`expr $x = $y` # Test equality. |
- | echo "b = $b" # 0 ( $x -ne $y ) | + | $ echo "b = $b" # 0 ( $x -ne $y ) |
- | echo | + | b = 0 |
</code> | </code> | ||
+ | |||
Putem folosi utilitarul ''bc'' cu pipe pentru calcule în floating point: | Putem folosi utilitarul ''bc'' cu pipe pentru calcule în floating point: | ||
<code bash> | <code bash> | ||
- | echo '6.5 / 2.7' | bc | + | $ echo '6.5 / 2.7' | bc |
- | echo 'scale=3; 6.5/2.7' | bc | + | 2 |
+ | $ echo 'scale=3; 6.5/2.7' | bc | ||
+ | 2.407 | ||
</code> | </code> | ||
+ | |||
+ | <code bash> | ||
+ | $ awc() { awk "BEGIN{print $*}"; } | ||
+ | $ for i in `seq 1 1 4`; do awc "$i + sqrt($i)"; done | ||
+ | 2 | ||
+ | 3.41421 | ||
+ | 4.73205 | ||
+ | 6 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ===== Procesare multicore ===== | ||
+ | |||
+ | Majoritatea graficelor pe care dorim sa le plotăm se folosesc de același script de simulare pe care îl rulăm cu parametri diferiți, iar la final recoltăm din outputul lui una sau mai multe valori. Dacă simularea nu folosește resurse temporare care pot duce la race conditions, se poate rula în paralel pentru a putea folosi core-urile existente. Utilitarul ''GNU parallel'' este potrivit pentru acest job, întrucât detectează automat numărul de core-uri, și are multe opțiuni pentru scriptare (nu toate naturale). | ||
+ | |||
+ | Exemple simple: | ||
+ | <code bash> | ||
+ | $ parallel echo "{1} a{2}" ::: $(seq 1 1 3) ::: $(seq 100 102) | ||
+ | 1 a100 | ||
+ | 1 a101 | ||
+ | 1 a102 | ||
+ | 2 a100 | ||
+ | 2 a101 | ||
+ | 2 a102 | ||
+ | 3 a100 | ||
+ | 3 a101 | ||
+ | 3 a102 | ||
+ | </code> | ||
+ | |||
+ | Un gotcha este rularea mai multor comenzi shell care este posibilă doar prin înglobarea lor într-o funcție sau script separat: | ||
+ | |||
+ | <code> | ||
+ | |||
+ | $ cat > batch | ||
+ | sleep $1 | ||
+ | echo $2 | ||
+ | $ parallel ./batch ::: $(seq 3 -1 1) ::: $(seq 100 102) | ||
+ | 100 | ||
+ | 100 | ||
+ | 101 | ||
+ | 102 | ||
+ | 100 | ||
+ | 101 | ||
+ | 101 | ||
+ | 102 | ||
+ | 102 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Un altul este afișarea rezultatelor taskurilor în ordine secvențială, nu atunci când se termină fiecare: | ||
+ | |||
+ | <code> | ||
+ | $ parallel -k bash ./batch ::: $(seq 3 -1 1) ::: $(seq 100 102) | ||
+ | 100 | ||
+ | 101 | ||
+ | 102 | ||
+ | 100 | ||
+ | 101 | ||
+ | 102 | ||
+ | 100 | ||
+ | 101 | ||
+ | 102 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Exemplu care poate fi adesea refolosit în acest semestru: | ||
+ | |||
+ | <code> | ||
+ | $ function run_fixed(){ | ||
+ | echo -n "$1 $2 " | ||
+ | ./waf --run "lab6-7-cw --payloadSize=212 --ns=$1 --nd=$1 --minCw=$2 --maxCw=$2 --pcap=false" | tail -n1 | ||
+ | } | ||
+ | |||
+ | $ export -f run_fixed | ||
+ | |||
+ | $ parallel -k run_fixed {1} {2} ::: 4 6 7 20 40 ::: 3 7 15 31 63 127 255 511 1023 2047 4095 | ||
+ | </code> | ||
+ | |||
+ | Acest exemplu rulează scriptul ns3 pentru toate combinațiile de parametri minCw si maxCw listate în secventele separate de ::: | ||
+ | Opțiunea -k asigură afișarea rezultatelor în ordine, chiar dacă în realitate se rulează în paralel pe mai multe core-uri, si unele taskuri se termină mai repede. | ||
+ | |||
+ | |||
+ | |||
==== [OPȚIONAL] Trasare de grafice cu gnuplot ==== | ==== [OPȚIONAL] Trasare de grafice cu gnuplot ==== | ||
Line 569: | Line 654: | ||
Un mic ghid de gnuplot găsiți aici: http://www.gnuplotting.org/plotting-data/ | Un mic ghid de gnuplot găsiți aici: http://www.gnuplotting.org/plotting-data/ | ||
- | |||
- | ===== Procesare multicore ===== | ||
- | |||
- | Majoritatea graficelor pe care dorim sa le plotăm se folosesc de același script de simulare pe care îl rulăm cu parametri diferiți, iar la final recoltăm din outputul lui una sau mai multe valori. Dacă simularea nu folosește resurse temporare care pot duce la race conditions, se poate rula în paralel pentru a putea folosi core-urile existente. Utilitarul ''GNU parallel'' este potrivit pentru acest job, întrucât detectează automat numărul de core-uri, și are multe opțiuni pentru scriptare (nu toate naturale). | ||
- | |||
- | Exemple simple: | ||
- | <code> | ||
- | parallel echo "{1} a{2}" ::: $(seq 1 1 3) ::: $(seq 100 102) | ||
- | 1 a100 | ||
- | 1 a101 | ||
- | 1 a102 | ||
- | 2 a100 | ||
- | 2 a101 | ||
- | 2 a102 | ||
- | 3 a100 | ||
- | 3 a101 | ||
- | 3 a102 | ||
- | </code> | ||
- | |||
- | Un gotcha este rularea mai multor comenzi shell care este posibilă doar prin înglobarea lor într-o funcție sau script separat: | ||
- | |||
- | <code> | ||
- | |||
- | cat > batch | ||
- | sleep $1 | ||
- | echo $2 | ||
- | |||
- | parallel ./batch ::: $(seq 3 -1 1) ::: $(seq 100 102) | ||
- | 100 | ||
- | 100 | ||
- | 101 | ||
- | 102 | ||
- | 100 | ||
- | 101 | ||
- | 101 | ||
- | 102 | ||
- | 102 | ||
- | </code> | ||
- | |||
- | |||
- | Un altul este afișarea rezultatelor taskurilor în ordine secvențială, nu atunci când se termină fiecare: | ||
- | |||
- | <code> | ||
- | parallel -k bash ./batch ::: $(seq 3 -1 1) ::: $(seq 100 102) | ||
- | 100 | ||
- | 101 | ||
- | 102 | ||
- | 100 | ||
- | 101 | ||
- | 102 | ||
- | 100 | ||
- | 101 | ||
- | 102 | ||
- | </code> | ||
- | |||
- | |||
- | Exemplu care poate fi adesea refolosit în acest semestru: | ||
- | |||
- | <code> | ||
- | function run_fixed(){ | ||
- | echo -n "$1 $2 " | ||
- | ./waf --run "lab6-7-cw --payloadSize=212 --ns=$1 --nd=$1 --minCw=$2 --maxCw=$2 --pcap=false" | tail -n1 | ||
- | } | ||
- | |||
- | export -f run_fixed | ||
- | |||
- | parallel -k run_fixed {1} {2} ::: 4 6 7 20 40 ::: 3 7 15 31 63 127 255 511 1023 2047 4095 | ||
- | </code> | ||
- | |||
- | Acest exemplu rulează scriptul ns3 pentru toate combinațiile de parametri minCw si maxCw listate în secventele separate de ::: | ||
- | Opțiunea -k asigură afișarea rezultatelor în ordine, chiar dacă în realitate se rulează în paralel pe mai multe core-uri, si unele taskuri se termină mai repede. | ||
- | |||
====== Task-uri ====== | ====== Task-uri ====== |