{"id": "performance_gpu", "title": "Kernel throughput (NVIDIA GeForce RTX 3060 Ti)", "description": "Wall-clock cost of the three kernels everything else is built from \u2014 the weak residual, a Jacobian-vector product (forward mode, including its primal sweep) and a vector-Jacobian product (reverse mode) \u2014 on warped periodic meshes, after compilation. Throughput is degrees of freedom per second for one residual evaluation. Each kernel is called 2 times before it is timed; the three kernels of a configuration are then timed in alternation, one call of each per round, and each timing is the minimum over the rounds: at least 7, continued until 5 consecutive rounds lower no minimum by more than 2 % (at most 60 rounds, and at most 20 s of timed calls per configuration beyond the first 7 rounds). Other work on the machine can only lengthen a call, so the minimum is the statistic least affected by it, and alternation spreads a burst of load over all three kernels. The ratio of the median to the minimum of the rounds is tabulated as a measure of the disturbance. Timings are measurements on the device and under the host load recorded with them (second table), not portable performance guarantees. Algorithmic differentiation bounds the operation count of a Jacobian-vector product by about 2.5 and of a vector-Jacobian product by about 4 to 5 residual evaluations; the two checks are regression guards about three times above those counts, leaving room for memory traffic, not derived limits.", "passed": true, "checks": [{"name": "JVP cost / residual cost (worst case)", "value": 2.392376853003251, "expected": "< 8 (regression guard, about 3 x the operation-count bound of forward mode; measured while other work loaded the machine, see the notes)", "passed": true}, {"name": "VJP cost / residual cost (worst case)", "value": 3.087620773258681, "expected": "< 12 (regression guard, about 3 x the operation-count bound of reverse mode; measured while other work loaded the machine, see the notes)", "passed": true}], "charts": [{"id": "throughput", "type": "line", "title": "Residual throughput on NVIDIA GeForce RTX 3060 Ti", "xlabel": "degrees of freedom", "ylabel": "million DOF / s", "xscale": "log", "yscale": "log", "series": [{"name": "2-D Euler, p = 3", "x": [16384, 65536, 262144, 1048576, 2359296], "y": [8.19282342985151, 33.32114774339246, 79.91958756070747, 114.48852345774819, 208.9667644084954]}, {"name": "2-D Navier\u2013Stokes, p = 3", "x": [65536, 262144, 1048576], "y": [34.87814524342088, 73.24098912829987, 60.56696509088671]}, {"name": "3-D Euler, p = 2", "x": [69120, 233280, 1866240], "y": [20.673584413851163, 51.11650833728945, 42.03416208958831]}]}], "tables": [{"id": "timings", "title": "Kernel timings", "columns": ["case", "elements", "DOF", "residual [ms]", "JVP [ms]", "VJP [ms]", "residual throughput [M DOF/s]", "JVP / residual", "VJP / residual", "timed rounds", "median / minimum (worst kernel)"], "rows": [["2-D Euler, p = 3", "16x16", 16384, 1.9997989875264466, 1.922599010867998, 1.867598999524489, 8.19282342985151, 0.961396131741252, 0.9338933618695968, 8, 1.071153422209407], ["2-D Euler, p = 3", "32x32", 65536, 1.9667989981826395, 2.027798007475212, 3.0081980221439153, 33.32114774339246, 1.0310143585333005, 1.529489299579443, 13, 1.5525693298113807], ["2-D Euler, p = 3", "64x64", 262144, 3.280097007518634, 4.3276970100123435, 6.911595002748072, 79.91958756070747, 1.3193807988277182, 2.1071312790156274, 26, 2.029715453757289], ["2-D Euler, p = 3", "128x128", 1048576, 9.15878699743189, 21.9112700142432, 28.2788609911222, 114.48852345774819, 2.392376853003251, 3.087620773258681, 7, 1.4176639319159807], ["2-D Euler, p = 3", "192x192", 2359296, 11.290293012280017, 21.18018502369523, 34.81367600033991, 208.9667644084954, 1.8759641579415485, 3.083505092602505, 14, 2.0715524815547726], ["2-D Navier\u2013Stokes, p = 3", "32x32", 65536, 1.878998999018222, 1.8655979947652668, 2.744897996308282, 34.87814524342088, 0.9928680088387715, 1.4608299406984744, 15, 1.8687830958730596], ["2-D Navier\u2013Stokes, p = 3", "64x64", 262144, 3.5791979753412306, 5.220396997174248, 7.618794013978913, 73.24098912829987, 1.4585382069223343, 2.128631628221839, 14, 2.198493781597844], ["2-D Navier\u2013Stokes, p = 3", "128x128", 1048576, 17.3126719892025, 26.604456012137234, 45.68222499801777, 60.56696509088671, 1.5367042146197767, 2.638658262948012, 10, 1.4009396953152042], ["3-D Euler, p = 2", "8x8x8", 69120, 3.3433969947509468, 4.149697022512555, 4.383196996059269, 20.673584413851163, 1.2411619167653378, 1.3110010575892672, 8, 1.2416801713623995], ["3-D Euler, p = 2", "12x12x12", 233280, 4.563691996736452, 9.098783979425207, 10.146382002858445, 51.11650833728945, 1.993733141047172, 2.2232836944548926, 32, 1.827694550092364], ["3-D Euler, p = 2", "24x24x24", 1866240, 44.39817299135029, 60.46876299660653, 96.49924200493842, 42.03416208958831, 1.3619651197896618, 2.173495788300535, 7, 1.4652564662848333]]}, {"id": "host", "title": "Device and host load during the measurement", "columns": ["device", "platform", "CPUs", "CPU share of other processes", "load average at start (1, 5, 15 min)", "load average at end", "GPU utilization at start [%]", "busy"], "rows": [["NVIDIA GeForce RTX 3060 Ti", "gpu", 8, 0.0949, "6.72 / 9.29 / 11.39", "2.71 / 7.12 / 10.38", 17.0, "yes"]]}], "provenance": {"version": "0.4.0", "commit": "39979fcf902ad6116eb550b881b4278d4599c8e2", "dirty": false, "describe": "39979fcf90", "device": {"platform": "gpu", "device": "cuda:0", "device_kind": "NVIDIA GeForce RTX 3060 Ti", "jax": "0.11.2", "x64": true}, "timestamp": "2026-11-12T12:06:32-0500"}, "wall_time": 103.55, "notes": "The timings were taken on a busy machine (the GPU was 17 % utilized when the study started). The reported timings are minima over interleaved rounds, which other work can raise but not lower: they are upper bounds of the undisturbed kernel costs. The median of the rounds was up to 2.20 times the minimum, which shows the size of the disturbance. The ratios of the minima, which the two checks bound from above, are less affected than the timings themselves but may still be; the checks are marked accordingly, and the throughput figures should be read as lower bounds. Timings are minima over 7 to 32 interleaved rounds.", "device": {"platform": "gpu", "device": "cuda:0", "device_kind": "NVIDIA GeForce RTX 3060 Ti", "jax": "0.11.2", "x64": true}, "host_load": {"cpus": 8, "elapsed": 102.83, "foreign_cpu_fraction": 0.0949, "loadavg_start": [6.72, 9.29, 11.39], "loadavg_end": [2.71, 7.12, 10.38], "gpu_utilization_start": 17.0, "busy": true, "summary": "The timings were taken on a busy machine (the GPU was 17 % utilized when the study started)."}, "timing": {"warmup_calls": 2, "min_rounds": 7, "max_rounds": 60, "budget_seconds": 20.0, "settle_rounds": 5, "settle_gain": 0.02, "statistic": "minimum over interleaved rounds", "worst_median_over_min": 2.198493781597844, "unsettled": [], "qualified": true}, "level": "quick"}