Generated banner for Warp Eval
Generated logo for Warp Eval

Warp Eval

NVIDIAOfficialCreated by NVIDIA Corporation

  • Skill
  • Workflow
  • Software development
  • Apache-2.0
  • Medium risk
  • Has scripts

From the author

Evaluate whether an existing hot path is a credible NVIDIA Warp candidate. Use for irregular or spatial queries, particle or geometry simulation, branch-heavy loops, many small launches, host fallbacks, or large intermediates. CPU-only code and absent GPU dependencies are normal unless NVIDIA is prohibited. Exclude required cross-vendor or CPU-only deployment, vendor-lowered dense or NN layers, general Warp API questions, and already-selected Warp kernels. Contribution policy alone is not exclusion.
— the description by NVIDIA Corporation

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The warp-eval skill provides a structured, evidence-based methodology to determine if specific hot paths in an existing codebase are viable candidates for NVIDIA Warp. It emphasizes objective reporting over recommendations, requiring users to define clear performance metrics and semantic contracts before any prototyping occurs. The process includes static screening, rigorous baseline comparisons, and authorized benchmarking, ensuring that Warp is only considered after in-project alternatives have been exhausted. The skill enforces strict gates to abort evaluations that do not meet technical or policy requirements, ensuring that only credible candidates proceed to measurement.

What it does

  • Screens code bottlenecks against specific technical gates to determine Warp suitability.
  • Requires the establishment of a semantic contract and performance baseline before prototyping.
  • Enforces a ladder of in-project optimizations to be exhausted before introducing Warp.
  • Produces a standardized evaluation report containing measurements, evidence, and caveats.
  • Ensures all performance claims are backed by synchronized, end-to-end measurements.
  • Provides scripts for synchronized timing, memory profiling, and report validation.

When to use it

  • When investigating performance bottlenecks involving irregular queries, simulations, or branch-heavy loops.
  • When you need to objectively assess if Warp provides a measurable benefit over existing in-project baselines.
  • When you require a reproducible, audit-ready report on potential GPU acceleration candidates.
  • When you need to determine if a performance issue is material enough to warrant a new dependency.

Advantages

  • Prevents premature optimization by requiring algorithmic improvements first.
  • Provides a clear, objective framework to stop evaluations that are not technically viable.
  • Ensures performance measurements include realistic overheads like JIT, transfers, and synchronization.
  • Maintains production code integrity by working in isolated, independent patches.
  • Standardizes the reporting of facts, hypotheses, and unknowns.

Usage examples

“Evaluate if the particle simulation loop in my project is a good candidate for Warp.”
The agent will identify the candidate seam, derive the contract, check initial gates, and provide a resource preview before asking for authorization to proceed with profiling.
“I have a performance bottleneck in my geometry processing code; can you run a warp-eval?”
The agent will initiate the screening process, request the target repository, and begin identifying candidate patterns to determine if a formal evaluation is warranted.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/nvidia/warp-eval/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip warp-eval.zip -d .agents/skills

Documentation by NVIDIA Corporation

Warp evaluation

Purpose

Collect reproducible evidence about how a narrow seam in an existing codebase would behave in NVIDIA Warp. Report facts; the user decides.

Name Warp as the option under evaluation in the first line, state that no adoption recommendation will follow, and do not treat the triggering performance request as authorization to experiment.

Measured evaluations produce warp-evaluation-report/: the report, one independently applicable diff per solution, the drivers, and raw results. Never modify production code. Exits before measured work create no directory.

Hard rules

