Параллельное программирование. MPI?
то есть саму прогу распараллеливать не нужно, нужно только много-много (порядка 1000 раз) ее запустить.тоесть все эти 1000 запусков дадут один и тот же результат?
или входные данные будут разные?
Программу нужно размножить на много процессов, то есть саму прогу распараллеливать не нужно, нужно только много-много (порядка 1000 раз) ее запустить.Если эта тысяча процессов не будет взаимодействовать друг с другом, то "распараллелить" очень просто - пишешь bat файл, который в цикле запустит твою программу столько раз, сколько надо.
Если процессы будут взаимодействовать между собой, то тут уже может пригодиться MPI - суть программный интерфейс для взаимодействия процессов на разных машинах.
Такса: 1000р.
тоесть все эти 1000 запусков дадут один и тот же результат?Неа, там стохастический процесс, так что результаты буду разные, мне нужно 1000 результатов, чтобы потом их усреднить.
или входные данные будут разные?
Если эта тысяча процессов не будет взаимодействовать друг с другом, то "распараллелить" очень просто - пишешь bat файл, который в цикле запустит твою программу столько раз, сколько надо.Неа, взаимодействия там нет....
В моем распоряжении будет многопроцессорная большая крутая машина в умном исследовательском центре, если будет bat файл, который в цикле запускает, операционка самостоятельно раскидает процессы по процессорам и поставит их в длинную очередь?
многопроцессорная большая крутая машинаТаки smp или кластер?
Хм...таких умных слов я не знаю. Сформулируйте мне, плиз, вопрос, я задам научнику, он мне ответит
На "большой крутой машине" какая ОС?
В общих чертах - smp это когда одна машина и на ней много процессоров, а кластер - это когда много машин на которых много процессоров.
Так, записываю вопросы для научника:
1) Какая на машине операционка.
Что еще спросить?
В общих чертах - smp это когда одна машина и на ней много процессоров, а кластер - это когда много машин на которых много процессоров.Ой, да, что-то было такое курсе на 3ем...
спрошу
Программе можно как-то задавать имя выходного файла?
Программе можно как-то задавать имя выходного файла?Ну, сейчас я задаю имя в теле программы, но это не принципиально. Называться они могут как угодно, ну, более или мненее однообразно, чтобы потом можно написать обработчик этих файлов.
В моем распоряжении будет многопроцессорная большая крутая машина в умном исследовательском центре, если будет bat файл, который в цикле запускает, операционка самостоятельно раскидает процессы по процессорам и поставит их в длинную очередь?В очередь к сожалению не поставит, будет пытаться их все одновременно выполнять.
Это конечно не оптимально, и в идеале тебе надо узнать
а) количество процессоров/ядер на машине
б) написать скрипт который будет последовательно запускать твою программу
в) запустить столько инстансов скрипта сколько процессоров/ядер насчитали в пункте а
Если в ВЦ еще и кластер, то все несколько усложняется.
Вообще, учитывая что у тебя есть научник, лучше тебе к нему с этим вопросом. Он наверняка сможет помочь или найти того, кто поможет.
Вопрос непринципиальный и специфичный, так что смущаться его задавать не надо.
Обычно вместе с доступом к кластеру рассказывают, где лежит руководство пользователя, инструкция или что-то такое, где указано, как именно на этом кластере принято запускать программы. Просто надо понимать принципиальную разницу между настольным компом и кластером.
На настольном компе ты программу запустила и она выполняется. На кластере (на котором много пользователей, много программ на долгое время) установлена та или иная система очередей. Ты добавляешь свою программу в очередь, дав специальную команду. Хочу, мол, выполнить такую программу с такими-то параметрами на стольки-та процессорах (в твоем случае на 1 выполняться она будет не больше стольки-то часов, по завершению пришлите мне письмо на такой-то адрес. Пример А уже система очередей сама в подходящий момент запустит твою программу.
Значит, тебе надо, чтобы результаты запуска программы сохранялись в свой файл. Понятно, что когда имя файла забито в код программы, это есть проблема. Самый простой путь такой: пусть программа распечатывает результат прямо на экран. А при постановке программы в очередь ты укажешь, в какой файл сохранять то, что программа пыталась вывести на экран. Для каждого запуска — свой файл.
Теперь тебе надо 1000 раз дать команду на постановку в очередь твоей программы. Проще всего это сделать, написав командный файл. Давай так. Ты разберешься, как запустить программу один раз, напишешь, какую для этого команду надо дать, а дальше мы посмотрим, как сделать это 1000 раз.
Надеюсь, что поток сознания получился читаемым. Успехов.
Вай, спасибо огромное! буду разбираться, потом напишу!
на чем программа? уже скомпилена или нет? если да, под что скомпилена?
И еще вопрос, девочка блондинка, ты озаботилась инициализацией генератора случайных чисел от времени? Иначе даже в твоей суперстохастической программе все результаты будут одинаковы...
девочка-блондинка вроде не утверждала, что она писала эту программу.
Ну, сейчас я задаю имя в теле программы, но это не принципиально. Называться они могут как угодно, ну, более или мненее однообразно, чтобы потом можно написать обработчик этих файлов.По-моему, это означает, что она ее писала. Нет?
По-моему, это означает, что она ее писала. Нет?нет, ей могли дать готовый текст и объяснить, куда что прописывать.
Это значит, что у нее либо экзешник виндовый и надо пересобирать, либо у нее матлаб какой-нить. Это надо знать, чтоб советовать.
Не обязательно. Или ты напрочь отрицаешь тот вариант, что у неё *.f90-файлик, на компе стоит Intel Fortran Compiler и её объяснили, что перед запуском после модификации текста необходимо запустить ifl имя-файла.f90 ?
1) Программу писала я, программа на C++, писала в 2003ей студии, если это принципиально, то есть под Винду. Пересобрать экзешник могу, обладаю некоторыми минимальными знаниями программирования
2) На счет "инициализации генератора случайных чисел от времени" : случайные числа генерю при помощи функции rand при запуске программы выполняется srandunsigned) time(NULL;
Я искренне думала, что это и есть "инициализация генератора случайных чисел от времени", если не права - расскажите, плиз, как сделать правильно.
это не всегда хороший вариант
покуда наши задачи - не задачи безопасности, покуда надо всего лишь насорить случайного поля, более чем достаточный.
у коллеги обычная MD-симуляция, но ему rand не подходил по статистическим характеристикам
при запуске программы выполняется srandunsigned) time(NULL;Не самый лучший вариант. На кластере, скорее всего, большое количество экзепляров твоей программы будут запускаться параллельно в один и тот же момент времени. И если часы на вычислительных узлах синхронизированы с точностью до секунды...
Теперь по теме. Мои скудные познания про кластеры говорят, что обычно у всех узлов есть общая файловая система или часть файловой системы, примонтированная по сети (например, с помощью NFS). И обычно на кластерах установлена какая-нибудь реализация MPI (самая распространённая - MPICH, есть другие свободные/бесплатные реализации, может быть реализация MPI, выпущенная и оптимизированная специально под данный кластер).
Если оба предположения верны, то могу предложить следующий способ параллельного запуска многих экземпляров программы с помощью MPI.
Входные файлы кладутся в директорию, доступную всем вычислительным узлам. Допустим, именуются 1.in, 2.in, и т.д. С помощью mpirun на каждом узле запускается твоя программа, немножко модифицированная для использования MPI. Твоя программа определяет общее количество узлов с помощью MPI_Comm_size и номер своего узла MPI_Comm_rank. После этого обрабатывает nfiles/size файлов, записывает результаты в соответствующие файлики в другой директории, доступной всем вычислительным узлам, и завершает работу.
То есть каждый экземпляр твоей программы обработает свою часть входных данных (которую определяет по rank). Кстати, в таком случае инициализировать счётчик случайных чисел можно тоже с использованием rank-а.
Подробнее про MPI можно почитать тут: http://computing.llnl.gov/tutorials/mpi/
Да, это и есть инициализация от времени. Попробуй rand48 еще. На многопроцессорной машине, скорее всего, будет *NIX-подобная система, поэтому выкидывай студию, ставь icc (качать с сайта интела) и добивайся компиляции кода на нем. Такой код будет компилиться на всех POSIX-овых компиляторах, то есть на gcc, icc и проч. А то, что скомпилилось в студии - не факт. Удачи.
ступил, пардон
поэтому выкидывай студиюстудию выкидывать не надо, icc встраивается в неё, но по поводу совместимости - это да
pthreads
Уже ж написано, что не нужен тут MPI ни разу.
Уже ж написано, что не нужен тут MPI ни разу.Да, слажал, невнимательно прочитал тред.
mpisubmit или ompsubmit осилят запустить программу, не использующую mpi/openmp?
mpirun, вроде мпичевский, вполне нормально запускает омпшные\непараллельные программы на нодах. Думаю у других реализаций таких проблем тоже не возникает
Оставить комментарий
pogreb38
Нужна помощь девушке-блондинке!Умные мальчики, помогите, пожалуйста
Нужно запустить программку (уже написанную которая считает что-то, а потом выплевывет файлик с результатом, на многопроцессорной машине.
Программу нужно размножить на много процессов, то есть саму прогу распараллеливать не нужно, нужно только много-много (порядка 1000 раз) ее запустить.
Как написать такую программу? видимо, нужно использовать MPI?