diff --git a/README.md b/README.md index bb69c78b2..0501e5ec5 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ A fast and user-transparent parallel simulator implementation for ns-3. More information about UNISON can be found in our EuroSys '24 paper (coming soon). Supported ns-3 version: [3.36.1](tree/unison-3.36.1), [3.37](tree/unison-3.37), [3.38](tree/unison-3.38), [3.39](tree/unison-3.36.1). +We are trying to keep UNISON updated with the latest version of ns-3. You can find each unison-enabled ns-3 version via `unison-*` tags. ## Getting Started @@ -65,15 +66,19 @@ MtpInterface::CriticalSection cs; at the beginning of your methods. +In addition to the DCTCP example above, you can find other adapted examples in `examples/mtp`. + ## Running Evaluations -To evaluate UNISON, please checkout to [unison-evaluations](https://github.com/NASA-NJU/UNISON-for-ns-3/tree/unison-evaluations) branch. +To evaluate UNISON, please switch to [unison-evaluations](https://github.com/NASA-NJU/UNISON-for-ns-3/tree/unison-evaluations) branch, which is based on ns-3.36.1. In this branch, you can find various topology models in the `scratch` folder. There are a lot of parameters you can set for each topology. We provided a utility script `exp.py` to compare these simulators and parameters. -We also provided `process.py` to convert these raw experiment data to CSV files suitable for ploting. +We also provided `process.py` to convert these raw experiment data to CSV files suitable for plotting. Please see the [README in that branch](https://github.com/NASA-NJU/UNISON-for-ns-3/tree/unison-evaluations) for more details. +The evaluated artifact (based on ns-3.36.1) is persistently indexed by DOI [10.5281/zenodo.10077300](https://doi.org/10.5281/zenodo.10077300). + ## Module Documentation ### 1. Overview @@ -164,6 +169,14 @@ src/nix-vector-routing/model/nix-vector-routing.cc | 92 ++ src/nix-vector-routing/model/nix-vector-routing.h | 8 + ``` +Modifications to the `mpi` module to make it thread-safe with the hybrid simulator: + +``` +src/mpi/model/granted-time-window-mpi-interface.cc | 25 + +src/mpi/model/granted-time-window-mpi-interface.h | 7 + +src/mpi/model/mpi-interface.cc | 3 +- +``` + ### 3. Logging The reason behind UNISON's fast speed is that it divides the network into multiple logical processes (LPs) with fine granularity and schedules them dynamically. @@ -197,7 +210,7 @@ Config::SetDefault("ns3::HybridSimulatorImpl::MinLookahead", TimeValue(NanoSecon The scheduling method determines the priority (estimated completion time of the next round) of each logical process. There are five available options: -- `ByExecutionTime`: LPs with higher execution time of the last round will have higher priority. +- `ByExecutionTime`: LPs with a higher execution time of the last round will have higher priority. - `ByPendingEventCount`: LPs with more pending events of this round will have higher priority. - `ByEventCount`: LPs with more pending events of this round will have higher priority. - `BySimulationTime`: LPs with larger current clock time will have higher priority. diff --git a/examples/mtp/dctcp-example-mtp.cc b/examples/mtp/dctcp-example-mtp.cc index ede0d0c63..db855d86f 100644 --- a/examples/mtp/dctcp-example-mtp.cc +++ b/examples/mtp/dctcp-example-mtp.cc @@ -303,8 +303,6 @@ main(int argc, char* argv[]) Time startTime = Seconds(0); Time stopTime = flowStartupWindow + convergenceTime + measurementWindow; - Time clientStartTime = startTime; - rxS1R1Bytes.reserve(10); rxS2R2Bytes.reserve(20); rxS3R1Bytes.reserve(10); @@ -495,7 +493,7 @@ main(int argc, char* argv[]) AddressValue remoteAddress(InetSocketAddress(ipR2T2[i].GetAddress(0), port)); clientHelper1.SetAttribute("Remote", remoteAddress); clientApps1.Add(clientHelper1.Install(S2.Get(i))); - clientApps1.Start(i * flowStartupWindow / 20 + clientStartTime + MilliSeconds(i * 5)); + clientApps1.Start(i * flowStartupWindow / 20 + startTime + MilliSeconds(i * 5)); clientApps1.Stop(stopTime); } @@ -536,13 +534,12 @@ main(int argc, char* argv[]) if (i < 10) { clientApps1.Add(clientHelper1.Install(S1.Get(i))); - clientApps1.Start(i * flowStartupWindow / 10 + clientStartTime + MilliSeconds(i * 5)); + clientApps1.Start(i * flowStartupWindow / 10 + startTime + MilliSeconds(i * 5)); } else { clientApps1.Add(clientHelper1.Install(S3.Get(i - 10))); - clientApps1.Start((i - 10) * flowStartupWindow / 10 + clientStartTime + - MilliSeconds(i * 5)); + clientApps1.Start((i - 10) * flowStartupWindow / 10 + startTime + MilliSeconds(i * 5)); } clientApps1.Stop(stopTime);