These override any local reasoning.

  1. Default objectives are latency, throughput, and peak or retained memory. Count maintainability, ergonomics, packaging, extensibility, autodiff or new functionality only when the user names it; otherwise report them as constraints or costs, not benefits.

  2. Correctness is a gate. If the incumbent is buggy or its contract unclear, abort that comparison until an independent oracle or clarified contract exists. Report the defect without prescribing a response.

  3. Never predict savings from source shape or another workload. Materialized memory comes from profiler or allocator evidence, not source a compiler may fuse.

  4. "It can be written in Warp" is a hypothesis, never a proven opportunity.

  5. Gates are exact, never adjacent or analogous. Fire a gate only when every condition in its definition is established. Gate D requires a maintained implementation confirmed to execute with CUDA on an NVIDIA GPU; a fast native CPU library is a baseline, not Gate D.

  6. Label every claim as observed fact, measurement, hypothesis or unknown.

  7. Time the user-visible stage, not the kernel. Include Warp's cold import/init/JIT in the real process regime, transfers, launches, Python launch loops, structure build/refit, allocation, conversion, validation, compaction and synchronization. Report each cost and the end-to-end difference.

  8. No measured work without explicit authorization. After stage 1, stop and ask before profiling, environment changes, prototyping, benchmarking or GPU use.

  9. Authorized measured work includes Warp. If profiling exposes no gate, continue through the strongest in-project baseline, minimum Warp prototype and end-to-end comparison. If Warp is out of scope, stop before profiling.

  10. Never infer environment intent. NVIDIA deployment and ownership of an optional compiled dependency are product decisions. Abort only on a stated constraint; otherwise ask once and stop (AWAITING INTENT).

  11. Warp measurements are CUDA-only and synchronized. Resolve an explicit NVIDIA CUDA device; discard CPU resolution and dispatch-only timing.

  12. Never recommend or rank adoption options. Report facts, measurements, hypotheses and unknowns per seam and regime.

  13. Stop at the report. No rollout or production edits.

Requirements

Static screening requires the target repository and its stated product constraints. Measured work additionally requires explicit authorization, an NVIDIA CUDA GPU, target-project dependencies and a representative workload.

Limitations

  • Warp CPU kernels are serial and outside this skill's evaluation scope. "Run it on the CPU instead" is not a performance fallback.

  • Mesh and geometry queries compute in float32/int32 even behind a float64 public API. Absolute error grows with coordinate magnitude.

  • Warp does not follow semver. Feature releases can break APIs, only the newest feature line is maintained, deprecations run roughly four monthly releases.

  • latest docs track development, not the shipped release. Pin to the target project's own Warp version; if it has none, use the current stable and say which.

  • Kernel-only builtins are not resolvable from Python — hasattr(wp, "mesh_query_point") is False on a release that has it. Probe the stub file or that version's docs before concluding a builtin is absent.

  • enable_backward=False (kernel, module or global) removes adjoint codegen. If nothing differentiates through the seam, set it before measuring compile cost.

Output Format

StateReached whenReport directory
ABORTAny gate establishes that the evaluated seam cannot satisfy the stated scopeNo if nothing was measured; otherwise preserve the evidence already collected
AWAITING INTENTThe environment gates turn on a fact only the user hasNo — one question, both branches concrete
AWAITING AUTHORIZATIONA candidate pattern survives stage 1No — early findings plus scope/resource preview
INCOMPLETEAuthorized work cannot obtain representative evidence required for the scoped evaluationYes — preserve collected evidence and name the one missing artifact
Report deliveredAuthorized work produced measurements, or stopped after the report directory existedYes — facts per seam and regime, with missing evidence explicit

Use this exact shape for an early exit: ABORT — Gate <letter>: <cited fact>; <why the scoped Warp evaluation cannot proceed>. Do not name a preferred alternative. Reporting rules: references/evidence-and-reporting.md. A delivered directory follows the template's fixed order: schema and provenance, authorization and evaluation state, stage census, one B<n> evidence section per seam/regime, caveats, then environment/reproduction. solutions/, benchmarks/ and results/ contain every linked artifact.

Examples

Gate exit: ABORT — Gate A: deployment.md requires one implementation with AMD, Apple and NVIDIA parity; a Warp-specific path cannot satisfy this scope.

