/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠAt Large ĠResearch Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġorg . opend c . simulator . compute Ċ Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . opend c . simulator . compute . kernel . Sim F air Share Hyper visor Ċ import Ġorg . opend c . simulator . compute . kernel . Sim Space Shared Hyper visor Ċ import Ġorg . opend c . simulator . compute . model . Machine Model Ċ import Ġorg . opend c . simulator . compute . model . Memory Unit Ċ import Ġorg . opend c . simulator . compute . model . Processing Node Ċ import Ġorg . opend c . simulator . compute . model . Processing Unit Ċ import Ġorg . opend c . simulator . compute . power . Constant Power Model Ċ import Ġorg . opend c . simulator . compute . power . Simple Power Driver Ċ import Ġorg . opend c . simulator . compute . workload . Sim Trace Ċ import Ġorg . opend c . simulator . compute . workload . Sim Trace Workload Ċ import Ġorg . opend c . simulator . core . run Blocking Simulation Ċ import Ġorg . opend c . simulator . flow . Flow Engine Ċ import Ġorg . openjdk . j mh . annotations .* Ċ import Ġjava . util . concurrent . Thread Local Random Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ State ( Scope . Thread ) Ċ @ Fork ( 1 ) Ċ @ W arm up ( iterations Ġ= Ġ 2 , Ġtime Ġ= Ġ 1 , Ġtime Unit Ġ= ĠTimeUnit . SECONDS ) Ċ @ Measurement ( iterations Ġ= Ġ 5 , Ġtime Ġ= Ġ 3 , Ġtime Unit Ġ= ĠTimeUnit . SECONDS ) Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠSim Machine Bench marks Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmachine Model : ĠMachine Model ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtrace : ĠSim Trace ĊĊĠĠĠ Ġ@ Setup ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcpu Node Ġ= ĠProcessing Node (" Intel ", Ġ" Xe on ", Ġ" amd 6 4 ", Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġmachine Model Ġ= ĠMachine Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcp us Ġ= ĠList ( cpu Node . core Count ) Ġ{ ĠProcessing Unit ( cpu Node , Ġit , Ġ 1 0 0 0 . 0 ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Ġ= ĠList ( 4 ) Ġ{ ĠMemory Unit (" Cr uc ial ", Ġ" MT A 1 8 ASF 4 G 7 2 AZ - 3 G 2 B 1 ", Ġ 3 2 0 0 . 0 , Ġ 3 2 _ 0 0 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠThread Local Random . current () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠSim Trace . builder () ĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġit . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeadline Ġ= Ġtimestamp Ġ+ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add ( timestamp , Ġdeadline , Ġrandom . next Double ( 0 . 0 , Ġ 4 5 0 0 . 0 ), Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtrace Ġ= Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Benchmark ĊĠĠĠ Ġfun Ġbenchmark B are Metal () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠFlow Engine ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= ĠSim B are Metal Machine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine , Ġmachine Model , ĠSimple Power Driver ( Constant Power Model ( 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Simulation Ġmachine . run Workload ( Sim Trace Workload ( trace )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Benchmark ĊĠĠĠ Ġfun Ġbenchmark Space Shared Hyper visor () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠFlow Engine ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= ĠSim B are Metal Machine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine , Ġmachine Model , ĠSimple Power Driver ( Constant Power Model ( 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhyper visor Ġ= ĠSim Space Shared Hyper visor ( engine , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġmachine . run Workload ( hyper visor ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Ġ= Ġhyper visor . new Machine ( machine Model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Simulation Ġvm . run Workload ( Sim Trace Workload ( trace )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Benchmark ĊĠĠĠ Ġfun Ġbenchmark F air Share Hyper visor Single () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠFlow Engine ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= ĠSim B are Metal Machine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine , Ġmachine Model , ĠSimple Power Driver ( Constant Power Model ( 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhyper visor Ġ= ĠSim F air Share Hyper visor ( engine , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġmachine . run Workload ( hyper visor ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Ġ= Ġhyper visor . new Machine ( machine Model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Simulation Ġvm . run Workload ( Sim Trace Workload ( trace )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Benchmark ĊĠĠĠ Ġfun Ġbenchmark F air Share Hyper visor Double () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Blocking Simulation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠFlow Engine ( coroutine Context , Ġclock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmachine Ġ= ĠSim B are Metal Machine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine , Ġmachine Model , ĠSimple Power Driver ( Constant Power Model ( 0 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhyper visor Ġ= ĠSim F air Share Hyper visor ( engine , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġmachine . run Workload ( hyper visor ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Ġ= Ġhyper visor . new Machine ( machine Model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm . run Workload ( Sim Trace Workload ( trace )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