scope_profiler.plotting_scripts.scaling
Scaling charts: speedup, weak-scaling, and parallel-efficiency curves.
Functions
| Name | Description |
|---|---|
plot_scaling_efficiency | Plot parallel scaling efficiency (measured speedup / ideal speedup). |
plot_speedup | Plot scope speedup versus a chosen parallelism/metadata field using maxplotlib. |
plot_weak_scaling | Plot weak-scaling runtime versus a chosen parallelism/metadata field. |
plot_weak_scaling_efficiency | Plot weak-scaling efficiency: baseline runtime over runtime at each scale. |
plot_scaling_efficiencyfunction#
def plot_scaling_efficiency(profiling_data: ProfilingResults | Sequence[ProfilingResults], x_field: str = 'num_ranks', ranks: list[int] | int | None = None, include: list[str] | str | None = None, exclude: list[str] | str | None = None, filepath: str | None = None, show: bool = False, verbose: bool = True, cmap: str = DEFAULT_CMAP, data_filepath: str | Path | None = None, data_format: str = 'csv', backend: str = 'matplotlib', return_fig: bool = False) -> object | NonePlot parallel scaling efficiency (measured speedup / ideal speedup).
plot_speedupfunction#
def plot_speedup(profiling_data: ProfilingResults | Sequence[ProfilingResults], x_field: str = 'num_ranks', ranks: list[int] | int | None = None, include: list[str] | str | None = None, exclude: list[str] | str | None = None, filepath: str | None = None, show: bool = False, verbose: bool = True, cmap: str = DEFAULT_CMAP, data_filepath: str | Path | None = None, data_format: str = 'csv', backend: str = 'matplotlib', return_fig: bool = False) -> object | NonePlot scope speedup versus a chosen parallelism/metadata field using maxplotlib.
Parameters
backend : str Backend to use for rendering: “matplotlib” (default) or “plotly”.
plot_weak_scalingfunction#
def plot_weak_scaling(profiling_data: ProfilingResults | Sequence[ProfilingResults], x_field: str = 'num_ranks', ranks: list[int] | int | None = None, include: list[str] | str | None = None, exclude: list[str] | str | None = None, filepath: str | None = None, show: bool = False, verbose: bool = True, cmap: str = DEFAULT_CMAP, data_filepath: str | Path | None = None, data_format: str = 'csv', backend: str = 'matplotlib', return_fig: bool = False) -> object | NonePlot weak-scaling runtime versus a chosen parallelism/metadata field.
Runtime is normalized to the smallest scale, so ideal weak scaling is a horizontal line at 1.0. Lower values are not inherently better here: the useful signal is how closely each region stays near that line.
See :func:plot_weak_scaling_efficiency for the same data read as a
fraction of ideal instead.
plot_weak_scaling_efficiencyfunction#
def plot_weak_scaling_efficiency(profiling_data: ProfilingResults | Sequence[ProfilingResults], x_field: str = 'num_ranks', ranks: list[int] | int | None = None, include: list[str] | str | None = None, exclude: list[str] | str | None = None, work_per_rank: Sequence[float] | None = None, filepath: str | None = None, show: bool = False, verbose: bool = True, cmap: str = DEFAULT_CMAP, data_filepath: str | Path | None = None, data_format: str = 'csv', backend: str = 'matplotlib', return_fig: bool = False) -> object | NonePlot weak-scaling efficiency: baseline runtime over runtime at each scale.
A weak-scaling study grows the problem with the machine, so every run does the same work per rank and ideal efficiency is a flat 1.0. A region at 0.6 on 64 ranks is spending 40% of its time on costs that only appear at that scale - communication, load imbalance, or contention.
This differs from :func:plot_scaling_efficiency, which is for a
strong-scaling study: there the problem size is fixed, so the ideal is
a speedup proportional to the rank count and efficiency divides the
measured speedup by that. Here the ideal is constant runtime, so no such
division applies - using the strong-scaling plot on weak-scaling runs
reports a near-zero efficiency that means nothing.
Parameters
work_per_rank : Sequence[float], optional Work per rank for each profiling run, in whatever unit suits the problem (grid cells, particles, unknowns). Only the caller can know this - it is a property of the problem, not of the profile - so it is optional, but when given it is checked: the runs must agree, and a mismatch raises rather than plotting an efficiency that silently compares runs doing different amounts of work. The value is recorded in the exported plot data.