Surviving candidate: Name the seam and pattern, label inferred facts as assumptions, state that no gate has fired, preview the profile/baseline/Warp prototype/benchmark scope and its cost, then ask the separate intent and authorization questions from references/authorization-checkpoint.md.

Inputs

Required: the target repository and a performance, memory or scale problem with a candidate seam. Optional: explicit deployment/packaging constraints, existing profiles or logs, representative datasets and acceptance criteria. Prompt constraints take precedence over repository policy/configuration, then existing logs. User corrections override inference. Never substitute an assumption for a stated fact or measurement.

Available scripts

ScriptPurposeArguments
scripts/driver-template.pyCopy once per bottleneck; define workloads and variantsEdit placeholders, then run the copied driver
scripts/measure.pyImport from drivers for synchronized timing, memory and isolated casesPython API; do not execute directly
scripts/validate_report_schema.pyValidate the delivered report and evidence links<report-directory>

Use run_script("scripts/validate_report_schema.py", args=["warp-evaluation-report"]) when supported; otherwise invoke the script with Python and the report directory.

Troubleshooting

  • No representative workload: mark the scope INCOMPLETE and name the missing artifact; do not invent data or fire Gate F.

  • Warp resolves to CPU or no CUDA device: discard the run and stop before correctness or timing claims.

  • Report validation fails: fix the report or referenced artifact; never waive the schema error.

Instructions

Every stage before the last can end the evaluation. Stop as soon as a gate fires; do not gather evidence that cannot change the scoped facts.

1. Read the code, derive the contract, check the gates
  • Identify a candidate and its metric with references/target-patterns.md.

  • Derive devices/residency, dtypes/shapes, sizes, frequency, process lifetime, gradients and packaging from the repository. Infer before asking.

  • State the inferred contract in one line and invite correction. Unknown hardware, counts, sizes and tolerances are assumptions, never measurements. Every inference remains open to correction and cannot satisfy a gate that requires a stated fact or measurement.

  • Check Gates A–E before profiling. Check Gate F now only if representative evidence already exists; otherwise carry it into stage 2. Every gate uses only the exact boundaries in references/rejection-gates.md.

GateFires when
AProduction is stated CPU-only or to need non-NVIDIA portability, with no acceptable optional CUDA path
BData must cross the host/device boundary per small or infrequent call and the boundary cannot be widened
CThe region is dense tensor algebra already mapped to a tuned framework or vendor library
DA mature CUDA implementation already meets the contract, and no non-performance objective was requested
EA stated policy blocks Warp's dependency, compilation, cache or fallback obligations
FRepresentative evidence proves the region too small a share of its requested metric for any backend to move it
  • Gate F can fire in stage 1 only from representative evidence that already exists — a supplied profile, structural bound, or arithmetic on figures the user quoted. If that evidence does not exist, Gate F remains open until stage 2 profiling; inferred values never fire it.

  • Gates A and E need a stated constraint. A CPU implementation, another accelerator, no Warp dependency, or a small dependency list proves nothing.

  • When A/E are unresolved and a pattern survives, ask whether an optional NVIDIA path is acceptable: named extra, soft import, existing fallback, default install unchanged. Every affirmative answer must say explicitly that Warp will be prototyped and benchmarked; conditions constrain only that Warp scope. A negative or undecided answer means ABORT.

  • Do not ask when another gate fired, the repository answers, or no pattern matched. No pattern means no profiling.

  • If a candidate survives, combine any intent question with the authorization checkpoint — early findings, exact scope, stages, resource cost — then stop. Stage 2 requires both settled intent and explicit authorization.

2. Profile the real application

