| 431 | } |
| 432 | |
| 433 | MeasurementSummary measure_warm( |
| 434 | const engine::runtime::ModelRegistry & registry, |
| 435 | const engine::runtime::ModelLoadRequest & load_request, |
| 436 | const engine::runtime::TaskSpec & task_spec, |
| 437 | const engine::runtime::SessionOptions & session_options, |
| 438 | const engine::runtime::TaskRequest & warmup_request, |
| 439 | const engine::runtime::TaskRequest & request) { |
| 440 | auto model = registry.load(load_request); |
| 441 | auto session = model->create_task_session(task_spec, session_options); |
| 442 | (void) run_once(*session, task_spec, warmup_request); |
| 443 | session->prepare(engine::runtime::build_preparation_request(request)); |
| 444 | |
| 445 | MeasurementSummary summary; |
| 446 | for (int rep = 0; rep < 3; ++rep) { |
| 447 | auto run = run_prepared_once(*session, task_spec, request); |
| 448 | summary.wall_ms.push_back(run.wall_ms); |
| 449 | summary.duration_sec = result_duration_sec(request, run.result); |
| 450 | } |
| 451 | summary.average_wall_ms = |
| 452 | std::accumulate(summary.wall_ms.begin(), summary.wall_ms.end(), 0.0) / |
| 453 | static_cast<double>(summary.wall_ms.size()); |
| 454 | if (summary.duration_sec > 0.0) { |
| 455 | summary.rtf = (summary.average_wall_ms / 1000.0) / summary.duration_sec; |
| 456 | } |
| 457 | return summary; |
| 458 | } |
| 459 | |
| 460 | std::string measurement_json(const MeasurementSummary & measurement) { |
| 461 | std::ostringstream out; |
no test coverage detected