C MPI — лучший способ автоматизировать многократные запуски и хранить журналы и информацию. Предопределение глобальных переменных

#c #io #mpi

#c #io #mpi

Вопрос:

Я хочу протестировать пару алгоритмов, которые я написал, и вместо того, чтобы делать это, повторяя процедуру, изменяя переменные и записывая выходные данные, я хочу реализовать автоматизацию для этой процедуры. Я бы хотел, чтобы это было похоже на тип сценария, в котором я могу объявить количество процессоров, некоторые переменные и, безусловно, иметь форматированный вывод со всеми выводами из нескольких запусков. Формат вывода может быть текстовым форматом, но меня бы не беспокоило, если бы я мог позже использовать этот файл для создания 2-мерного графика и т. Д. Есть идеи?

Ответ №1:

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

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

в вашей программе:

 // ensure argc >= 4

int   argA = atoi(argv[1]);
float argB = atof(argv[2]);

char* output_filename = argv[3];
  

в вашем скрипте:

 for A in 1 2 3
do
    for B in 0.1 0.2 0.3
    do
         mpirun a.out $A $B results_of_run_${A}_${B}.txt
    done
done
  

Комментарии:

1. Это идея, но у меня возникают трудности с ее реализацией. Например, у меня есть 3 глобальные переменные x, y, z, которые я хочу изменять на протяжении всей процедуры. Сначала программа должна быть скомпилирована, а затем запущена для нескольких процессов. Наконец, файл. Какой формат он должен быть и как я мог бы заставить его не стирать все предыдущие записи при записи в файл (по моему опыту, когда вы несколько раз вызываете программу, которая записывает в файл, она продолжает перезаписывать данные по всему файлу.

2. Добавьте поддержку командной строки для установки этих глобальных переменных в вашей программе (т. Е. Использования argv ). Пусть имя файла вывода отражает ваши параметры, чтобы вы не перезаписывали один и тот же выходной файл. Либо сгенерируйте имя файла внутри (наименее предпочтительное), используйте другой переключатель, чтобы скрипт указывал выходное имя файла, либо выводите stdout и используйте ОС для отправки в соответствующий файл (канал, если общая память или настройка выходного файла PBS, если нет).

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

4. Сначала о главном. Что это? Могу ли я передавать целочисленные аргументы из командной строки во время запуска программы (или, в данном случае, автоматизированного скрипта)? Argv и Argc предназначены для передачи строковых аргументов, а не целых чисел. Кроме того, это будет выполняться в параллельном кластере с использованием MPI (mpicc amp; mpiexec) — MPICH для ясности.

5. Во-вторых, какое отношение выходной файл имеет к сценарию? Выходной файл создается и записывается самой программой. Я должен сказать, что мои знания об этом довольно минимальны, но не забудьте уточнить метод вывода конвейера. Я бы следил за тем fprint , как писать в тексте, но, как я уже сказал, он продолжает перезаписывать файл при каждом выполнении. И эта проблема усугубляется параллельно, когда каждый процессор продолжает перезаписывать файл во время одного выполнения. Также я думал, что сценарий может быть сценарием bash.