У меня есть программа с различными входными параметрами, которые должны выполнять те же функции в программе. Как я могу заставить каждый набор Входных параметров работать на разных процессорах в сетке. Пожалуйста, помогите, если у вас есть хоть какая-то идея. Было бы очень помочь! Программа на C ++
Это зависит от того, какой менеджер ресурсов кластера вы используете. Большинство поддерживают так называемые Массив заданий, где выполняется много экземпляров одного и того же задания, и через среду передается параметр, обычно простой целочисленный индекс текущего задания. Это то, что мы называем платформой параллельных вычислений для бедного человека 🙂
Так как я только широко использовал Sun Grid Engine (сейчас Oracle Grid Engine, также с открытым исходным кодом вилки под именем Open Grid Scheduler а также Сын Grid Engine существует) и Платформа LSF (теперь IBM LSF, также доступный как очень похожий с открытым исходным кодом openlava планировщик заданий), я могу только написать о них (и в некоторой степени о Torque).
С SGE работа массива может выглядеть так:
#!/usr/bin/env zsh
#$ -cwd
#$ -N jobname
#$ -t 1-100
## Other resource requirements
#$ -l h_rt=0:30:00
#$ -l h_mem=1200M
#$ -pe openmp 12
export OMP_NUM_THREADS=12
density=$((SGE_TASK_ID * 0.06)) # zsh specific
/path/to/executable -d density < input_${SGE_TASK_ID} > output_${SGE_TASK_ID}
Здесь -t 1-100
параметр для qsub
создает задание массива из 100 задач, пронумерованных от 1
в 100
, SGE передает номер текущей задачи в SGE_TASK_ID
переменная окружения. Вы можете использовать его для выбора подходящего входного файла или для вычисления других входных параметров. SGE автоматически добавляет суффикс к выходным файлам задания и файлам ошибок с идентификатором задачи. Обратите внимание, что использование литералов с плавающей точкой в $(())
по-видимому zsh
-конкретный.
Задания в массиве в Torque создаются точно так же, как в SGE через -t
параметр. С версиями Torque до 2.3 -t
принимает один аргумент — количество задач, а затем номера задач от 0
на это число минус 1. Начиная с Torque 2.3, можно указать диапазоны, как с SGE:
#!/usr/bin/env zsh
#PBS -N jobname
#PBS -l nodes=1,walltime=00:30:00
#PBS -t 1-100
cd ${PBS_O_WORKDIR}
export OMP_NUM_THREADS=12
density=$((PBS_ARRAYID * 0.06)) # zsh specific
/path/to/executable -d density < input_${PBS_ARRAYID} > output_${PBS_ARRAYID}
Основное отличие от SGE состоит в том, что переменная среды идентификатора задачи называется PBS_ARRAYID
, Увидеть Представление работы часть в руководстве по крутящему моменту.
С LSF работа массива может выглядеть так:
#!/usr/bin/env zsh
#BSUB -J jobname[1-100]
# Have separate error file for each job
#BSUB -e error_%I
# Other resource requirements, e.g.
#BSUB -W 0:30
#BSUB -M 1200
#BSUB -n 1
#BSUB -x
export OMP_NUM_THREADS=12
density=$((LSF_JOBINDEX * 0.06)) # zsh specific
/path/to/executable -d density < input_${LSF_JOBINDEX} > output_${LSF_JOBINDEX}
Здесь добавление спецификации диапазона [1-100]
после имени задания создает массив заданий. LSF передает идентификатор задачи через LSF_JOBINDEX
переменная окружения. Вы можете использовать его точно так же, как в случае с SGE.
Вам необходимо указать, какую параллельную парадигму вы используете. MPI, OpenMP, что-то другое.
Обычно применяемый подход заключается в использовании какого-либо канала связи и отправке векторов параметров из «основного» процесса во все остальные.
Чаще всего широковещательные параметры передаются, когда они совпадают, но основная задача может выполнять итерацию по набору из них и отправлять каждую из них друг другу через коммуникатор 1: 1.
Иногда параметры подготавливаются в одном или нескольких файлах, и каждая задача считывает свои собственные установленные параметры.
Все зависит от сайта, на котором развернуто ваше приложение, и от масштаба работы. То есть если у вас есть 1 миллион задач для работы на суперкомпьютере, файловый подход может быть плохой идеей.