BASH-скрипты для генерации входных данных для параллельных заданий C ++ - PullRequest
2 голосов
/ 12 января 2011

Я программист-любитель C ++, пытающийся научиться основам сценариев оболочки.У меня есть сложная программа на C ++, которая в настоящее время читает значения различных параметров, начиная с Parameters.h, а затем последовательно выполняет одно или несколько моделирований с каждым значением параметра.Эти симуляции требуют много времени для запуска.Поскольку у меня есть доступный кластер, я бы хотел эффективно распараллелить это задание, запустив симуляции для каждого значения параметра на отдельном процессоре.Я предполагаю, что для этой цели легче изучить методы сценариев оболочки, чем OpenMPI.Мой кластер работает на платформе LSF.

Как я могу записать свои входные параметры в Bash, чтобы они распределялись между несколькими процессорами, каждый из которых выполняет программу с этим значением?Я хотел бы избежать интерактивной подачи.В идеале, у меня были бы входные данные в текстовом файле, который читает Bash, и я бы передавал два параметра каждому заданию: фактическое значение параметра и идентификатор параметра.

Заранее спасибо за любые выводы ипредложения.


мое решение

GNU Parallel выглядит не очень красиво, но в итоге (с помощью ИТ-администратора) я написал простой скрипт bash, которыйвыводит на экран три входа (идентификатор обработки, значение обработки / параметра и идентификатор моделирования):

<code>#!/bin/bash 
j=1
for treatment in <code>cat treatments.txt</code>; do
  for experiment in <code>cat simulations.txt</code>; do
   bsub -oo <code>tr_${j}_sim_${experiment}_screen</code> -eo <code>tr_${j}_sim_${experiment}_err</code> -q short_serial "echo \"$j $treatment $experiment\" | ./a.out"
  done
  let j=$j+1 
done

Файл treatments.txt содержит список значенийЯ хотел бы изменить, simulations.txt содержит список всех идентификаторов моделирования, которые я хотел бы запустить (в настоящее время только 1, ..., s, где s - общее количество моделирования, которое я хочу для каждой обработки),и лечение индексируется 1 ... j.

Ответы [ 3 ]

5 голосов
/ 12 января 2011

Может быть, проверить: http://www.gnu.org/software/parallel/

редактировать:

Или проверьте аргумент -P для xargs, пример:

time echo {1..5} | xargs -n 1 -P 5 sleep
2 голосов
/ 12 января 2011

Скажем, вы хотите запустить программу simulate с входами foo, bar, baz и quux параллельно, тогда самый простой способ:

inputs="foo bar baz quux"

# Launch processes in the background with &
children=""
for x in $inputs; do
    simulate "$x" > "$x.output" &
    $children = "$children $!"
done

# Wait for each to finish
for $pid in $children; do
    wait $pid
done

for x in $inputs; do
    echo "simulate '$x' gave:"
    cat "$x.output"
    rm -f "$x.output"
done

Проблемазаключается в том, что все симуляции запускаются одновременно, поэтому, если ваше количество входов намного больше, чем количество процессоров / ядер, они могут затопить систему.

0 голосов
/ 12 января 2011

Моя лучшая попытка в этом: вы создаете фоновые копии нескольких экземпляров своей программы и позволяете планировщику ОС использовать их на разных процессорах. На самом деле, в любой оболочке нет способа указать, на каком процессоре должен выполняться данный процесс.

Что-то с эффектом:

#!/bin/sh

for arg in foo bar baz; do
   ./your_program "$arg" &
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...