-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update throughput model, add shared disk with perf degradation #68
Conversation
Отрефакторил код здесь. Избавился от клонов, в throughput model хранятся DiskActivity, отдельные события на завершение активностей, обработка событий вынесена в функции, приватные функции размещены после публичных. Если все ок, заберите в PR. |
0693862
to
c3e3b33
Compare
Еще раз посмотрел, почему отличаются результаты в примере network_shared. Все-таки дело во floating point арифметике. Там при планировании девятой по счету задачи в throughput model приоритет получается не 0.1, а 0.09999999999999999, из-за чего нарушается ожидаемый порядок активностей и плывет остальная симуляция. Реализация fair_sharing_slow тоже не лишена этой проблемы - только она возникает уже в Варианты, что делать:
|
Провел эксперименты с вышеупомянутым крейтом fixed, не помогло - все равно на том же самом месте портится деление. Вместо этого перешел на рациональные числа из крейта. Перевел на них целиком simcore, throughput-model, network, storage и примеры storage-shared-disk, network_shared. Теперь проблем с ошибками округления нет. Код, связанный с рациональными числами, пока положил в simcore/src/component.rs, но надо будет место получше найти. На первый взгляд кажется, что и другие крейты перевести будет несложно. Вижу только две потенциальные проблемы:
|
Протестировал переполнение. Достаточно такого кода (внутри let mut sim = Simulation::new(123);
let shared_network_model = rc!(refcell!(SharedBandwidthNetwork::new(
Fractional::from_integer(10),
Fractional::one() / Fractional::from_integer(10)
)));
let shared_network = rc!(refcell!(Network::new(shared_network_model, sim.create_context("net"))));
sim.add_handler("net", shared_network.clone());
let receiver_name = "receiver";
let receiver = DataReceiver::new(shared_network.clone(), sim.create_context(&receiver_name));
let receiver_id = sim.add_handler(&receiver_name, rc!(refcell!(receiver)));
let sender_name = "sender";
let sender = DataTransferRequester::new(shared_network.clone(), sim.create_context(&sender_name));
let sender_id = sim.add_handler(&sender_name, rc!(refcell!(sender)));
let mut client = sim.create_context("client");
for _ in 0..50 {
let size = client.gen_range(1..1000);
let time = client.gen_range(1..1000);
client.emit(
Start {
size: Fractional::from_integer(size),
receiver_id: receiver_id,
},
sender_id,
Fractional::from_integer(time)
);
}
sim.step_until_no_events(); То есть 50 случайных передач, и Rational падает с ошибкой переполнения |
Надо добавть тесты для проверки корректности |
Предлагаю пока оставить вариант 1, и сделать отдельное issue про это, где обсудить возможные варианты решения. |
…add slow model for future tests
14e7ba3
to
9ceda0e
Compare
Сделал #83 |
No description provided.