diff --git a/spinn_machine/version/version_3.py b/spinn_machine/version/version_3.py index f81b40c0..b8dc36e4 100644 --- a/spinn_machine/version/version_3.py +++ b/spinn_machine/version/version_3.py @@ -32,6 +32,10 @@ class Version3(VersionSpin1): """ __slots__ = () + #: From measuring the power of an idle 4-chip board for 1 hour, the cost + #: is 3.56W + WATTS_FOR_4_CHIP_BOARD_IDLE_COST: Final = 3.56 + @property @overrides(VersionSpin1.name) def name(self) -> str: @@ -98,7 +102,9 @@ def get_idle_energy( raise SpinnMachineException( "A version 3 SpiNNaker 1 board has exactly one board!") - return n_chips * self.WATTS_PER_IDLE_CHIP * time_s + # We allow n_boards to be 0 to discount the cost of the board, + # so we multiply by n_boards in case it is 0! + return n_boards * self.WATTS_FOR_4_CHIP_BOARD_IDLE_COST * time_s @overrides(VersionSpin1.get_active_energy) def get_active_energy( diff --git a/spinn_machine/version/version_5.py b/spinn_machine/version/version_5.py index ecd56e46..92dc2b29 100644 --- a/spinn_machine/version/version_5.py +++ b/spinn_machine/version/version_5.py @@ -52,14 +52,16 @@ class Version5(VersionSpin1, Version48Chips): WATTS_PER_FRAME_ACTIVE_COST_OVERHEAD: Final = 154.163558 - 117 # pylint: disable=invalid-name - #: measured from the real power meter and timing between the photos - #: for a day with just the cooling fans of the boxed board. - WATTS_FOR_48_CHIP_BOX_COST_OVERHEAD: Final = 4.5833333 + #: from Optimising the overall power usage on the SpiNNaker neuromimetic + #: platform, an idle board uses 26.84W and from measurement of a boxed + #: board with all cores idle for 1 hour including the power supply and all + #: parts, uses 31.88W, so the overhead is 5.04W + WATTS_FOR_48_CHIP_BOX_COST_OVERHEAD: Final = 5.04 # pylint: disable=invalid-name - #: measured from the real power meter and timing between the photos - #: for a day powered off - WATTS_FOR_48_CHIP_BOARD_IDLE_COST: Final = 4.5833333 + #: from Optimising the overall power usage on the SpiNNaker neuromimetic + #: platform, an idle board uses 26.84W + WATTS_FOR_48_CHIP_BOARD_IDLE_COST: Final = 26.84 @property @overrides(VersionSpin1.name) @@ -109,8 +111,9 @@ def fpga_links(self) -> List[Tuple[int, int, int, int, int]]: def get_idle_energy( self, time_s: float, n_frames: int, n_boards: int, n_chips: int) -> float: - # Chips idle energy - energy = n_chips * self.WATTS_PER_IDLE_CHIP * time_s + + # The board idle energy + energy = n_boards * self.WATTS_FOR_48_CHIP_BOARD_IDLE_COST * time_s # The container of the boards idle energy if n_frames != 0: @@ -121,8 +124,6 @@ def get_idle_energy( n_frames * self.WATTS_FOR_48_CHIP_BOX_COST_OVERHEAD * time_s) - # The FPGAs + board idle energy, excluding the chips - energy += n_boards * self.WATTS_FOR_48_CHIP_BOARD_IDLE_COST * time_s return energy @overrides(VersionSpin1.get_active_energy) diff --git a/spinn_machine/version/version_spin1.py b/spinn_machine/version/version_spin1.py index b0287913..a3eef5e3 100644 --- a/spinn_machine/version/version_spin1.py +++ b/spinn_machine/version/version_spin1.py @@ -28,15 +28,10 @@ class VersionSpin1(AbstractVersion, metaclass=AbstractBase): Shared code for all Spin1 board versions """ - #: stated in papers (SpiNNaker: A 1-W 18 core system-on-Chip for - #: Massively-Parallel Neural Network Simulation) - #: (includes Idle chip @ 360mW, SDRAM @ 170mW and idle cores @ 20mW each) - WATTS_PER_IDLE_CHIP: Final = 0.360 + 0.170 + (0.02 * 18) - - #: stated in papers (SpiNNaker: A 1-W 18 core system-on-Chip for - #: Massively-Parallel Neural Network Simulation) - #: = (1000mW - WATTS_PER_IDLE_CHIP - (6.3mW for each link)) / 18 ~= 4mW - WATTS_PER_CORE_ACTIVE_OVERHEAD: Final = 0.004 + #: From measuring the power of all 48 chips on a boxed board with all cores + #: idle for 1 hour and 806 cores active for 1 hour we get 31.88W idle and + #: 59.37W active, so 27.49W active overhead, which is 0.034W per core + WATTS_PER_CORE_ACTIVE_OVERHEAD: Final = 0.034 #: stated in papers (SpiNNaker: A 1-W 18 core system-on-Chip for #: Massively-Parallel Neural Network Simulation)