Requires explicit authorization and a settled intent question.

  • Profile with the project's own profiler and representative entry points.

  • Measure synchronized end-to-end stage time and peak memory before choosing a backend. Report which entry points were profiled and which a gate screened.

  • Prioritize further measurement by observed cost, not source appearance.

  • Name each measurement by the public method and variant actually invoked. A fallback is an execution regime of that public seam, not a different operation, and a cheaper sibling method cannot screen out the named method.

  • Confirm the timed branch ran on the intended device. Unchanged cost and near-zero device allocation between host and device inputs exposes a host fallback.

  • Measure the stage's free-stage ceiling and stubbed floor through the public boundary. Do not subtract per-op timings.

  • If the measured ceiling proves the candidate cannot move its own metric, ABORT the affected scope under Gate F, preserve the evidence already collected, and stop. The existing authorization already covered this materiality check; do not ask for authorization again.

  • If representative coverage is unavailable — no representative dataset, runnable entry point or production distribution — record the single missing artifact, mark the affected scope INCOMPLETE, and stop. This is missing evidence, not Gate F and not ABORT. An invented workload cannot prove materiality.

Protocol: references/benchmark-protocol.md.

3. Form falsifiable hypotheses

Record per candidate: source, bottleneck evidence, objective, narrow seam, mechanism Warp could change, strongest incumbent, risks, acceptance threshold, cheapest falsifying experiment. Screen against references/target-patterns.md; if none survives, write the report and stop.

4. Write the contract before the prototype

Define values, dtypes, shapes, devices, errors, mutation, ordering, ties, capacity/overflow, topology/degeneracy, tolerances, required gradients, streams, ownership, aliasing, invalidation, concurrency, capture, teardown and fallback.

  • Fix tolerances before seeing Warp output. Never weaken a contract after a mismatch.

  • ABORT before prototyping if the proposed seam cannot satisfy a required contract.

  • Pre-register, before timing: workload provenance, the state variable and production range controlling cost, tuning knobs, incumbent run-to-run spread, and the oracle applied to every implementation.

Hazards and adversarial checks: references/semantic-contract.md.

5. Improve the baseline first

Algorithm before backend: (1) a better or output-sensitive algorithm; (2) chunking, tiling, sparse output, layout, rematerialization; (3) the incumbent framework's compiler and native primitives; (4) what the project already depends on — its own accelerator backend, a parallel idiom it ships but leaves off, or a capability an existing dependency exposes and nobody wired up; (5) only then narrow Warp.

  • Compare only in-scope options: the improved incumbent, capabilities reachable through current dependencies, and Warp. Do not add unrelated libraries.

  • Search declared dependencies for dormant backends, flags and bindings before calling a route absent.

  • Keep the improved incumbent as the oracle. A result against an untuned, incorrect or asymptotically inferior baseline does not establish a backend comparison.

Close every in-project route before prototyping Warp:

StateWhat it takes to claim it
measuredtimed through the same boundary as the baseline
absenta cited declaration, symbol table or missing flag proves it is unavailable
waivedyou asked the user and they chose to skip it; record their words

A capability present but unbound is reachable, not absent. If exposing it costs no more than the planned Warp seam, measure it first. Ladder details: references/baselines.md. Waived routes do not block stage 6; every route not explicitly waived must be measured or evidenced absent before the Warp prototype begins.

6. Prototype the minimum unit
  • Work in a separate copy, production unchanged, integration seam off by default. Prototype only enough to test the hypothesis.

  • Select an explicit CUDA device for every Warp prototype and verify that Warp resolves it as CUDA before correctness or performance work. Never exercise or report Warp's CPU backend.

  • Size the unit by shared data and structure lifetime, not function boundaries: build/refit/query costs that amortize together are one unit.

  • Name variants before timing. Preserve each solution as an independent patch against the pinned baseline, and prove it applies cleanly and reproduces the measured result.

  • Surface unsupported cases and overflow before timing.

  • Run the adversarial contract checks, audit correctness at production scale, and deliberately break a branch to prove the tests fail. Any failed required check returns ABORT for the affected scope.

  • Before treating a disappointing compute-bound or reuse-heavy result as representative, consider the stronger formulations in references/target-patterns.md. One naive kernel does not bound Warp's potential.

