LINUX.ORG.RU

GNU parallel в bash скрипте, что делаю не так?


0

1

есть некий bash скрипт transenergy.x, который я запускаю из другого bash скрипта и коммандной строки как ./transenergy.x параметр1 параметр2 всё вроде бы работает нормально на этом этапе.

Но когда я попытался задействовать несколько ядер для расчёта я начал с такого кода:

count=0
# Compute energies of transitions for this wavevector
for i in `seq 0 $index`;
do
	for j in `seq 0 $index`;
        do
		./transenergy.x ${kxi[$i]} ${kyi[$j]} &
		let "count = $count + 1"
		if [ ${count} -eq $noJobs ] ; then
			wait
			count=0;
		fi
	done
done 

где index - переменная с числом элементов в массивах kxi и kyi, noJobs - максимальное число параллельных процессов.

Код который привёл выше вполне неплохо работает, но хотелось бы добиться запуска параллельных процессов при помощи GNU parallel.

Пробовал заменить вышенаписанный код хотя бы так:

echo "${kxi[@]} ${kyi[@]}" | parallel -j$noJobs ./transenergy.x {}
но при использовании такого кода ${kyi[@]} не передаётся в /transenergy.x и всё равно используется только одно ядро.

что делаю не так?

спасибо :)

что делаю не так?

Используете bash для громоздких расчётов.

Homura_Akemi
()
Ответ на: комментарий от backbone

спасибо т.е. поставить \n? а попробовал, всё равно скрипт получает только первый массив, второй не видит. При этом в составе первого массива вконце вписывается второй.

вот так: kx=0 .001 .002 .003 .004 .005 .006 .007 .008 .009 .010 .011 .012 .013 .014 .015 .016 .017 .018 .019 .020 .021 .022 .023 .024 .025 .026 .027 .028 .029 .030 .031 .032 .033 .034 .035 .036 .037 .038 .039 .040 .041 .042 .043 .044 .045 .046 .047 .048 .049 .050 .051 .052 .053 .054 .055 .056 .057 .058 .059 .060\n0 .001 .002 .003 .004 .005 .006 .007 .008 .009 .010 .011 .012 .013 .014 .015 .016 .017 .018 .019 .020 .021 .022 .023 .024 .025 .026 .027 .028 .029 .030 .031 .032 .033 .034 .035 .036 .037 .038 .039 .040 .041 .042 .043 .044 .045 .046 .047 .048 .049 .050 .051 .052 .053 .054 .055 .056 .057 .058 .059 .060, ky=:

можно, конечно, использовать этот трюк для обхода проблемы, но хотелось бы найти решение попроще. :)

pivanov
() автор топика
Ответ на: комментарий от pivanov

В помощи к gnu parallel есть пример:

Nested for-loops like this:

  (for x in `cat xlist` ; do
    for y in `cat ylist` ; do
      do_something $x $y
    done
  done) | process_output

can be written like this:

parallel do_something {1} {2} :::: xlist ylist | process_output
hope13 ★★★
()
Ответ на: комментарий от hope13

hope13, спасибо огромное за ответ. я не видел этого примера в документации, потому и ринулся сразу пробовать. я пробовал вот так в лоб сделать: parallel ./transenergy.x {1} {2} :::: ${kxi[@]} :::: ${kyi[@]}

и так: parallel ./transenergy.x {1} {2} :::: «${kxi[@]}» :::: «${kyi[@]}»

не заработало, всё равно данные передаваемые в скрипт теряются во время вызова скрипта. я вот пару дней пробовал разные примеры. Как оказалось не все они у меня работали, потому путаница и вопрос этот возникли.

и только вариант который anonymous показал заработал :)

pivanov
() автор топика
Ответ на: комментарий от anonymous

Hi Anonymous, no, I did not watch these video tutorials. I tried to watch some other video tutorials and realised that they do not direct me strait to the point. I also cheched parallel documentalion (and many other web pages), but found no suitable example. Thus, I decided to seek for a help here. And I have found it here. thank you for suggesting to launch the parallel job using as

parallel ./transenergy.x {1} {2} ::: "${kxi[@]}" ::: "${kyi[@]}"
this really works.

pivanov
() автор топика
Ответ на: комментарий от pivanov

":::" означают, что аргументом будет переменная

"::::" означают, что аргументом будет файл.

Поэтому не работало.

hope13 ★★★
()
Ответ на: комментарий от hope13

":::" означают, что аргументом будет переменная

не обязательно

parallel -j${threads} "file -F ' '" ::: /boot/*
тоже работает

megabaks ★★★★
()

А можно и xargs использовать для параллельного запуска

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.