#!/bin/bash
for tracelength in 10 20 50 100 ; do
step=0.1
short=0
long=1
for firstloop in {1..10}; do
ratio=0
for secondloop in {1..10} ; do
for repeat in {1..20} ; do
echo $tracelength $short $long $ratio >results.csv
python3 main.py "$tracelength" "$short" "$long" "$ratio" > file.smt2
/usr/bin/time /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < file.smt2 > results.csv
done
ratio=$(echo "scale=10; $ratio + $step" | bc)
done
short=$(echo "scale=10; $short + $step" | bc)
long=$(echo "scale=10; $long - $step" | bc)
done
done
Я хочу распараллелить внутренний цикл ( повтор ).
Я установил GNU параллельно и знаю некоторые основы, но поскольку цикл содержит более одной команды, я не знаю, как их распараллелить.
Я передал содержимое цикла в другой скрипт, который, я думаю, является подходящим вариантом, но мои 3 команды должны принимать переменные ( tracelength , ratio , короткие , длинные ) и бегите по ним. Любая идея, как передать параметры из сценария в индекс. или у вас может быть лучше идея распараллеливания?
Я редактирую вопрос, потому что я использовал ответ ниже, но теперь мое время выполнения всегда равно 0,00 вне зависимости от того, насколько велик file.smt2.
это новая версия кода:
#!/bin/bash
doone() {
tracelength="$1"
short="$2"
long="$3"
ratio="$4"
#echo "$tracelength $short $long $ratio" >> results.csv
python3 main.py "$tracelength" "$short" "$long" "$ratio" >> file.smt2
gtime -f "%U" /Users/Desktop/optimathsat-1.5.1-macos-64-bit/bin/optimathsat < file.smt2
}
export -f doone
step=0.2
parallel doone \
::: 200 300 \
:::: <(seq 0 $step 0.5) \
::::+ <(seq 1 -$step 0.5) \
:::: <(seq 0 $step 0.5) \
::: {1..5} &> results.csv