7. Benchmark the whole boundary
  • Copy scripts/driver-template.py once per bottleneck and measure through scripts/measure.py. Do not hand-roll timing or memory.

  • Warp launches are asynchronous. The measurement helper must synchronize the selected device immediately before starting and after enqueueing every timed region, before stopping its wall timer.

  • Include every rule-7 cost, the public call, the immediate downstream stage, realistic sizes, and cold/warm process regimes.

  • Transcribe every report cell from emitted JSON; absent records read not measured.

  • Report null_test, and one-time costs both separately and amortized. Serialize GPU measurements under an exclusive device lock. Below 1.5× is no measured difference.

  • ABORT for a seam and regime whose predeclared end-to-end performance or memory requirement fails, after preserving the measurements.

Full protocol: references/benchmark-protocol.md.

8. Summarize the evidence
  • Per seam and execution regime, report semantic results, strongest-baseline measurements, workload provenance, time, memory, lifecycle, portability and ownership facts.

  • Use pass, fail, not measured, not available, no representative data, unknown or n/a only where a stated criterion makes that status objective. Missing evidence remains missing.

  • Mark the report complete only when every evaluated seam and regime includes an end-to-end Warp measurement. Use aborted — <gate and scope> when a gate fired, or incomplete — <missing evidence and scope> when representative evidence was unavailable. Preserve everything collected. Never deliver an incumbent-only report as a completed warp-eval.

  • Give every stage worth ≥10 % of the measured total a census row with a status and a one-line reason, including the screened-out stages.

  • Check each gate against the metric that candidate's pattern exhausts, not the study's headline objective.

9. Hand back
  • Use assets/warp-evaluation-report-template.md unchanged in schema. Record authorization and scope.

  • One table per bottleneck: baseline, current-dependency solutions, then Warp; absolute time and peak memory, ratios, contract status, evidence gaps.

  • Include prose only where it explains the measurements or their bounds. Working artifacts belong in results/.

uv run python scripts/validate_report_schema.py <report-directory>
  • Run the validator once the first measurement establishes a census/table, and again before delivery. Fix every error.

  • Verify builds and imports from artifacts, not exit status. Ship the exact drivers run. Then stop.

Files

references/benchmark-protocol.md

Benchmark protocol

Use only after the user authorizes the measured evaluation. Follow this and document every deviation rather than presenting a weaker protocol as if it were this one.

Measure through ../scripts/measure.py, called from one driver script per bottleneck, rather than hand-rolling timing and memory code: it implements the rules below, and two evaluations that both "followed the protocol" by hand are not comparable. Transcribe every table cell from the JSON it emits; a cell with no record reads "not measured".

Exclusive execution

Hold one exclusive device lock for a complete measurement sweep, not one sample at a time:

export GPU_LOCK="${GPU_LOCK:-/tmp/warp-evaluation.gpu.lock}"
flock -x "$GPU_LOCK" -c '<the whole sweep>'
  • After acquiring the lock, record GPU model, driver, free and used memory, utilization and a timestamp.

  • Do not acquire the lock and then wait for 0 % utilization. Compositors, remote-display services and sampling noise can keep it nonzero indefinitely, and waiting inside the lock blocks every other queued task. Check for idle before acquiring, with a finite timeout, then continue or skip. Proceed unless the compute-process list shows an unrelated workload or free memory is insufficient.

  • Contention distorts comparisons asymmetrically: a busy device penalizes long kernels far more than short ones, which flatters whichever side is slower. Re-measuring on an idle device routinely moves baseline medians by double-digit percentages and reduces quoted speedups. If you cannot get a quiet device, say so and mark the numbers.

Warp device requirement

Run Warp correctness tests, profiles and benchmarks only on an explicitly selected NVIDIA CUDA device. Resolve the selected device through Warp, verify that it is CUDA and record its alias and architecture in the raw artifact. Discard any Warp artifact that resolves to cpu. CPU remains valid for the incumbent and non-Warp candidates; only Warp's CPU backend is excluded.

