From c619ca3a6574a48a1033ff756265f82e96721048 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Tue, 22 Apr 2025 12:16:34 +0200 Subject: [PATCH 01/11] add graphviz script --- doc/htmldoc/_ext/make_diagram.py | 169 +++++++++++++++++++++++++++++++ doc/htmldoc/conf.py | 4 +- 2 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 doc/htmldoc/_ext/make_diagram.py diff --git a/doc/htmldoc/_ext/make_diagram.py b/doc/htmldoc/_ext/make_diagram.py new file mode 100644 index 0000000000..d8739179dc --- /dev/null +++ b/doc/htmldoc/_ext/make_diagram.py @@ -0,0 +1,169 @@ +""" +Create an archtictural DOT diagram from YAML input. +""" + +import yaml +from graphviz import Digraph +from sphinx.application import Sphinx + + +def add_subgraph(graph, data): + """ + Recursively add subgraphs and nodes to the graph, + preserving the hierarchy and attributes from the YAML. + """ + if isinstance(data, list): + i = 0 + while i < len(data): + item = data[i] + if "name" in item: + name = item["name"] + # Gather all subsequent dicts without 'name' as attributes + j = i + 1 + attrs = {} + # Collect all attributes for this subgraph + while j < len(data) and "name" not in data[j]: + attrs.update(data[j]) + j += 1 + # Create subgraph + with graph.subgraph(name=f"cluster_{name}") as sg: + sg.attr(label=name) + # Here we define some attributes for all subgraphs + sg.attr(fontname="Helvetica,Arial,sans-serif", fontcolor="white", style="filled") + # Apply all collected attributes to the subgraph + for key, value in attrs.items(): + if key != "node" and key != "subgraph": + sg.attr(**{key: value}) + # Add nodes + nodes = attrs.get("node", []) + if isinstance(nodes, str): + nodes = [nodes] + for n in nodes: + sg.node(n) + # Recurse into nested subgraphs + if "subgraph" in attrs: + add_subgraph(sg, attrs["subgraph"]) + i = j + else: + i += 1 + + +def yaml_to_graphviz(yaml_str): + """ + Convert a YAML string to a Graphviz Digraph. + + Parameters: + yaml_str (str): The YAML string to convert. + + Returns: + Digraph: The generated Graphviz Digraph. + """ + try: + data = yaml.safe_load(yaml_str) + except yaml.YAMLError as e: + raise ValueError(f"Error parsing YAML: {e}") from e + if not isinstance(data, dict): + raise ValueError("YAML data must be a dictionary") + + dot = Digraph( + "G", + node_attr={ + "fontname": "Helvetica,Arial,sans-serif", + "shape": "box", + "fontcolor": "black", + "style": "filled", + "fillcolor": "white", + }, + ) + dot.attr( + rankdir="LR", + bgcolor="#ff6633", + label="Simulation Run", + labelloc="t", + fontcolor="white", + fontname="Helvetica,Arial,sans-serif", + ) + for main_section in data.values(): + add_subgraph(dot, main_section["subgraph"]) + # dot.render(output_file, format='svg', cleanup=True) + return dot + + +# --- Use the full YAML --- +GRAPH_YAML = """ +simulation_run: + subgraph: + - name: simulate_timer + - fillcolor: '#072f42' + subgraph: + - name: OMP_Parallel + - fillcolor: '#0E6A93' + subgraph: + - name: time_driven_loop + - fillcolor: '#4b210c' + subgraph: + - name: deliver_spike_data_timer + - fillcolor: '#072f42' + node: deliver_events + - name: if_detailed_timers_enabled + - fillcolor: 'darkgrey' + node: OMP_Barrier + - name: update_timer + - fillcolor: 'darkgrey' + node: + - node_update + - OMP_Barrier + - node: OMP_barrier + - name: OMP_Master + - fillcolor: '#0E6A93' + subgraph: + - name: gather_spike_data_timer + - fillcolor: '#072f42' + subgraph: + - name: gather_spike_data + - fillcolor: '#4b210c' + subgraph: + - name: do_once_repeat_if_failed + - fillcolor: 'darkgrey' + subgraph: + - name: if_buffers_can_shrink + node: shrink_MPI_buffer_size + - name: collocate_spike_data_timer + - fillcolor: '#072f42' + node: + - reset_MPI_buffer_markers + - collocate_spike_data + - set_end_markers_in_MPI_buffer + - name: communicate_spike_data_timer + - fillcolor: '#072f42' + node: communicate_spike_data + - node: advance_time +""" + + +def yaml2dot(app, env, docnames): + """ + Sphinx event handler to convert YAML data to a Graphviz DOT file. + """ + + dot = yaml_to_graphviz(GRAPH_YAML) + with open("simulation_run.dot", "w", encoding="UTF-8") as f: + f.write(dot.source) + + +def setup(app): + """ + Setup function for the Sphinx extension. + + This function connects the `yaml2dot` event handler to the + `env-before-read-docs` event, which is triggered before Sphinx reads + the documentation files. + """ + + app.connect("env-before-read-docs", yaml2dot) + + return { + "version": "0.1", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/doc/htmldoc/conf.py b/doc/htmldoc/conf.py index e4d309a098..d80562e4e3 100644 --- a/doc/htmldoc/conf.py +++ b/doc/htmldoc/conf.py @@ -44,6 +44,7 @@ extensions = [ "sphinx_gallery.gen_gallery", "list_examples", + "sphinx.ext.graphviz", "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx.ext.autosummary", @@ -55,6 +56,7 @@ "sphinxcontrib.plantuml", "add_button_notebook", "IPython.sphinxext.ipython_console_highlighting", + "make_diagram", "model_tag_setup", "nbsphinx", "extract_api_functions", @@ -101,7 +103,7 @@ # |version| and |release|, also used in various other places throughout the # built documents. # - +graphviz_output_format = "svg" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # From 4afb4fb20495985244ac3da225567202f4ca34ad Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Tue, 22 Apr 2025 12:18:16 +0200 Subject: [PATCH 02/11] update text, add dot --- doc/htmldoc/benchmark_results.rst | 7 +- doc/htmldoc/hpc/benchmarking.rst | 10 +- doc/htmldoc/nest_behavior/built-in_timers.rst | 170 +++++++++++------- .../nest_behavior/running_simulations.rst | 1 + 4 files changed, 116 insertions(+), 72 deletions(-) diff --git a/doc/htmldoc/benchmark_results.rst b/doc/htmldoc/benchmark_results.rst index 46954b0ead..bb7fa8b646 100644 --- a/doc/htmldoc/benchmark_results.rst +++ b/doc/htmldoc/benchmark_results.rst @@ -7,6 +7,7 @@ NEST performance benchmarks NEST performance is continuously monitored and improved across various network sizes. Here we show benchmarking results for NEST version 3.8 on Jureca-DC [1]_. The benchmarking framework and the structure of the graphs is described in [2]_. +For details on `State Propagation` (i.e., `Simulation Run`), see the guides :ref:`built_in_timers` and :ref:`run_simulations` Strong scaling experiment of the Microcircuit model [3]_ --------------------------------------------------------- @@ -45,11 +46,11 @@ Strong scaling experiment of the Multi-area-model [5]_ :columns: 10 Dynamical regime: Ground state - + .. image:: /static/img/mam_ground-state_benchmark.png Dynamical regime: Metastable state - + .. image:: /static/img/mam_metastable-state_benchmark.png @@ -96,6 +97,8 @@ Weak scaling experiment of the HPC benchmark model [6]_ .. seealso:: + * Guide to :ref:`Built-in timers ` and :ref:`run_simulations`. + Example networks: * :doc:`/auto_examples/Potjans_2014/index` diff --git a/doc/htmldoc/hpc/benchmarking.rst b/doc/htmldoc/hpc/benchmarking.rst index 870baf86a9..282184d01f 100644 --- a/doc/htmldoc/hpc/benchmarking.rst +++ b/doc/htmldoc/hpc/benchmarking.rst @@ -33,18 +33,20 @@ For more details on the conceptual ideas behind beNNch, refer to Albers et al. ( The left graph shows the absolute wall-clock time measured with Python-level timers for both network construction and state propagation. Error bars indicate variability across three simulation repeats with different random seeds. The top right graph displays the real-time factor defined as wall-clock time normalized by the model time. - Built-in timers resolve four different phases of the state propagation: update, collocation, communication, and delivery. + :ref:`Built-in timers ` resolve four different phases of the state propagation: update, collocation, communication, and delivery. Pink error bars show the same variability of state propagation as the left graph. The lower right graph shows the relative contribution of these phases to the state-propagation time. .. seealso:: - For further details, see the accompanying `beNNch GitHub Page `_. - And for a detailed step-by-step walk though see `Walk through guide `_. + * For further details, see the accompanying `beNNch GitHub Page `_. - Example PyNEST script: :doc:`../auto_examples/hpc_benchmark` + * For a detailed step-by-step walk though see `Walk through guide `_. + * Example PyNEST script: :doc:`../auto_examples/hpc_benchmark` + + * Guide to :ref:`built_in_timers` and :ref:`running simulations `. References ---------- diff --git a/doc/htmldoc/nest_behavior/built-in_timers.rst b/doc/htmldoc/nest_behavior/built-in_timers.rst index e9f6a914f7..01d819a737 100644 --- a/doc/htmldoc/nest_behavior/built-in_timers.rst +++ b/doc/htmldoc/nest_behavior/built-in_timers.rst @@ -61,72 +61,110 @@ Detailed timers Detailed built-in timers can be activated (and again deactivated) prior to compilation through the CMake flag ``-Dwith-detailed-timers=ON``. They provide further insights into the time NEST spends in different phases of the -simulation cycle, but they can impact the runtime. Therefore, detailed timers are by default inactive. +simulation cycle so can be useful for :ref:`benchmarking performance `, but they can impact the runtime. +Therefore, detailed timers are by default inactive. -If detailed timers are active, the following time measurements are available as kernel attributes: +.. grid:: + :gutter: 2 -+-------------------------------------------+-----------------------------------+----------------------------------+ -| Name | Explanation | Part of | -+===========================================+===================================+==================================+ -| ``time_gather_target_data`` | Cumulative time for communicating | ``time_communicate_prepare`` | -| | connection information from | | -| | postsynaptic to presynaptic side | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_communicate_target_data`` | Cumulative time for core MPI | ``time_gather_target_data`` | -| | communication when gathering | | -| | target data | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_update`` | Time for neuron update | ``time_simulate`` | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_gather_spike_data`` | Time for complete spike exchange | ``time_simulate`` | -| | after update phase | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_collocate_spike_data`` | Time to collocate MPI send buffer | ``time_gather_spike_data`` | -| | from spike register | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_communicate_spike_data`` | Time for communicating spikes | ``time_gather_spike_data`` | -| | between compute nodes | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_deliver_spike_data`` | Time to deliver events from the | ``time_gather_spike_data`` | -| | MPI receive buffers to their | | -| | local synaptic targets (including | | -| | synaptic update, e.g. STDP | | -| | synapses) and to the spike ring | | -| | buffers of the corresponding | | -| | postsynaptic neurons | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_omp_synchronization_construction`` | Synchronization time of threads | ``time_construction_create``, | -| | during network construction. | ``time_construction_connect``, | -| | | ``time_communicate_prepare`` | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_omp_synchronization_simulation`` | Synchronization time of threads | ``time_simulate`` | -| | during simulation. | | -+-------------------------------------------+-----------------------------------+----------------------------------+ - -MPI synchronization timer -------------------------- -In order to measure synchronization time between multiple MPI processes, an additional timer can be activated on demand -via the ``-Dwith-mpi-sync-timer=ON`` CMake flag. This timer measures the time between the end of a process' update phase -(i.e., neuron state propagation) and start of collective communication of spikes between all MPI processes. This timer -adds an additional MPI barrier right before the start of communication, which might affect performance. - -+------------------------------+-----------------------------------------+ -| Name | Explanation | -+==============================+=========================================+ -| ``time_mpi_synchronization`` | Time spent waiting for other processes. | -+------------------------------+-----------------------------------------+ - -Multi-threaded timers ---------------------- -In previous NEST versions, only the master thread measured timers. Since NEST 3.9, timers which measure time spent exclusively in multi-threaded environments are recorded by each thread individually. - -The legacy timer behavior can be restored via the ``-Dwith-threaded-timers=OFF`` CMake flag. - -Wall-time vs. CPU-time -------------------------- -All timers in NEST measure the actual wall-time spent between starting and stopping the timer. In order to only measure -time spent on calculations, there is an additional variant for each of the timers above, suffixed with ``_cpu``. They -can be accessed in the exact same way. For example: -:: + .. grid-item-card:: **Simulation run (state propagation) diagram** + :columns: 5 + :class-item: sd-text-center + + .. graphviz:: /simulation_run.dot + :name: Simulation run (State propagation) + :caption: Simplified sequence of operations in the simulation run, organized in a top-down manner. + + Within the `simulate timer` section, parallel processes + (`OMP Parallel`) manage time-driven loops, handling tasks such as delivering spike data, updating timers, and + synchronizing threads using OMP barriers. The `OMP Master` section is responsible for gathering and communicating + spike data, involving steps like collocating data, managing MPI buffers, and advancing the simulation time. `OMP + barriers` are used to ensure thread synchronization at key points (for more details please see `Jordan et al. 2018 + `_). + The timers are indicated in dark blue. + + For source code see: `SimulationManager::update `_ + and `EventDeliveryManager::gather_spike_data `_ + + + + .. grid-item:: + :columns: 7 + + **Multi-threaded timers** + + In previous NEST versions, only the master thread measured timers (OMP_Master). + Since NEST 3.9, timers which measure time spent exclusively in multi-threaded environments (OMP_Parallel) + are recorded by each thread individually. + + The legacy timer behavior can be restored via the CMake flag: + + ``-Dwith-threaded-timers=OFF`` + + **Wall-time vs. CPU-time** + + All timers in NEST measure the actual wall-time spent between starting and stopping the timer. In order to only measure + time spent on calculations, there is an additional variant for each of the timers above, suffixed with ``_cpu``. They + can be accessed in the exact same way. For example: + :: + + nest.time_simulate_cpu + + **MPI synchronization timer** + + In order to measure synchronization time between multiple MPI processes, an additional timer can be activated on demand + via the CMake flag + + ``-Dwith-mpi-sync-timer=ON``. + + This timer measures the time between the end of a process' update phase + (i.e., neuron state propagation) and start of collective communication of spikes between all MPI processes. This timer + adds an additional MPI barrier right before the start of communication, which might affect performance. + + + .. seealso:: + + - For more information see the :ref:`run_simulations` guide + +Kernel attribrutes for detailed timers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If detailed timers are active, the following time measurements are available as kernel attributes: - nest.time_simulate_cpu +.. list-table:: + :widths: 30 40 30 + :header-rows: 1 + + * - Name + - Explanation + - Part of + * - ``time_gather_target_data`` + - Cumulative time for communicating connection information from postsynaptic to presynaptic side + - ``time_communicate_prepare`` + * - ``time_communicate_target_data`` + - Cumulative time for core MPI communication when gathering target data + - ``time_gather_target_data`` + * - ``time_update`` + - Time for neuron update + - ``time_simulate`` + * - ``time_gather_spike_data`` + - Time for complete spike exchange after update phase + - ``time_simulate`` + * - ``time_collocate_spike_data`` + - Time to collocate MPI send buffer from spike register + - ``time_gather_spike_data`` + * - ``time_communicate_spike_data`` + - Time for communicating spikes between compute nodes + - ``time_gather_spike_data`` + * - ``time_deliver_spike_data`` + - Time to deliver events from the MPI receive buffers to their local synaptic targets (including synaptic update, e.g. STDP synapses) and to the spike ring buffers of the corresponding postsynaptic neurons + - ``time_gather_spike_data`` + * - ``time_mpi_synchronization`` + - Time spent waiting for other processes + - ``time_simulate`` + * - ``time_omp_synchronization_construction`` + - Synchronization time of threads during network construction. + - ``time_construction_create``, ``time_construction_connect``, ``time_communicate_prepare`` + * - ``time_omp_synchronization_simulation`` + - Synchronization time of threads during simulation. + - ``time_simulate`` diff --git a/doc/htmldoc/nest_behavior/running_simulations.rst b/doc/htmldoc/nest_behavior/running_simulations.rst index 8d4ec785bd..9454dae125 100644 --- a/doc/htmldoc/nest_behavior/running_simulations.rst +++ b/doc/htmldoc/nest_behavior/running_simulations.rst @@ -327,3 +327,4 @@ threads or processes): ``{"print_time": False}`` to avoid the overhead of the print calls. In these cases, the real-time factor can be computed by measuring the wall-clock time manually and dividing by the set model time. + For details on timers in NEST see :ref:`built_in_timers`. From b93c254cc32572a53f9fb322dc87d5d6ebd53208 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 10:06:42 +0200 Subject: [PATCH 03/11] add req --- doc/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/requirements.txt b/doc/requirements.txt index e4eb2c4dc8..59efe5f83b 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -8,6 +8,7 @@ docutils>=0.19 example>=0.1.0 flask>=2.3.2 flask_cors>=3.0.10 +graphviz>=12.2.1 ipykernel>=6.22.0 ipython>=8.11.0 jupyter>=1.0.0 From 3e2b2733e175df4f28ca7e0912efe1be5d48fa1b Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 10:10:07 +0200 Subject: [PATCH 04/11] add req --- doc/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/requirements.txt b/doc/requirements.txt index 59efe5f83b..c9a00c79c1 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -8,7 +8,7 @@ docutils>=0.19 example>=0.1.0 flask>=2.3.2 flask_cors>=3.0.10 -graphviz>=12.2.1 +graphviz ipykernel>=6.22.0 ipython>=8.11.0 jupyter>=1.0.0 From c6852c701069eb75c7e0671f5d19d3b4cb636f2f Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 10:39:32 +0200 Subject: [PATCH 05/11] add dot config --- doc/htmldoc/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/htmldoc/conf.py b/doc/htmldoc/conf.py index d80562e4e3..016e252b37 100644 --- a/doc/htmldoc/conf.py +++ b/doc/htmldoc/conf.py @@ -104,6 +104,7 @@ # built documents. # graphviz_output_format = "svg" +graphviz_dot = "dot" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # From 38893437de09578a44b06ba88574a9eb14c99272 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 10:52:43 +0200 Subject: [PATCH 06/11] dot settings --- doc/htmldoc/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/htmldoc/conf.py b/doc/htmldoc/conf.py index 016e252b37..9bc6ac36be 100644 --- a/doc/htmldoc/conf.py +++ b/doc/htmldoc/conf.py @@ -22,6 +22,7 @@ import json import os +import shutil import subprocess import sys from pathlib import Path @@ -104,7 +105,7 @@ # built documents. # graphviz_output_format = "svg" -graphviz_dot = "dot" +graphviz_dot = shutil.which("dot") # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # From f4e3820b4556c1182906197dcd2bfbccb7241c1d Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 11:01:13 +0200 Subject: [PATCH 07/11] use yaml --- .readthedocs.yml | 1 + doc/htmldoc/conf.py | 5 +++-- doc/requirements.txt | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 744628c8e7..e1d8828eb2 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,6 +5,7 @@ build: tools: python: "3.10" apt_packages: + - graphviz - default-jre-headless jobs: pre_install: diff --git a/doc/htmldoc/conf.py b/doc/htmldoc/conf.py index 9bc6ac36be..99740d0934 100644 --- a/doc/htmldoc/conf.py +++ b/doc/htmldoc/conf.py @@ -22,7 +22,8 @@ import json import os -import shutil + +# import shutil import subprocess import sys from pathlib import Path @@ -105,7 +106,7 @@ # built documents. # graphviz_output_format = "svg" -graphviz_dot = shutil.which("dot") +graphviz_dot = "dot" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # diff --git a/doc/requirements.txt b/doc/requirements.txt index c9a00c79c1..e4eb2c4dc8 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -8,7 +8,6 @@ docutils>=0.19 example>=0.1.0 flask>=2.3.2 flask_cors>=3.0.10 -graphviz ipykernel>=6.22.0 ipython>=8.11.0 jupyter>=1.0.0 From 229642a189106395f0f4a725ea2694ecdf262e02 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 11:05:21 +0200 Subject: [PATCH 08/11] add python graphviz --- doc/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/requirements.txt b/doc/requirements.txt index e4eb2c4dc8..c9a00c79c1 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -8,6 +8,7 @@ docutils>=0.19 example>=0.1.0 flask>=2.3.2 flask_cors>=3.0.10 +graphviz ipykernel>=6.22.0 ipython>=8.11.0 jupyter>=1.0.0 From 3c1b35e2a843634b96bab6f0f23aa632aa335a6d Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 23 Apr 2025 14:03:02 +0200 Subject: [PATCH 09/11] minor fix --- doc/htmldoc/nest_behavior/built-in_timers.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/htmldoc/nest_behavior/built-in_timers.rst b/doc/htmldoc/nest_behavior/built-in_timers.rst index 01d819a737..bbd9cedab3 100644 --- a/doc/htmldoc/nest_behavior/built-in_timers.rst +++ b/doc/htmldoc/nest_behavior/built-in_timers.rst @@ -59,9 +59,12 @@ In the context of NEST performance monitoring, other useful kernel attributes ar Detailed timers --------------- -Detailed built-in timers can be activated (and again deactivated) prior to compilation through the CMake flag -``-Dwith-detailed-timers=ON``. They provide further insights into the time NEST spends in different phases of the -simulation cycle so can be useful for :ref:`benchmarking performance `, but they can impact the runtime. +Detailed built-in timers can be activated (and again deactivated) prior to compilation through the CMake flag: + +``-Dwith-detailed-timers=ON``. + +They provide further insights into the time NEST spends in different phases of the +simulation cycle so they can be useful for :ref:`benchmarking performance `, but they can impact the runtime. Therefore, detailed timers are by default inactive. .. grid:: From 5dda7ea1b939fd6377b2bf1258e6f0ac4a94c224 Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 30 Apr 2025 09:01:34 +0200 Subject: [PATCH 10/11] modify table --- doc/htmldoc/nest_behavior/built-in_timers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/htmldoc/nest_behavior/built-in_timers.rst b/doc/htmldoc/nest_behavior/built-in_timers.rst index bbd9cedab3..63bf81de63 100644 --- a/doc/htmldoc/nest_behavior/built-in_timers.rst +++ b/doc/htmldoc/nest_behavior/built-in_timers.rst @@ -164,7 +164,7 @@ If detailed timers are active, the following time measurements are available as - ``time_gather_spike_data`` * - ``time_mpi_synchronization`` - Time spent waiting for other processes - - ``time_simulate`` + - * - ``time_omp_synchronization_construction`` - Synchronization time of threads during network construction. - ``time_construction_create``, ``time_construction_connect``, ``time_communicate_prepare`` From cb3bebc2d6d4f69ee6546d420f4de986528bda5c Mon Sep 17 00:00:00 2001 From: Jessica Mitchell Date: Wed, 30 Apr 2025 09:14:29 +0200 Subject: [PATCH 11/11] copyright --- doc/htmldoc/_ext/make_diagram.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/doc/htmldoc/_ext/make_diagram.py b/doc/htmldoc/_ext/make_diagram.py index d8739179dc..7b961b5a2b 100644 --- a/doc/htmldoc/_ext/make_diagram.py +++ b/doc/htmldoc/_ext/make_diagram.py @@ -1,3 +1,23 @@ +# -*- coding: utf-8 -*- +# +# make_diagram.py +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . """ Create an archtictural DOT diagram from YAML input. """