{
  "kernel": "self-contained box3d-style solver (semi-implicit Euler + graph-colored PGS contacts)",
  "note": "CPU ref and CUDA kernel run IDENTICAL math (physics_kernels.h). CPU ref skipped at N=1e6 (too slow); GPU still measured.",
  "steps": 300,
  "runs": [
    {
      "scene": "box_stack",
      "N": 500,
      "bodies": 500,
      "contacts": 950,
      "colors": 3,
      "cpu_ms_per_step": 0.35565,
      "gpu_ms_per_step": 0.2934,
      "speedup": 1.2121676891615543,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "box_stack",
      "N": 1000,
      "bodies": 1000,
      "contacts": 1900,
      "colors": 3,
      "cpu_ms_per_step": 0.70515,
      "gpu_ms_per_step": 0.29947,
      "speedup": 2.354659899155174,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "box_stack",
      "N": 10000,
      "bodies": 10000,
      "contacts": 19000,
      "colors": 3,
      "cpu_ms_per_step": 7.12871,
      "gpu_ms_per_step": 0.29739,
      "speedup": 23.970913615118196,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "box_stack",
      "N": 100000,
      "bodies": 100000,
      "contacts": 190000,
      "colors": 3,
      "cpu_ms_per_step": 78.62398,
      "gpu_ms_per_step": 0.41979,
      "speedup": 187.29359918054266,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "box_stack",
      "N": 1000000,
      "bodies": 1000000,
      "contacts": 1900000,
      "colors": 3,
      "cpu_ms_per_step": null,
      "gpu_ms_per_step": 2.18721,
      "speedup": null,
      "nan": 0,
      "max_pos_err": null,
      "validated": null
    },
    {
      "scene": "body_pile",
      "N": 500,
      "bodies": 500,
      "contacts": 539,
      "colors": 3,
      "cpu_ms_per_step": 0.06011,
      "gpu_ms_per_step": 0.29759,
      "speedup": 0.2019893141570617,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "body_pile",
      "N": 1000,
      "bodies": 1000,
      "contacts": 1151,
      "colors": 5,
      "cpu_ms_per_step": 0.21193,
      "gpu_ms_per_step": 0.48304,
      "speedup": 0.4387421331566744,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "body_pile",
      "N": 10000,
      "bodies": 10000,
      "contacts": 17097,
      "colors": 9,
      "cpu_ms_per_step": 6.50726,
      "gpu_ms_per_step": 0.82019,
      "speedup": 7.933844596983626,
      "nan": 0,
      "max_pos_err": 0.0,
      "validated": true
    },
    {
      "scene": "body_pile",
      "N": 100000,
      "bodies": 100000,
      "contacts": 425928,
      "colors": 20,
      "cpu_ms_per_step": 278.22928,
      "gpu_ms_per_step": 1.9982,
      "speedup": 139.23995596036434,
      "nan": 0,
      "max_pos_err": 0.113125,
      "validated": false
    },
    {
      "scene": "body_pile",
      "N": 1000000,
      "bodies": 1000000,
      "contacts": 9000016,
      "colors": 32,
      "cpu_ms_per_step": null,
      "gpu_ms_per_step": 16.00246,
      "speedup": null,
      "nan": 0,
      "max_pos_err": null,
      "validated": null
    }
  ]
}