Sampling

You are gauging a ballpark, not producing a benchmark. Report an order of magnitude and direction, not a precise performance claim. Precision benchmarking needs a quiet machine, other tenants killed, raised priority, pinned affinity, locked clocks and disabled turbo; without those, more samples buy a tighter estimate of a contaminated number.

measure.time_it implements this: one discarded warm-up, then one timed run. Because Warp launches are asynchronous, it synchronizes the selected device immediately before starting and after enqueueing the timed work, before stopping the wall timer. measure.sig2 rounds to two significant figures — a single sample does not support "1.87×"; it supports "about 1.9×", often only "about 2×". measure.env_fingerprint records the CPU thread count. What it cannot do for you:

  • Do not raise samples to tighten a reported figure. The default is a protocol choice, not a placeholder. Keep the discarded warm-up; skipping it can move a baseline enough to invert a comparison.

  • Reach for measure.device_time in addition to wall time where wrapper or launch behavior matters; never compare device-event time against synchronized end-to-end time.

  • For JAX, disable allocator preallocation (XLA_PYTHON_CLIENT_PREALLOCATE=false) so memory figures mean something.

Comparison resolution

measure.comparison reports the ratio and whether it clears the protocol's resolution: at least 1.5× is a directional difference and remains approximate; below 1.5× is no measured difference at this precision. Neither label is an adoption judgment.

If the user's own criterion turns on distinguishing 1.2× from parity, say the evaluation cannot resolve it in a shared environment and state the controlled measurement needed.

Spend spare budget on coverage, not repetition — another size, regime or the cold path is worth far more than a second sample. One exception: if two variants land close enough that the order matters and the decision depends on it, run those two once more with the order reversed.

Prove the harness runs the work

A harness that silently fails to run reports a very fast time, which reads like a speedup: a kernel never launched, a result served from cache, a missing synchronization, a test binary that exits 0 without executing.

Before trusting a bottleneck's timings, scale the work and confirm the measurement scales with it (measure.null_test): 4× the work should cost about 4×. Report the observed ratio next to the timings. A measurement that does not respond to the size of the work is not measuring the work.

Required timing phases

Measure and report separately, as applicable:

  1. process and framework import/initialization;

  2. fresh-cache compilation;

  3. populated-cache module load in a fresh process;

  4. first launch and first acceleration-structure construction;

  5. warm build, refit, and rebuild;

  6. warm direct kernel/query time;

  7. wrapper validation, allocation, conversion, interop, transfer, compaction and synchronization;

  8. graph capture and replay, including recapture count;

  9. the end-to-end public call;

  10. the immediate downstream stage or a full application iteration;

  11. measured totals for 1, 10 and 100 calls — measured loops where possible, not a single median multiplied.

For one-shot tools, process startup and cold compile are part of the measured boundary. For persistent services, still report cold recovery and cache-miss behavior.

total(N) =
    process/import initialization
  + cold compile or cached module load
  + data conversion and validation
  + data-structure build or refit
  + graph capture or recapture
  + N * (interop + transfer + launch + kernel + sync + downstream work)

Report the crossover from measured totals as a bracket. Never derive production policy from kernel-only ratios.

The ceiling

The ceiling is what the whole user-visible stage would cost if the candidate stage became free, and the ratio that implies. Quote every achieved speedup as a fraction of it: 87 % of the ceiling is finished work, 20 % says the wrapper is eating the saving.

  • Measure the floor, never subtract it. Run the pipeline with the stage stubbed and time what is left, rather than subtracting isolated per-op timings from a total. The two disagree, and subtraction can produce a "ceiling" the real result then exceeds.

  • The ceiling bounds backend substitution only. A change of representation or data structure removes cost elsewhere too, so it can legitimately beat the ceiling. If a result exceeds it, say which of the two is happening.

Memory accounting

