Запуск параллельных симуляций (с использованием командной строки)

Как запустить симуляцию с разными конфигурациями? Я использую omnet++ версии 4.6.

Мой файл omnetpp.ini выглядит следующим образом:

[General]

[Config Dcn2]

network = Dcn2

# leaf switch
#**.down_port = 2
**.up_port = 16 #12   # 4

# spine switch
**.port =  28 # 20 #2048

# crossconnect
**.cross_down_port = 28 # 20 #2048
**.cross_up_port = 28 # 20 #2048

# to set destination of packet
**.number_leaf_switch = 28 # 20 #2048

# link speed
#**.switch_switch_link_speed = 40 Mbps


**.interArrivalTime = ${exponential(.0001),exponential(0.0002),exponential(0.0003)}   

**.batch_length = 10
**.buffer_length = 10

sim-time-limit = 1000s

Я хочу запустить код с разными значениями interArrivalTime. Но я не могу ни запускать с разными конфигами (один за другим), ни запускать отдельные прогоны параллельно на отдельных ядрах.

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


person Sampi    schedule 01.06.2015    source источник
comment
не могли бы вы добавить команды, которые вы пытались запустить более чем на одном ядре, и те, которые вы пробовали в файле cmdenv. Это поможет мне дать ответ   -  person user4786271    schedule 01.06.2015
comment
Я попытался сделать это, поставив * в поле номера запуска и указав количество процессов, равное 4 или 5.   -  person Sampi    schedule 01.06.2015
comment
не могли бы вы добавить команды...?   -  person user4786271    schedule 01.06.2015
comment
я пробовал это в самом omnet++ ide в самой конфигурации запуска   -  person Sampi    schedule 01.06.2015
comment
ну, это так не работает ... какие-либо отзывы о подходе, представленном в ответе ниже?   -  person user4786271    schedule 02.06.2015
comment
Да, это работает для нескольких других кодов, которые я пробовал, но я не знаю, почему это не сработало на этот раз. Спасибо за вашу помощь. Я могу запускать 7 разных конфигураций одновременно из командной строки. Но ./run не работает. Мне пришлось использовать ./filename .   -  person Sampi    schedule 03.06.2015
comment
да, .fileName или .exampleName - это еще один вариант запуска симуляций... если вы считаете мой ответ полезным, примите его, чтобы он помог в будущем обращаться к другим членам SO   -  person user4786271    schedule 03.06.2015


Ответы (1)


Проверка конфигурации

В вашем случае вы можете выполнить проверку конфигурации. OMNeT++ предлагает различные варианты для этого. Они объясняются в разделе Изучение параметров руководства по OMNeT++.

Таким образом, вы можете попробовать один из следующих вариантов для проверки ваших конфигураций и, следовательно, файла конфигурации:

  • ./run –a - покажет все конфигурации в omnet.ini
  • ./run -x <config_name> - даст больше информации о конкретной конфигурации
  • ./run -x <config_name> -g - посмотреть все комбинации конфигов

Сначала вам нужно будет перейти в папку примера и выполнить там одну из вышеупомянутых команд.


Я выполнил: ./run -x Dcn2 -g и получил следующие результаты

OMNeT++ Discrete Event Simulation  (C) 1992-2014 Andras Varga, OpenSim Ltd.
Version: 4.6, build: 141202-f785492, edition: Academic Public License -- NOT FOR COMMERCIAL USE
See the license for distribution terms and warranty disclaimer
Setting up Tkenv...

Config: Dcn2
Number of runs: 3
Run 0: $0=exponential(.0001), $repetition=0
Run 1: $0=exponential(0.0002), $repetition=0
Run 2: $0=exponential(0.0003), $repetition=0

End.

Это действительно подтверждает, что у вас есть 3 разных прогона для параметра моделирования, который вы пытаетесь изменить. Однако имя переменной, которое вы используете для параметра interArrivalTime, по умолчанию назначается $0, поскольку вы его не указали.

Если вы измените следующую строку в конфигурации:

**.interArrivalTime = ${exponential(.0001),exponential(0.0002),exponential(0.0003)}

to

**.interArrivalTime = ${interArrivalTime = exponential(0.0001),exponential(0.0002),exponential(0.0003)}

вы получите более описательный вывод для ./run -x Dcn2 -g


Запуск различных запусков конфигурации:

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

./run -c <config-name> -r <run-number> -u Cmdenv

Обратите внимание, что <config-name> будет для вас Dcn2, а -r указывает, какой из приведенных выше запусков вы хотели бы выполнить.

Другими словами, вы можете открыть три окна терминала, перейти в каталог примеров и выполнить:

  1. ./run -c Dcn2 -r 0 -u Cmdenv - для interArrivalTime = экспоненциальный (0,0001)
  2. ./run -c Dcn2 -r 1 -u Cmdenv - для interArrivalTime = экспоненциальный (0,0002)
  3. ./run -c Dcn2 -r 2 -u Cmdenv - для interArrivalTime = экспоненциальное (0,0003)

Различение разных результатов запуска

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

Инструкции приведены в разделе 12.2.3 Имена файлов результатов руководства OMNeT++.

output-vector-file = "${resultdir}/${configname}-${runnumber}.vec"
output-scalar-file = "${resultdir}/${configname}-${runnumber}.sca"

Как видите, по умолчанию ваши выходные файлы будут различаться по переменной ${runnumber}. Вы можете улучшить его, добавив interArrivalTime к имени выходного файла.

Пример:

output-scalar-file = "${resultdir}/${configname}-${runnumber}-IAtime=${interArrivalTime}.sca/vec"

Я не тестировал окончательный подход. Таким образом, вы можете получить некоторую ошибку на пути.

person user4786271    schedule 01.06.2015
comment
Выделение **.interArrivalTime = exponential(${interArrivalTime = 0.0001, 0.0002, 0.0003}) было бы еще более естественным + дополнительный совет: вы можете использовать команду opp_runall для запуска всех итераций из командной строки и даже указать -j4, что она должна использовать 4 ядра параллельно. - person Rudi; 06.07.2015