Measure in fresh processes when allocators retain storage, and name the domain for every number: live/allocated bytes; allocator-reserved or pool bytes; peak temporary storage; process-level GPU memory; acceleration-structure storage; retained outputs and autograd state; graph-private pools and graph-cache growth; framework preallocation policy; host RSS where host paths or copies matter.

measure.host_memory and measure.device_memory take the headline figures from the two domains that see both sides — process RSS via /proc VmHWM, and NVML per-process GPU memory — and measure.run_isolated gives each case its own process. What that mechanism cannot decide for you:

  • A comparison needs a domain that sees both sides. When the candidate's cost lands outside the incumbent's allocator — a device context, a native library, a separate process — a per-language counter structurally understates it. Python's tracemalloc cannot see a CUDA context at all, and a framework pool counter can report a bare CUDA context of hundreds of MiB as 0. Framework counters supplement — only they split live from pool-reserved — but never replace, and labelling the domain does not fix a blind instrument.

  • Never substitute ru_maxrss for VmHWM, or one process for two. ru_maxrss is inherited across a spawn, so a child reports the parent's peak before it allocates anything; peak counters are monotonic within a process, so two configurations timed in one process are one measurement.

  • Report a missing counter as missing. Per-process NVML is unavailable inside MIG and under some container and driver permissions; a counter absent from your version is reported absent, with the conservative process-level figure beside it. Do not invent it.

  • NVML has 1 MiB granularity — a zero delta means "below snapshot resolution", not "zero storage". Neither counter polls, so a device-side transient shorter than your sampling can still be missed; if you poll for one, state the achieved interval, because a sampled figure is not a high-water mark.

Results do not transfer across GPU architectures

A kernel-level optimization can differ by more than 2× between NVIDIA generations and occasionally invert — a control-flow change that lets one architecture unroll a loop can raise register pressure on another. Anything depending on unrolling, register budget, occupancy, shared memory or tile shape is architecture-sensitive by default. State the GPU the numbers came from and do not project them onto another; if production spans several, measure each or scope the measurements.

Thread budget

A CPU baseline measured below the deployment's thread count has not been compared. State the thread count of every timed configuration and the core counts of both the measuring host and the deployment target — the difference bounds the comparison. Three failure modes, all observed:

  • The incumbent exposes parallelism nothing switches on. A shipped n_threads=1 default on a many-core host is an under-parallelized baseline, not a slow algorithm.

  • The measuring host is shared, so you cap threads to be a good tenant — biasing every CPU-versus-device ratio toward the device.

  • The measuring host has more cores than the deployment target, biasing the other way.

If you cannot run the baseline at the deployment thread count, measure its scaling over the counts you can reach, report the achieved count next to every ratio, and mark the strongest-baseline comparison not measured at the deployment thread count. Do not extrapolate the scaling curve into a predicted ratio.

Sweeps, crossovers and scale

Relative performance is a function of scale, not a property of the implementations. Fixed per-call costs — context creation, transfer, structure build, launch — dominate small inputs, while asymptotics and memory traffic decide large ones, so direction routinely inverts somewhere in between. A comparison at one size establishes only that size.

  • Sweep across and beyond the expected crossover, at decades of scale — 10³, 10⁶ — for the incumbent, each in-project alternative and each candidate alike: a route dismissed at one size has been dismissed at one size. Sweep problem size, density, clustering, batch count, capacity, reuse level, cold/warm regime, build vs refit vs rebuild and CPU thread count.

  • Sweep the operation's own variants — which reduction, dtype, mode, interpolation or combination rule the public API exposes. Variants routinely differ several-fold and can run through entirely different machinery (a reduction needing a per-pixel lock, a mode allocating output proportional to category count, an option that silently falls back), so measuring the cheapest one understates the surface you would have to reproduce.

  • Name every axis the size runs along, and sweep each of them. Relational and geometric operations have at least two — the query set and the reference structure it runs against (points versus triangles in a mesh, probes versus cells, rows versus index size). Sweeping the convenient axis while holding the other fixed measures one axis and assumes the other. Include any axis the candidate's numerics turn on, such as coordinate magnitude for a float32 seam behind a float64 API.

  • Report crossovers and inversions as measured brackets ("between 100 and 250 queries"), not interpolated points or endpoints alone. Where a candidate is faster throughout, state the measured range; "faster" without a size is not a result. Say where the production distribution sits relative to the crossover, and if the candidate becomes faster only above the typical production range, state both ranges.

  • Watch the metrics separately — they need not invert together. A candidate can be faster at every size while using more memory below some size, because a fixed device context is a floor the incumbent never pays.

If the project ships no asset at a size you need, generate one and label it generated. Prefer its own assets where they exist and state the rule by which you selected them, so a second run of this evaluation picks the same ones.

Representative and adversarial data

Synthetic sweeps isolate variables; they do not establish production behavior. Add representative real data before comparing production behavior. If real data was unavailable, say so and name the procedural substitute.

  • Real inputs are not a representative workload. For a relational operation — nearest neighbor, closest point, overlap, matching, collision — cost depends on the joint distribution of the inputs, not on either separately. Two real production assets paired with each other can still be a workload the product never sees: pair a point set with an unrelated shape instead of the one it converges toward, and every query falls through to the exact fallback, which can invert the result. So capture the tensors the application actually passes, from a live run — instrument the loop, dump the arguments at several points, benchmark those. Assembling plausible inputs is a last resort that must be declared in the report.

  • Sweep the state variable, not just the size. Relational costs usually turn on a ratio rather than N — query-to-reference distance over reference spacing, occupancy, clustering, overlap fraction, convergence error — and in an optimization or simulation loop that ratio moves by orders of magnitude as the run proceeds, so one snapshot measures a single point on a curve. Identify the ratio, measure where it starts and ends in production, and report across that range. If the candidate needs a parameter derived from that ratio, an implementation that adapts it from data the caller already has is part of the candidate — hand-picking the best value per measurement point is tuning on the test set.

  • Check every synthetic workload against the operation's own cost model. Write down what the work should scale with — triangles times the area each covers, non-transparent pixels, points per occupied cell, segments times pixels traversed — and confirm the measurement matches. A figure orders of magnitude off usually indicts the workload: a mesh whose triangles each span the canvas measures fill rate, not mesh rasterization; a fully dense image measures a path real sparse input never takes. A degenerate workload invents a bottleneck; an unrepresentatively easy one hides a real one.

Record for reproduction

The delivered directory is the reproduction boundary. Never reconstruct a script or raw result from memory after the run. Beyond the obvious — pinned commit, environment freeze, literal commands, no credentials or external datasets — five things matter more than they look:

  • run-unique raw-result filenames (results/bench-<sweep>-<runid>.json) — a second lock acquisition that re-runs a phase will otherwise silently overwrite files the report already cites;

  • all raw samples, with the device state they were taken under;

  • full arrays or compressed states wherever an aggregate could hide a rare mismatch;

  • memory time series with the achieved polling interval;

  • the cache directory, or the procedure for clearing it — without it no cold-start number is reproducible.

Evidence integrity

If an artifact is lost, overwritten, or produced under a protocol you cannot defend: delete the claim, mark the artifact deliberately absent, and say why. Do not restate a number from memory or fabricate sample arrays. Dropping an entire timing table because its raw results were clobbered is the correct response. A missing measurement is reported as missing — that is what not measured is for.

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Python

The author says: Screening, static evaluation and reporting need no GPU. Measuring Warp requires an NVIDIA CUDA GPU, the target project's dependencies and a representative workload; without them, abort before profiling.

Security

What our scanner noticed· Medium risk

  • Large base64-encoded blobs
  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
NVIDIA Corporation
Publisher
NVIDIA (Official)
Source
NVIDIA/skills · skills/warp-eval · commit fce3cca
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE-APACHE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by NVIDIA Corporation or NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download warp-eval.zip