Skip to content

warpspeed run_to_run deterministic scan for SM90 using atomic global counter#9565

Open
srinivasyadav18 wants to merge 1 commit into
NVIDIA:mainfrom
srinivasyadav18:warpspeed_atomic_sm90_rebased
Open

warpspeed run_to_run deterministic scan for SM90 using atomic global counter#9565
srinivasyadav18 wants to merge 1 commit into
NVIDIA:mainfrom
srinivasyadav18:warpspeed_atomic_sm90_rebased

Conversation

@srinivasyadav18

Copy link
Copy Markdown
Contributor

Description

closes #9334

Checklist

  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

@srinivasyadav18 srinivasyadav18 requested a review from a team as a code owner June 23, 2026 14:37
@github-project-automation github-project-automation Bot moved this to Todo in CCCL Jun 23, 2026
@cccl-authenticator-app cccl-authenticator-app Bot moved this from Todo to In Review in CCCL Jun 23, 2026
@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a5f995b6-7020-4523-9204-19860f6ea931

📥 Commits

Reviewing files that changed from the base of the PR and between 1a42062 and e2bb592.

📒 Files selected for processing (7)
  • c/parallel/src/scan.cu
  • cub/cub/detail/warpspeed/look_ahead.cuh
  • cub/cub/detail/warpspeed/squad/load_store.cuh
  • cub/cub/device/dispatch/dispatch_scan.cuh
  • cub/cub/device/dispatch/kernels/kernel_scan.cuh
  • cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh
  • cub/cub/device/dispatch/tuning/tuning_scan.cuh
🚧 Files skipped from review as they are similar to previous changes (6)
  • cub/cub/device/dispatch/kernels/kernel_scan.cuh
  • cub/cub/detail/warpspeed/look_ahead.cuh
  • cub/cub/device/dispatch/tuning/tuning_scan.cuh
  • cub/cub/detail/warpspeed/squad/load_store.cuh
  • cub/cub/device/dispatch/dispatch_scan.cuh
  • cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh

Note: CodeRabbit is enabled on this repository as a convenience for maintainers and contributors. Use your best judgment when considering its review comments and suggestions — a suggested change may be inadequate, unnecessary, or safe to ignore.
Contributors are not expected to address every comment. Human reviews are what
ultimately matter for merging.

Overview

This pull request extends the CUB warpspeed run-to-run deterministic implementation to support SM90 GPUs by introducing an atomic global counter mechanism for tile scheduling. The changes enable deterministic scan operations on SM90 while preserving the existing clusterlaunch-based scheduling optimizations for SM100+.

Key Changes

Look-Ahead Tile State Bounds (look_ahead.cuh)

Updated warpspeed look-ahead tile-state loading and storing to take an explicit num_tiles parameter for bounds checking. Specifically:

  • storeTileAggregate() and loadTileAggregate() now assert index < num_tiles instead of depending on gridDim.x
  • warpLoadLookahead() accepts num_tiles and forwards it to tile aggregate loading
  • warpIncrementalLookahead() and warpIncrementalLookaheadStable() updated to accept num_tiles and pass it through

Squad Bulk Storage Masking (load_store.cuh)

Enhanced squadStoreBulkSync bulk store masking logic with SM100-aware selection:

  • When NV_PROVIDES_SM_100 is available, the implementation uses cp_async_bulk_cp_mask
  • Otherwise, it performs equivalent masked byte-wise assignments using computed byte masks and squad.threadRank()
  • The change covers both start and end alignment copy portions

Scan Dispatch with Atomic Scheduling (dispatch_scan.cuh)

Modified lookahead scan dispatch to wire in atomic-counter-based scheduling:

  • lookahead_make_tile_state_kernel_arg() now accepts an optional uint32_t* atomic_counter and includes it in the lookahead kernel argument
  • Lookahead temporary storage layout is updated to allocate tile-state descriptors plus a separate uint32_t atomic counter
  • Lookahead grid sizing uses atomic_scheduling ? min(sm_count, num_tiles) : num_tiles
  • atomic_scheduling is enabled for SM90 (cc == {9,0}) and forwarded into invoke_lookahead

Kernel Argument Structure Updates (kernel_scan.cuh)

Introduced a helper to carry separate pointers for lookahead tile-state storage and the atomic counter:

  • Added lookahead_tile_state_arg_t containing tile_states and atomic_counter
  • Updated tile_state_kernel_arg_t to use the new helper structure
  • Lookahead init resets the atomic counter to 0 when the counter pointer is non-null
  • SM90 lookahead path constructs scan kernel params using both tile_states and atomic_counter

Lookahead Tile Scheduling (Atomic Fallback) (kernel_scan_lookahead.cuh)

Extended the lookahead scheduler with an SM90+ atomic fallback:

  • Added squadGetNextBlockIdxAtomic() which uses atomicAdd(atomicCounter, 1u) to claim the next tile index
  • scanKernelParams includes an atomicCounter pointer
  • The scheduling helper load_next_tile_index() conditionally selects:
    • SM100 mechanism (existing clusterlaunch control path)
    • Atomic mechanism for non-SM100
  • Lookahead execution now passes explicit tile indices/bounds (idxTile, num_tiles) through the pipeline
  • Refactored tile iteration to a bounded loop: while (idxTile < numTiles)

Tuning Policy Adjustment for Stable Reduction Order (tuning_scan.cuh)

Adjusted stable-reduction-order gating to support SM90:

  • Early fallback in get_lookahead_policy() now triggers for cc >= {9,0}
  • Stable reduction order eligibility in the policy selection logic now allows SM90+ (cc >= {9,0}) instead of requiring SM100+

Impact

These changes enable deterministic scan operations on SM90 GPUs by adding an atomic global counter for lookahead tile scheduling, while continuing to use the existing PTX/clusterlaunch scheduling path on SM100+ architectures. The explicit num_tiles parameter improves safety and correctness for look-ahead tile-state bounds across the full scheduling pipeline.

Walkthrough

The PR extends lookahead scan execution for SM90 by adding atomic tile scheduling, passing an atomic counter through dispatch and kernels, tightening tile-count bounds in warpspeed lookahead helpers, and adding non-SM100 masked bulk-store fallbacks.

Changes

SM90 lookahead deterministic scan

Layer / File(s) Summary
Policy and dispatch wiring
cub/cub/device/dispatch/tuning/tuning_scan.cuh, cub/cub/device/dispatch/dispatch_scan.cuh, c/parallel/src/scan.cu
Stable-order lookahead gating shifts to SM90+, dispatch allocates tile-state plus atomic-counter storage, and init/scan kernel arguments are rewired to carry both pointers with adjusted grid sizing.
Kernel argument structure and init kernel
cub/cub/device/dispatch/kernels/kernel_scan.cuh
Lookahead kernel arguments bundle tile-state and atomic-counter pointers in lookahead_tile_state_arg_t, and init kernel initializes tile states plus resets the atomic counter.
Kernel scheduling and tile iteration
cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh
Lookahead kernel params carry an atomic counter, non-SM100 scheduling claims tiles with atomicAdd, and squad dispatch now runs with explicit numTiles bounds and updated per-iteration tile-index handling.
Warpspeed bounds and masked-store fallback
cub/cub/detail/warpspeed/look_ahead.cuh, cub/cub/detail/warpspeed/squad/load_store.cuh
Lookahead helper calls propagate num_tiles into aggregate load/store bounds checks, and masked bulk-store paths use target-selected SM100 PTX instruction or byte-wise fallback copies on other targets.

Assessment against linked issues

Objective Addressed Explanation
Extend warpspeed run-to-run deterministic implementation to SM90 by enabling the lookahead path on SM90 hardware and adjusting stable-order gating [#9334]
Provide SM90-compatible lookahead scheduling and runtime support for scan kernels [#9334]
Preserve correct tile-bound handling in lookahead aggregate load/store paths [#9334]

Possibly related PRs

  • NVIDIA/cccl#9471: Also modifies cub/cub/detail/warpspeed/look_ahead.cuh in the incremental lookahead path—the main PR threads explicit num_tiles for bounds checks, while this PR updates aggregate-lane mask construction.

Suggested reviewers

  • miscco
  • davebayer
  • fbusato

Comment @coderabbitai help to get the list of available commands.

@github-actions

This comment has been minimized.

@srinivasyadav18 srinivasyadav18 force-pushed the warpspeed_atomic_sm90_rebased branch from 1a42062 to e2bb592 Compare June 23, 2026 20:56
@srinivasyadav18 srinivasyadav18 requested a review from a team as a code owner June 23, 2026 20:56
@srinivasyadav18 srinivasyadav18 requested a review from rwgk June 23, 2026 20:56
@github-actions

This comment has been minimized.

@miscco miscco left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am really not sure whether this is the right approach as it greatly affects the performance of warpspeed for all architectures.

I

Comment thread cub/cub/device/dispatch/kernels/kernel_scan.cuh
@srinivasyadav18

Copy link
Copy Markdown
Contributor Author

Performance Report

H100_80GB_HBM3

bench.exclusive_scan.deterministic (avg %Diff: +61.27%) mainly on large problem sizes
['warpspeed_atomic_sm90_rebased_base/H100_80GB_HBM3/deterministic/deterministic.json', 'warpspeed_atomic_sm90_rebased/H100_80GB_HBM3/deterministic/deterministic.json']
# base

## [0] NVIDIA H100 80GB HBM3

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |        Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-------------|---------|----------|
|   F32   |      I64      |      2^16      |   6.821 us |       5.82% |  17.255 us |       4.97% |   10.434 us | 152.97% |  🔴 SLOW  |
|   F32   |      I64      |      2^20      |  14.091 us |       3.37% |  33.521 us |       3.15% |   19.430 us | 137.88% |  🔴 SLOW  |
|   F32   |      I64      |      2^24      |  98.698 us |       1.30% |  98.522 us |       1.39% |   -0.176 us |  -0.18% |  🔵 SAME  |
|   F32   |      I64      |      2^28      |   1.434 ms |       0.47% |   1.000 ms |       0.21% | -433.343 us | -30.23% |  🟢 FAST  |
|   F64   |      I64      |      2^16      |   7.687 us |       5.49% |  18.297 us |       3.49% |   10.611 us | 138.04% |  🔴 SLOW  |
|   F64   |      I64      |      2^20      |  17.628 us |       3.29% |  37.497 us |       3.19% |   19.870 us | 112.72% |  🔴 SLOW  |
|   F64   |      I64      |      2^24      | 136.202 us |       1.04% | 135.206 us |       0.91% |   -0.996 us |  -0.73% |  🔵 SAME  |
|   F64   |      I64      |      2^28      |   2.025 ms |       0.31% |   1.613 ms |       0.37% | -412.012 us | -20.35% |  🟢 FAST  |

H200

bench.exclusive_scan.deterministic (avg %Diff: +40.93%) mainly on large problem sizes
['warpspeed_atomic_sm90_rebased_base/H200/deterministic/deterministic.json', 'warpspeed_atomic_sm90_rebased/H200/deterministic/deterministic.json']
# base

## [0] NVIDIA H200

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |        Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-------------|---------|----------|
|   F32   |      I64      |      2^16      |   8.314 us |       5.42% |  18.550 us |       4.14% |   10.236 us | 123.11% |  🔴 SLOW  |
|   F32   |      I64      |      2^20      |  15.065 us |       3.79% |  30.896 us |       2.80% |   15.831 us | 105.09% |  🔴 SLOW  |
|   F32   |      I64      |      2^24      |  97.968 us |       1.31% |  84.871 us |       1.35% |  -13.097 us | -13.37% |  🟢 FAST  |
|   F32   |      I64      |      2^28      |   1.417 ms |       0.47% | 860.815 us |       0.24% | -556.275 us | -39.25% |  🟢 FAST  |
|   F64   |      I64      |      2^16      |   9.068 us |       4.97% |  19.900 us |       2.65% |   10.832 us | 119.46% |  🔴 SLOW  |
|   F64   |      I64      |      2^20      |  18.283 us |       3.21% |  33.336 us |       2.88% |   15.053 us |  82.34% |  🔴 SLOW  |
|   F64   |      I64      |      2^24      | 132.788 us |       0.93% | 112.678 us |       0.97% |  -20.109 us | -15.14% |  🟢 FAST  |
|   F64   |      I64      |      2^28      |   1.959 ms |       0.23% |   1.277 ms |       0.13% | -682.438 us | -34.83% |  🟢 FAST  |

RTX_PRO_6000_Blackwell_Server_Edition

bench.exclusive_scan.deterministic (avg %Diff: -0.36%)
['warpspeed_atomic_sm90_rebased_base/RTX_PRO_6000_Blackwell_Server_Edition/deterministic/deterministic.json', 'warpspeed_atomic_sm90_rebased/RTX_PRO_6000_Blackwell_Server_Edition/deterministic/deterministic.json']
# base

## [0] NVIDIA RTX PRO 6000 Blackwell Server Edition

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |      Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-----------|---------|----------|
|   F32   |      I64      |      2^16      |   8.175 us |       0.51% |   8.175 us |       0.28% | -0.000 us |  -0.00% |  🔵 SAME  |
|   F32   |      I64      |      2^20      |  12.273 us |       0.94% |  12.289 us |       1.65% |  0.016 us |   0.13% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  87.991 us |       1.19% |  88.075 us |       1.11% |  0.084 us |   0.10% |  🔵 SAME  |
|   F32   |      I64      |      2^28      |   1.473 ms |       0.12% |   1.474 ms |       0.14% |  0.016 us |   0.00% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |  10.240 us |       0.00% |  10.245 us |       1.44% |  0.005 us |   0.05% |  🔴 SLOW  |
|   F64   |      I64      |      2^20      |  21.723 us |       4.68% |  21.017 us |       4.32% | -0.707 us |  -3.25% |  🔵 SAME  |
|   F64   |      I64      |      2^24      | 185.541 us |       0.78% | 185.694 us |       0.76% |  0.153 us |   0.08% |  🔵 SAME  |
|   F64   |      I64      |      2^28      |   2.946 ms |       0.07% |   2.945 ms |       0.07% | -0.420 us |  -0.01% |  🔵 SAME  |
bench.exclusive_scan.sum (avg %Diff: +0.17%)
['warpspeed_atomic_sm90_rebased_base/RTX_PRO_6000_Blackwell_Server_Edition/sum/sum.json', 'warpspeed_atomic_sm90_rebased/RTX_PRO_6000_Blackwell_Server_Edition/sum/sum.json']
# base

## [0] NVIDIA RTX PRO 6000 Blackwell Server Edition

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |      Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-----------|---------|----------|
|   I8    |      I32      |      2^16      |   6.248 us |       7.25% |   6.237 us |       7.00% | -0.011 us |  -0.18% |  🔵 SAME  |
|   I8    |      I32      |      2^20      |   8.192 us |       0.00% |   8.192 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|   I8    |      I32      |      2^24      |  30.609 us |       1.40% |  30.613 us |       1.39% |  0.004 us |   0.01% |  🔵 SAME  |
|   I8    |      I32      |      2^28      | 371.106 us |       0.73% | 370.694 us |       0.67% | -0.412 us |  -0.11% |  🔵 SAME  |
|   I8    |      I64      |      2^16      |   6.144 us |       0.00% |   6.144 us |       0.00% |  0.000 us |   0.00% |  🟡 ????  |
|   I8    |      I64      |      2^20      |   8.488 us |       8.56% |   8.774 us |      10.53% |  0.286 us |   3.37% |  🔵 SAME  |
|   I8    |      I64      |      2^24      |  28.777 us |       1.70% |  28.933 us |       2.45% |  0.156 us |   0.54% |  🔵 SAME  |
|   I8    |      I64      |      2^28      | 370.038 us |       0.67% | 370.427 us |       0.72% |  0.390 us |   0.11% |  🔵 SAME  |
|   I8    |      I64      |      2^32      |   5.917 ms |       5.65% |   5.920 ms |       5.84% |  2.948 us |   0.05% |  🔵 SAME  |
|   I16   |      I32      |      2^16      |   8.180 us |       1.67% |   8.191 us |       0.26% |  0.011 us |   0.13% |  🔵 SAME  |
|   I16   |      I32      |      2^20      |  11.453 us |       8.77% |  10.874 us |       8.72% | -0.579 us |  -5.06% |  🔵 SAME  |
|   I16   |      I32      |      2^24      |  46.718 us |       2.13% |  46.186 us |       2.29% | -0.531 us |  -1.14% |  🔵 SAME  |
|   I16   |      I32      |      2^28      | 737.328 us |       0.24% | 737.221 us |       0.22% | -0.107 us |  -0.01% |  🔵 SAME  |
|   I16   |      I64      |      2^16      |   8.192 us |       0.04% |   8.192 us |       0.00% |  0.000 us |   0.00% |  🔴 SLOW  |
|   I16   |      I64      |      2^20      |  11.228 us |       9.09% |  11.997 us |       5.95% |  0.769 us |   6.85% |  🔴 SLOW  |
|   I16   |      I64      |      2^24      |  46.320 us |       2.26% |  46.382 us |       2.20% |  0.062 us |   0.13% |  🔵 SAME  |
|   I16   |      I64      |      2^28      | 737.442 us |       0.23% | 737.492 us |       0.23% |  0.050 us |   0.01% |  🔵 SAME  |
|   I16   |      I64      |      2^32      |  11.824 ms |       2.71% |  11.820 ms |       2.61% | -4.607 us |  -0.04% |  🔵 SAME  |
|   I32   |      I32      |      2^16      |   8.196 us |       0.58% |   8.195 us |       0.79% | -0.001 us |  -0.02% |  🔵 SAME  |
|   I32   |      I32      |      2^20      |  14.336 us |       0.02% |  14.336 us |       0.00% |  0.000 us |   0.00% |  🟡 ????  |
|   I32   |      I32      |      2^24      |  87.122 us |       1.45% |  86.929 us |       1.32% | -0.193 us |  -0.22% |  🔵 SAME  |
|   I32   |      I32      |      2^28      |   1.473 ms |       0.12% |   1.473 ms |       0.13% | -0.186 us |  -0.01% |  🔵 SAME  |
|   I32   |      I64      |      2^16      |   7.934 us |       8.52% |   8.192 us |       0.09% |  0.258 us |   3.25% |  🔴 SLOW  |
|   I32   |      I64      |      2^20      |  14.336 us |       0.00% |  14.336 us |       0.00% |  0.000 us |   0.00% |  🟡 ????  |
|   I32   |      I64      |      2^24      |  89.200 us |       1.24% |  89.298 us |       1.23% |  0.098 us |   0.11% |  🔵 SAME  |
|   I32   |      I64      |      2^28      |   1.473 ms |       0.13% |   1.473 ms |       0.12% | -0.076 us |  -0.01% |  🔵 SAME  |
|   I32   |      I64      |      2^32      |  23.601 ms |       1.37% |  23.600 ms |       1.43% | -0.636 us |  -0.00% |  🔵 SAME  |
|   I64   |      I32      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|   I64   |      I32      |      2^20      |  18.623 us |       2.99% |  18.609 us |       3.08% | -0.015 us |  -0.08% |  🔵 SAME  |
|   I64   |      I32      |      2^24      | 182.186 us |       0.75% | 182.033 us |       0.71% | -0.153 us |  -0.08% |  🔵 SAME  |
|   I64   |      I32      |      2^28      |   2.946 ms |       0.10% |   2.946 ms |       0.10% | -0.713 us |  -0.02% |  🔵 SAME  |
|   I64   |      I64      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|   I64   |      I64      |      2^20      |  18.407 us |       1.13% |  18.432 us |       0.00% |  0.025 us |   0.13% |  🔴 SLOW  |
|   I64   |      I64      |      2^24      | 181.958 us |       0.71% | 181.877 us |       0.71% | -0.081 us |  -0.04% |  🔵 SAME  |
|   I64   |      I64      |      2^28      |   2.946 ms |       0.10% |   2.946 ms |       0.10% | -0.030 us |  -0.00% |  🔵 SAME  |
|   I64   |      I64      |      2^32      |  47.201 ms |       0.05% |  47.201 ms |       0.05% |  0.133 us |   0.00% |  🔵 SAME  |
|  I128   |      I32      |      2^16      |  10.237 us |       1.04% |  10.239 us |       0.05% |  0.002 us |   0.02% |  🔵 SAME  |
|  I128   |      I32      |      2^20      |  40.283 us |       4.54% |  45.340 us |       2.67% |  5.057 us |  12.55% |  🔴 SLOW  |
|  I128   |      I32      |      2^24      | 389.692 us |       0.57% | 401.865 us |      11.76% | 12.173 us |   3.12% |  🔴 SLOW  |
|  I128   |      I32      |      2^28      |   5.946 ms |       0.11% |   5.945 ms |       0.09% | -0.627 us |  -0.01% |  🔵 SAME  |
|  I128   |      I64      |      2^16      |  10.240 us |       0.00% |  10.240 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|  I128   |      I64      |      2^20      |  40.552 us |       1.98% |  40.661 us |       1.74% |  0.109 us |   0.27% |  🔵 SAME  |
|  I128   |      I64      |      2^24      | 388.655 us |       0.66% | 388.508 us |       0.68% | -0.148 us |  -0.04% |  🔵 SAME  |
|  I128   |      I64      |      2^28      |   5.946 ms |       0.10% |   5.945 ms |       0.10% | -0.736 us |  -0.01% |  🔵 SAME  |
|   F32   |      I32      |      2^16      |   8.192 us |       0.00% |   8.190 us |       1.57% | -0.002 us |  -0.03% |  🟢 FAST  |
|   F32   |      I32      |      2^20      |  15.155 us |       6.78% |  14.842 us |       6.06% | -0.314 us |  -2.07% |  🔵 SAME  |
|   F32   |      I32      |      2^24      | 100.431 us |      11.96% |  94.988 us |      10.50% | -5.443 us |  -5.42% |  🔵 SAME  |
|   F32   |      I32      |      2^28      |   1.472 ms |       0.12% |   1.472 ms |       0.11% | -0.233 us |  -0.02% |  🔵 SAME  |
|   F32   |      I64      |      2^16      |   8.191 us |       0.08% |   8.192 us |       0.00% |  0.001 us |   0.02% |  🔴 SLOW  |
|   F32   |      I64      |      2^20      |  14.336 us |       0.00% |  14.338 us |       0.38% |  0.002 us |   0.02% |  🟡 ????  |
|   F32   |      I64      |      2^24      |  88.365 us |       1.02% |  88.581 us |       1.15% |  0.216 us |   0.24% |  🔵 SAME  |
|   F32   |      I64      |      2^28      |   1.472 ms |       0.11% |   1.472 ms |       0.12% |  0.301 us |   0.02% |  🔵 SAME  |
|   F32   |      I64      |      2^32      |  23.602 ms |       1.60% |  23.596 ms |       1.46% | -6.349 us |  -0.03% |  🔵 SAME  |
|   F64   |      I32      |      2^16      |  10.240 us |       0.00% |  10.235 us |       2.45% | -0.005 us |  -0.05% |  🟢 FAST  |
|   F64   |      I32      |      2^20      |  21.410 us |       5.03% |  20.689 us |       3.01% | -0.721 us |  -3.37% |  🟢 FAST  |
|   F64   |      I32      |      2^24      | 185.470 us |       0.78% | 185.315 us |       0.72% | -0.155 us |  -0.08% |  🔵 SAME  |
|   F64   |      I32      |      2^28      |   2.945 ms |       0.07% |   2.945 ms |       0.07% | -0.622 us |  -0.02% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |  10.240 us |       0.00% |  10.333 us |       4.23% |  0.093 us |   0.91% |  🔴 SLOW  |
|   F64   |      I64      |      2^20      |  21.013 us |       4.28% |  20.951 us |       4.11% | -0.063 us |  -0.30% |  🔵 SAME  |
|   F64   |      I64      |      2^24      | 185.300 us |       0.68% | 185.476 us |       0.69% |  0.176 us |   0.10% |  🔵 SAME  |
|   F64   |      I64      |      2^28      |   2.945 ms |       0.07% |   2.946 ms |       0.08% |  0.442 us |   0.01% |  🔵 SAME  |
|   F64   |      I64      |      2^32      |  47.173 ms |       0.03% |  47.172 ms |       0.03% | -1.170 us |  -0.00% |  🔵 SAME  |
|   C32   |      I32      |      2^16      |   8.192 us |       0.00% |   8.225 us |       3.56% |  0.033 us |   0.40% |  🔴 SLOW  |
|   C32   |      I32      |      2^20      |  18.827 us |       5.54% |  18.600 us |       4.26% | -0.228 us |  -1.21% |  🔵 SAME  |
|   C32   |      I32      |      2^24      | 183.915 us |       0.73% | 183.080 us |       0.68% | -0.835 us |  -0.45% |  🔵 SAME  |
|   C32   |      I32      |      2^28      |   2.947 ms |       0.10% |   2.947 ms |       0.10% | -0.344 us |  -0.01% |  🔵 SAME  |
|   C32   |      I64      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|   C32   |      I64      |      2^20      |  18.432 us |       0.00% |  18.432 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|   C32   |      I64      |      2^24      | 182.953 us |       0.62% | 182.970 us |       0.69% |  0.017 us |   0.01% |  🔵 SAME  |
|   C32   |      I64      |      2^28      |   2.946 ms |       0.10% |   2.947 ms |       0.11% |  0.163 us |   0.01% |  🔵 SAME  |
|   C32   |      I64      |      2^32      |  47.205 ms |       0.04% |  47.199 ms |       0.04% | -5.622 us |  -0.01% |  🔵 SAME  |
bench.exclusive_scan.look_ahead.sum (avg %Diff: +0.68%)
['warpspeed_atomic_sm90_rebased_base/RTX_PRO_6000_Blackwell_Server_Edition/lookahead/lookahead.json', 'warpspeed_atomic_sm90_rebased/RTX_PRO_6000_Blackwell_Server_Edition/lookahead/lookahead.json']
# base

## [0] NVIDIA RTX PRO 6000 Blackwell Server Edition

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |      Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-----------|---------|----------|
|   I8    |      I64      |      2^16      |   6.476 us |      12.02% |   7.183 us |      14.16% |  0.707 us |  10.93% |  🔵 SAME  |
|   I8    |      I64      |      2^20      |   8.239 us |       3.69% |   8.347 us |       6.56% |  0.108 us |   1.31% |  🔵 SAME  |
|   I8    |      I64      |      2^24      |  30.739 us |       1.07% |  30.755 us |       1.19% |  0.016 us |   0.05% |  🔵 SAME  |
|   I8    |      I64      |      2^28      | 370.990 us |       0.70% | 371.520 us |       0.66% |  0.529 us |   0.14% |  🔵 SAME  |
|   I8    |      I64      |      2^32      |   5.911 ms |       5.12% |   5.922 ms |       5.77% | 10.228 us |   0.17% |  🔵 SAME  |
|   I16   |      I64      |      2^16      |   8.192 us |       0.00% |   8.215 us |       3.24% |  0.023 us |   0.28% |  🔴 SLOW  |
|   I16   |      I64      |      2^20      |   8.338 us |       6.44% |   8.407 us |       7.48% |  0.069 us |   0.83% |  🔵 SAME  |
|   I16   |      I64      |      2^24      |  45.321 us |       1.66% |  45.320 us |       1.66% | -0.001 us |  -0.00% |  🔵 SAME  |
|   I16   |      I64      |      2^28      | 737.434 us |       0.22% | 737.283 us |       0.22% | -0.151 us |  -0.02% |  🔵 SAME  |
|   I16   |      I64      |      2^32      |  11.816 ms |       2.41% |  11.815 ms |       2.40% | -0.938 us |  -0.01% |  🔵 SAME  |
|   I32   |      I64      |      2^16      |   8.193 us |       0.53% |   8.193 us |       0.36% |  0.001 us |   0.01% |  🔵 SAME  |
|   I32   |      I64      |      2^20      |  14.336 us |       0.00% |  14.335 us |       0.05% | -0.001 us |  -0.01% |  🟡 ????  |
|   I32   |      I64      |      2^24      |  87.884 us |       1.12% |  87.915 us |       1.06% |  0.031 us |   0.03% |  🔵 SAME  |
|   I32   |      I64      |      2^28      |   1.473 ms |       0.12% |   1.473 ms |       0.12% | -0.065 us |  -0.00% |  🔵 SAME  |
|   I32   |      I64      |      2^32      |  23.611 ms |       1.66% |  23.604 ms |       1.47% | -6.983 us |  -0.03% |  🔵 SAME  |
|   I64   |      I64      |      2^16      |   8.245 us |       4.03% |   8.192 us |       0.00% | -0.053 us |  -0.65% |  🟢 FAST  |
|   I64   |      I64      |      2^20      |  18.432 us |       0.00% |  18.696 us |       2.58% |  0.264 us |   1.43% |  🔴 SLOW  |
|   I64   |      I64      |      2^24      | 181.892 us |       0.70% | 181.938 us |       0.70% |  0.045 us |   0.02% |  🔵 SAME  |
|   I64   |      I64      |      2^28      |   2.947 ms |       0.11% |   2.947 ms |       0.10% |  0.359 us |   0.01% |  🔵 SAME  |
|   I64   |      I64      |      2^32      |  47.210 ms |       0.04% |  47.200 ms |       0.05% | -9.540 us |  -0.02% |  🔵 SAME  |
|  I128   |      I64      |      2^16      |  10.240 us |       0.00% |  10.240 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|  I128   |      I64      |      2^20      |  45.811 us |       2.63% |  46.112 us |       2.66% |  0.301 us |   0.66% |  🔵 SAME  |
|  I128   |      I64      |      2^24      | 390.131 us |       2.18% | 402.188 us |      11.74% | 12.056 us |   3.09% |  🔴 SLOW  |
|  I128   |      I64      |      2^28      |   5.946 ms |       0.10% |   5.946 ms |       0.09% | -0.689 us |  -0.01% |  🔵 SAME  |
|   F32   |      I64      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |  0.000 us |   0.00% |  🔵 SAME  |
|   F32   |      I64      |      2^20      |  14.953 us |       6.49% |  15.191 us |       6.85% |  0.238 us |   1.59% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  99.570 us |      12.09% | 101.910 us |      11.85% |  2.340 us |   2.35% |  🔵 SAME  |
|   F32   |      I64      |      2^28      |   1.472 ms |       0.11% |   1.472 ms |       0.11% |  0.038 us |   0.00% |  🔵 SAME  |
|   F32   |      I64      |      2^32      |  23.600 ms |       1.64% |  23.599 ms |       1.53% | -0.715 us |  -0.00% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |  10.364 us |       4.77% |  10.510 us |       6.64% |  0.147 us |   1.42% |  🔵 SAME  |
|   F64   |      I64      |      2^20      |  21.230 us |       4.63% |  21.158 us |       4.56% | -0.072 us |  -0.34% |  🔵 SAME  |
|   F64   |      I64      |      2^24      | 185.634 us |       0.77% | 185.575 us |       0.75% | -0.059 us |  -0.03% |  🔵 SAME  |
|   F64   |      I64      |      2^28      |   2.946 ms |       0.08% |   2.946 ms |       0.09% | -0.110 us |  -0.00% |  🔵 SAME  |
|   F64   |      I64      |      2^32      |  47.171 ms |       0.03% |  47.175 ms |       0.03% |  3.693 us |   0.01% |  🔵 SAME  |
|   C32   |      I64      |      2^16      |   8.246 us |       3.99% |   8.349 us |       6.83% |  0.104 us |   1.26% |  🔵 SAME  |
|   C32   |      I64      |      2^20      |  19.914 us |       5.27% |  20.346 us |       3.69% |  0.433 us |   2.17% |  🔵 SAME  |
|   C32   |      I64      |      2^24      | 183.060 us |       0.73% | 183.169 us |       0.67% |  0.109 us |   0.06% |  🔵 SAME  |
|   C32   |      I64      |      2^28      |   2.947 ms |       0.10% |   2.947 ms |       0.10% |  0.136 us |   0.00% |  🔵 SAME  |
|   C32   |      I64      |      2^32      |  47.203 ms |       0.04% |  47.204 ms |       0.04% |  0.526 us |   0.00% |  🔵 SAME  |
bench.exclusive_scan.custom (avg %Diff: +0.12%)
['warpspeed_atomic_sm90_rebased_base/RTX_PRO_6000_Blackwell_Server_Edition/custom/custom.json', 'warpspeed_atomic_sm90_rebased/RTX_PRO_6000_Blackwell_Server_Edition/custom/custom.json']
# base

## [0] NVIDIA RTX PRO 6000 Blackwell Server Edition

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |         Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|--------------|---------|----------|
|   I8    |      I32      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |     0.000 us |   0.00% |  🔵 SAME  |
|   I8    |      I32      |      2^20      |  10.211 us |       3.06% |  10.240 us |       0.00% |     0.029 us |   0.28% |  🔴 SLOW  |
|   I8    |      I32      |      2^24      |  39.077 us |       1.56% |  38.939 us |       0.78% |    -0.138 us |  -0.35% |  🔵 SAME  |
|   I8    |      I32      |      2^28      | 377.885 us |       0.61% | 377.295 us |       0.63% |    -0.590 us |  -0.16% |  🔵 SAME  |
|   I8    |      I64      |      2^16      |   7.622 us |      16.84% |   7.187 us |      14.23% |    -0.435 us |  -5.70% |  🔵 SAME  |
|   I8    |      I64      |      2^20      |  10.240 us |       0.00% |  10.240 us |       0.00% |     0.000 us |   0.00% |  🔵 SAME  |
|   I8    |      I64      |      2^24      |  37.517 us |       2.56% |  37.854 us |       2.70% |     0.337 us |   0.90% |  🔵 SAME  |
|   I8    |      I64      |      2^28      | 377.483 us |       0.46% | 377.247 us |       0.48% |    -0.236 us |  -0.06% |  🔵 SAME  |
|   I8    |      I64      |      2^32      |   5.920 ms |       6.22% |   5.926 ms |       6.50% |     6.353 us |   0.11% |  🔵 SAME  |
|   I16   |      I32      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |     0.000 us |   0.00% |  🔵 SAME  |
|   I16   |      I32      |      2^20      |  11.265 us |       9.08% |  10.580 us |       7.27% |    -0.685 us |  -6.08% |  🔵 SAME  |
|   I16   |      I32      |      2^24      |  49.152 us |       0.00% |  49.152 us |       0.00% |     0.000 us |   0.00% |  🟡 ????  |
|   I16   |      I32      |      2^28      | 736.391 us |       0.31% | 736.252 us |       0.30% |    -0.139 us |  -0.02% |  🔵 SAME  |
|   I16   |      I64      |      2^16      |   8.192 us |       0.00% |   8.192 us |       0.00% |     0.000 us |   0.00% |  🔵 SAME  |
|   I16   |      I64      |      2^20      |  10.844 us |       8.66% |  11.186 us |       9.23% |     0.342 us |   3.15% |  🔵 SAME  |
|   I16   |      I64      |      2^24      |  48.042 us |       2.13% |  47.986 us |       2.12% |    -0.056 us |  -0.12% |  🔵 SAME  |
|   I16   |      I64      |      2^28      | 736.591 us |       0.34% | 736.626 us |       0.32% |     0.034 us |   0.00% |  🔵 SAME  |
|   I16   |      I64      |      2^32      |  11.790 ms |       2.90% |  11.801 ms |       3.34% |    11.100 us |   0.09% |  🔵 SAME  |
|   I32   |      I32      |      2^16      |   6.300 us |       9.30% |   6.183 us |       5.89% |    -0.117 us |  -1.85% |  🔵 SAME  |
|   I32   |      I32      |      2^20      |  14.134 us |       4.14% |  13.841 us |       6.26% |    -0.293 us |  -2.07% |  🔵 SAME  |
|   I32   |      I32      |      2^24      |  88.557 us |       1.27% |  88.401 us |       1.24% |    -0.156 us |  -0.18% |  🔵 SAME  |
|   I32   |      I32      |      2^28      |   1.471 ms |       0.15% |   1.471 ms |       0.14% |    -0.216 us |  -0.01% |  🔵 SAME  |
|   I32   |      I64      |      2^16      |   6.143 us |       0.08% |   6.144 us |       0.00% |     0.001 us |   0.01% |  🟡 ????  |
|   I32   |      I64      |      2^20      |  14.164 us |       3.79% |  14.211 us |       3.22% |     0.047 us |   0.33% |  🔵 SAME  |
|   I32   |      I64      |      2^24      |  88.776 us |       1.19% |  88.784 us |       1.15% |     0.008 us |   0.01% |  🔵 SAME  |
|   I32   |      I64      |      2^28      |   1.473 ms |       0.17% |   1.473 ms |       0.15% |     0.008 us |   0.00% |  🔵 SAME  |
|   I32   |      I64      |      2^32      |  23.559 ms |       1.81% |  23.557 ms |       1.75% |    -2.172 us |  -0.01% |  🔵 SAME  |
|   I64   |      I32      |      2^16      |   8.192 us |       0.00% |   7.418 us |      13.27% |    -0.774 us |  -9.45% |  🟢 FAST  |
|   I64   |      I32      |      2^20      |  18.283 us |       4.33% |  17.972 us |       4.76% |    -0.312 us |  -1.71% |  🔵 SAME  |
|   I64   |      I32      |      2^24      | 185.511 us |       0.71% | 185.481 us |       0.71% |    -0.030 us |  -0.02% |  🔵 SAME  |
|   I64   |      I32      |      2^28      |   2.938 ms |       0.07% |   2.938 ms |       0.08% |    -0.340 us |  -0.01% |  🔵 SAME  |
|   I64   |      I64      |      2^16      |   6.274 us |       7.99% |   6.326 us |       9.24% |     0.052 us |   0.83% |  🔵 SAME  |
|   I64   |      I64      |      2^20      |  17.903 us |       4.99% |  17.961 us |       4.84% |     0.057 us |   0.32% |  🔵 SAME  |
|   I64   |      I64      |      2^24      | 184.257 us |       0.71% | 184.116 us |       0.72% |    -0.141 us |  -0.08% |  🔵 SAME  |
|   I64   |      I64      |      2^28      |   2.939 ms |       0.06% |   2.939 ms |       0.07% |     0.037 us |   0.00% |  🔵 SAME  |
|   I64   |      I64      |      2^32      |  47.126 ms |       0.04% |  47.127 ms |       0.04% |     0.572 us |   0.00% |  🔵 SAME  |
|  I128   |      I32      |      2^16      |  10.235 us |       1.16% |  10.254 us |       2.56% |     0.019 us |   0.19% |  🔵 SAME  |
|  I128   |      I32      |      2^20      |  42.409 us |       6.57% |  45.400 us |       2.78% |     2.991 us |   7.05% |  🔴 SLOW  |
|  I128   |      I32      |      2^24      | 389.642 us |       0.61% | 390.769 us |       3.98% |     1.127 us |   0.29% |  🔵 SAME  |
|  I128   |      I32      |      2^28      |   5.944 ms |       0.10% |   5.942 ms |       0.09% |    -1.480 us |  -0.02% |  🔵 SAME  |
|  I128   |      I64      |      2^16      |  10.244 us |       0.31% |  10.258 us |       2.17% |     0.015 us |   0.14% |  🔵 SAME  |
|  I128   |      I64      |      2^20      |  40.660 us |       1.76% |  40.812 us |       1.43% |     0.153 us |   0.38% |  🔵 SAME  |
|  I128   |      I64      |      2^24      | 388.507 us |       0.69% | 388.073 us |       0.79% |    -0.434 us |  -0.11% |  🔵 SAME  |
|  I128   |      I64      |      2^28      |   5.943 ms |       0.10% |   5.943 ms |       0.10% |    -0.792 us |  -0.01% |  🔵 SAME  |
|   F32   |      I32      |      2^16      |   6.542 us |      12.51% |   6.374 us |      10.13% |    -0.168 us |  -2.57% |  🔵 SAME  |
|   F32   |      I32      |      2^20      |  14.367 us |       3.10% |  14.336 us |       0.00% |    -0.031 us |  -0.21% |  🟡 ????  |
|   F32   |      I32      |      2^24      |  89.937 us |       1.27% | 105.995 us |      16.24% |    16.058 us |  17.86% |  🔴 SLOW  |
|   F32   |      I32      |      2^28      |   1.472 ms |       0.15% |   1.472 ms |       0.16% |     0.248 us |   0.02% |  🔵 SAME  |
|   F32   |      I64      |      2^16      |   6.163 us |       3.41% |   6.144 us |       0.00% |    -0.019 us |  -0.30% |  🟡 ????  |
|   F32   |      I64      |      2^20      |  14.287 us |       2.25% |  14.300 us |       1.79% |     0.013 us |   0.09% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  89.661 us |       1.36% |  89.917 us |       1.30% |     0.256 us |   0.29% |  🔵 SAME  |
|   F32   |      I64      |      2^28      |   1.472 ms |       0.17% |   1.472 ms |       0.18% |     0.010 us |   0.00% |  🔵 SAME  |
|   F32   |      I64      |      2^32      |  23.558 ms |       1.63% |  23.555 ms |       1.52% |    -3.258 us |  -0.01% |  🔵 SAME  |
|   F64   |      I32      |      2^16      |   8.190 us |       2.64% |   8.192 us |       0.00% |     0.002 us |   0.02% |  🔴 SLOW  |
|   F64   |      I32      |      2^20      |  18.980 us |       4.81% |  19.208 us |       5.21% |     0.228 us |   1.20% |  🔵 SAME  |
|   F64   |      I32      |      2^24      | 188.593 us |       0.70% | 188.409 us |       0.70% |    -0.185 us |  -0.10% |  🔵 SAME  |
|   F64   |      I32      |      2^28      |   2.941 ms |       0.13% |   2.940 ms |       0.14% |    -0.523 us |  -0.02% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |   8.192 us |       0.00% |   8.197 us |       0.92% |     0.005 us |   0.06% |  🔴 SLOW  |
|   F64   |      I64      |      2^20      |  19.291 us |       5.29% |  19.212 us |       5.18% |    -0.079 us |  -0.41% |  🔵 SAME  |
|   F64   |      I64      |      2^24      | 188.446 us |       0.65% | 188.607 us |       0.72% |     0.161 us |   0.09% |  🔵 SAME  |
|   F64   |      I64      |      2^28      |   2.941 ms |       0.13% |   2.941 ms |       0.13% |     0.038 us |   0.00% |  🔵 SAME  |
|   F64   |      I64      |      2^32      |  47.092 ms |       0.04% |  47.091 ms |       0.04% |    -1.105 us |  -0.00% |  🔵 SAME  |
|   C32   |      I32      |      2^16      | 117.564 us |       3.29% | 122.163 us |       1.08% |     4.599 us |   3.91% |  🔴 SLOW  |
|   C32   |      I32      |      2^20      | 151.027 us |       0.86% | 161.907 us |       2.90% |    10.880 us |   7.20% |  🔴 SLOW  |
|   C32   |      I32      |      2^24      | 773.429 us |       0.70% | 768.549 us |       0.69% |    -4.880 us |  -0.63% |  🔵 SAME  |
|   C32   |      I32      |      2^28      |  10.937 ms |       0.15% |  10.777 ms |       0.23% |  -160.866 us |  -1.47% |  🟢 FAST  |
|   C32   |      I64      |      2^16      | 111.529 us |       0.97% | 112.300 us |       0.83% |     0.771 us |   0.69% |  🔵 SAME  |
|   C32   |      I64      |      2^20      | 153.446 us |       0.98% | 153.617 us |       0.82% |     0.171 us |   0.11% |  🔵 SAME  |
|   C32   |      I64      |      2^24      | 774.246 us |       0.71% | 769.720 us |       0.71% |    -4.526 us |  -0.58% |  🔵 SAME  |
|   C32   |      I64      |      2^28      |  10.917 ms |       0.14% |  10.780 ms |       0.23% |  -137.758 us |  -1.26% |  🟢 FAST  |
|   C32   |      I64      |      2^32      | 173.050 ms |       0.03% | 170.670 ms |       0.06% | -2379.955 us |  -1.38% |  🟢 FAST  |

B200

bench.exclusive_scan.deterministic (avg %Diff: -0.18%)
['warpspeed_atomic_sm90_rebased_base/B200/deterministic/deterministic.json', 'warpspeed_atomic_sm90_rebased/B200/deterministic/deterministic.json']
# base

## [0] NVIDIA B200

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |      Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-----------|---------|----------|
|   F32   |      I64      |      2^16      |  10.575 us |       9.13% |  10.442 us |       9.58% | -0.133 us |  -1.26% |  🔵 SAME  |
|   F32   |      I64      |      2^20      |  13.639 us |       6.71% |  13.531 us |       6.28% | -0.109 us |  -0.80% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  37.049 us |       3.23% |  37.105 us |       3.16% |  0.057 us |   0.15% |  🔵 SAME  |
|   F32   |      I64      |      2^28      | 318.527 us |       0.50% | 318.396 us |       0.49% | -0.131 us |  -0.04% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |  11.263 us |       0.60% |  11.254 us |       0.42% | -0.009 us |  -0.08% |  🔵 SAME  |
|   F64   |      I64      |      2^20      |  15.283 us |       1.63% |  15.294 us |       1.73% |  0.012 us |   0.08% |  🔵 SAME  |
|   F64   |      I64      |      2^24      |  56.668 us |       1.83% |  56.880 us |       1.87% |  0.211 us |   0.37% |  🔵 SAME  |
|   F64   |      I64      |      2^28      | 619.486 us |       0.18% | 620.261 us |       0.17% |  0.774 us |   0.12% |  🔵 SAME  |
bench.exclusive_scan.sum (avg %Diff: +0.14%)
['warpspeed_atomic_sm90_rebased_base/B200/sum/sum.json', 'warpspeed_atomic_sm90_rebased/B200/sum/sum.json']
# base

## [0] NVIDIA B200

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |       Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|------------|---------|----------|
|   I8    |      I32      |      2^16      |  11.258 us |       0.52% |  11.257 us |       0.52% |  -0.001 us |  -0.01% |  🔵 SAME  |
|   I8    |      I32      |      2^20      |  13.046 us |       4.56% |  12.626 us |       7.29% |  -0.420 us |  -3.22% |  🔵 SAME  |
|   I8    |      I32      |      2^24      |  27.648 us |       0.00% |  27.658 us |       0.73% |   0.010 us |   0.04% |  🔴 SLOW  |
|   I8    |      I32      |      2^28      | 212.550 us |       0.46% | 212.605 us |       0.47% |   0.054 us |   0.03% |  🔵 SAME  |
|   I8    |      I64      |      2^16      |  11.032 us |       3.93% |  10.902 us |       4.54% |  -0.130 us |  -1.18% |  🔵 SAME  |
|   I8    |      I64      |      2^20      |  12.686 us |       7.15% |  12.609 us |       7.40% |  -0.077 us |  -0.61% |  🔵 SAME  |
|   I8    |      I64      |      2^24      |  28.235 us |       3.27% |  28.431 us |       3.61% |   0.196 us |   0.70% |  🔵 SAME  |
|   I8    |      I64      |      2^28      | 214.628 us |       0.48% | 214.988 us |       0.45% |   0.359 us |   0.17% |  🔵 SAME  |
|   I8    |      I64      |      2^32      |   3.232 ms |       0.37% |   3.234 ms |       0.33% |   1.696 us |   0.05% |  🔵 SAME  |
|   I16   |      I32      |      2^16      |  11.252 us |       1.36% |  10.968 us |       4.31% |  -0.284 us |  -2.52% |  🟢 FAST  |
|   I16   |      I32      |      2^20      |  13.144 us |       4.09% |  13.044 us |       4.95% |  -0.100 us |  -0.76% |  🔵 SAME  |
|   I16   |      I32      |      2^24      |  30.171 us |       3.62% |  30.541 us |       3.64% |   0.370 us |   1.23% |  🔵 SAME  |
|   I16   |      I32      |      2^28      | 214.668 us |       0.57% | 211.700 us |       0.48% |  -2.968 us |  -1.38% |  🟢 FAST  |
|   I16   |      I64      |      2^16      |  11.261 us |       0.42% |  10.949 us |       4.31% |  -0.313 us |  -2.78% |  🟢 FAST  |
|   I16   |      I64      |      2^20      |  13.205 us |       3.18% |  12.957 us |       5.00% |  -0.248 us |  -1.88% |  🔵 SAME  |
|   I16   |      I64      |      2^24      |  27.174 us |       3.16% |  27.337 us |       3.13% |   0.163 us |   0.60% |  🔵 SAME  |
|   I16   |      I64      |      2^28      | 214.190 us |       0.56% | 214.494 us |       0.57% |   0.304 us |   0.14% |  🔵 SAME  |
|   I16   |      I64      |      2^32      |   3.318 ms |       1.60% |   3.321 ms |       1.52% |   3.328 us |   0.10% |  🔵 SAME  |
|   I32   |      I32      |      2^16      |   9.544 us |       7.90% |   9.775 us |       9.35% |   0.231 us |   2.42% |  🔵 SAME  |
|   I32   |      I32      |      2^20      |  13.199 us |       3.90% |  14.152 us |       7.23% |   0.953 us |   7.22% |  🔴 SLOW  |
|   I32   |      I32      |      2^24      |  32.440 us |       3.94% |  33.980 us |       3.59% |   1.539 us |   4.74% |  🔴 SLOW  |
|   I32   |      I32      |      2^28      | 322.071 us |       0.50% | 322.336 us |       0.49% |   0.265 us |   0.08% |  🔵 SAME  |
|   I32   |      I64      |      2^16      |   9.295 us |       4.59% |  10.142 us |      10.05% |   0.847 us |   9.11% |  🔴 SLOW  |
|   I32   |      I64      |      2^20      |  12.893 us |       5.63% |  13.247 us |       2.46% |   0.354 us |   2.74% |  🔴 SLOW  |
|   I32   |      I64      |      2^24      |  32.746 us |       3.97% |  33.925 us |       3.27% |   1.179 us |   3.60% |  🔴 SLOW  |
|   I32   |      I64      |      2^28      | 322.137 us |       0.52% | 319.138 us |       0.54% |  -2.999 us |  -0.93% |  🟢 FAST  |
|   I32   |      I64      |      2^32      |   5.091 ms |       1.05% |   5.096 ms |       1.20% |   5.447 us |   0.11% |  🔵 SAME  |
|   I64   |      I32      |      2^16      |  11.879 us |       7.80% |  11.985 us |       8.16% |   0.106 us |   0.89% |  🔵 SAME  |
|   I64   |      I32      |      2^20      |  16.524 us |       6.24% |  15.962 us |       5.93% |  -0.561 us |  -3.40% |  🔵 SAME  |
|   I64   |      I32      |      2^24      |  54.489 us |       2.41% |  56.201 us |       1.80% |   1.713 us |   3.14% |  🔴 SLOW  |
|   I64   |      I32      |      2^28      | 625.049 us |       0.36% | 626.418 us |       0.30% |   1.370 us |   0.22% |  🔵 SAME  |
|   I64   |      I64      |      2^16      |  11.261 us |       0.55% |  11.194 us |       2.29% |  -0.067 us |  -0.59% |  🟢 FAST  |
|   I64   |      I64      |      2^20      |  15.384 us |       1.66% |  15.898 us |       5.25% |   0.514 us |   3.34% |  🔴 SLOW  |
|   I64   |      I64      |      2^24      |  54.708 us |       2.42% |  54.062 us |       2.37% |  -0.647 us |  -1.18% |  🔵 SAME  |
|   I64   |      I64      |      2^28      | 625.394 us |       0.35% | 624.010 us |       0.45% |  -1.384 us |  -0.22% |  🔵 SAME  |
|   I64   |      I64      |      2^32      |  10.392 ms |       0.79% |  10.426 ms |       1.00% |  33.334 us |   0.32% |  🔵 SAME  |
|  I128   |      I32      |      2^16      |  12.824 us |       6.08% |  13.194 us |       3.30% |   0.370 us |   2.89% |  🔵 SAME  |
|  I128   |      I32      |      2^20      |  21.352 us |       2.50% |  22.858 us |       4.05% |   1.507 us |   7.06% |  🔴 SLOW  |
|  I128   |      I32      |      2^24      | 145.451 us |       0.80% | 146.663 us |       0.88% |   1.212 us |   0.83% |  🔴 SLOW  |
|  I128   |      I32      |      2^28      |   2.011 ms |       0.19% |   2.019 ms |       0.21% |   8.021 us |   0.40% |  🔴 SLOW  |
|  I128   |      I64      |      2^16      |  11.982 us |       6.46% |  12.619 us |       7.70% |   0.637 us |   5.32% |  🔵 SAME  |
|  I128   |      I64      |      2^20      |  22.847 us |       4.31% |  21.183 us |       3.27% |  -1.664 us |  -7.28% |  🟢 FAST  |
|  I128   |      I64      |      2^24      | 146.056 us |       0.85% | 146.856 us |       0.83% |   0.800 us |   0.55% |  🔵 SAME  |
|  I128   |      I64      |      2^28      |   2.011 ms |       0.20% |   2.019 ms |       0.21% |   7.828 us |   0.39% |  🔴 SLOW  |
|  I128   |      I64      |      2^32      |  31.663 ms |       0.04% |  31.800 ms |       3.66% | 137.136 us |   0.43% |  🔴 SLOW  |
|   F32   |      I32      |      2^16      |  10.547 us |       9.21% |  10.838 us |       7.10% |   0.292 us |   2.76% |  🔵 SAME  |
|   F32   |      I32      |      2^20      |  13.306 us |       2.31% |  13.776 us |       6.35% |   0.470 us |   3.53% |  🔴 SLOW  |
|   F32   |      I32      |      2^24      |  37.939 us |       3.06% |  35.847 us |       3.31% |  -2.092 us |  -5.51% |  🟢 FAST  |
|   F32   |      I32      |      2^28      | 320.157 us |       0.42% | 317.548 us |       0.40% |  -2.609 us |  -0.81% |  🟢 FAST  |
|   F32   |      I64      |      2^16      |  10.318 us |       8.52% |  10.791 us |       7.87% |   0.474 us |   4.59% |  🔵 SAME  |
|   F32   |      I64      |      2^20      |  13.308 us |       4.98% |  13.681 us |       5.98% |   0.373 us |   2.80% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  38.020 us |       3.03% |  35.853 us |       3.55% |  -2.167 us |  -5.70% |  🟢 FAST  |
|   F32   |      I64      |      2^28      | 320.347 us |       0.38% | 317.829 us |       0.47% |  -2.518 us |  -0.79% |  🟢 FAST  |
|   F32   |      I64      |      2^32      |   4.879 ms |       0.68% |   4.881 ms |       0.80% |   2.183 us |   0.04% |  🔵 SAME  |
|   F64   |      I32      |      2^16      |  11.265 us |       2.00% |  11.279 us |       2.26% |   0.014 us |   0.12% |  🔵 SAME  |
|   F64   |      I32      |      2^20      |  16.431 us |       6.04% |  15.437 us |       2.64% |  -0.994 us |  -6.05% |  🟢 FAST  |
|   F64   |      I32      |      2^24      |  57.866 us |       1.84% |  56.578 us |       1.99% |  -1.288 us |  -2.23% |  🟢 FAST  |
|   F64   |      I32      |      2^28      | 639.909 us |       0.22% | 638.971 us |       0.22% |  -0.938 us |  -0.15% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |  11.257 us |       0.39% |  11.261 us |       0.42% |   0.003 us |   0.03% |  🔵 SAME  |
|   F64   |      I64      |      2^20      |  15.858 us |       5.02% |  15.398 us |       2.34% |  -0.461 us |  -2.91% |  🟢 FAST  |
|   F64   |      I64      |      2^24      |  57.736 us |       1.76% |  56.895 us |       1.98% |  -0.841 us |  -1.46% |  🔵 SAME  |
|   F64   |      I64      |      2^28      | 640.001 us |       0.20% | 638.720 us |       0.22% |  -1.280 us |  -0.20% |  🟢 FAST  |
|   F64   |      I64      |      2^32      |  10.063 ms |       0.31% |  10.072 ms |       0.34% |   8.674 us |   0.09% |  🔵 SAME  |
|   C32   |      I32      |      2^16      |  11.261 us |       1.82% |  11.249 us |       1.26% |  -0.012 us |  -0.11% |  🔵 SAME  |
|   C32   |      I32      |      2^20      |  15.614 us |       4.40% |  15.336 us |       1.36% |  -0.278 us |  -1.78% |  🟢 FAST  |
|   C32   |      I32      |      2^24      |  55.570 us |       1.97% |  54.870 us |       2.23% |  -0.700 us |  -1.26% |  🔵 SAME  |
|   C32   |      I32      |      2^28      | 624.637 us |       0.18% | 622.762 us |       0.21% |  -1.875 us |  -0.30% |  🟢 FAST  |
|   C32   |      I64      |      2^16      |  11.172 us |       2.71% |  11.098 us |       3.48% |  -0.074 us |  -0.66% |  🔵 SAME  |
|   C32   |      I64      |      2^20      |  15.474 us |       3.19% |  15.125 us |       3.42% |  -0.350 us |  -2.26% |  🔵 SAME  |
|   C32   |      I64      |      2^24      |  55.621 us |       1.93% |  54.376 us |       2.21% |  -1.245 us |  -2.24% |  🟢 FAST  |
|   C32   |      I64      |      2^28      | 624.449 us |       0.18% | 622.616 us |       0.20% |  -1.833 us |  -0.29% |  🟢 FAST  |
|   C32   |      I64      |      2^32      |   9.785 ms |       0.17% |   9.795 ms |       0.21% |  10.298 us |   0.11% |  🔵 SAME  |
bench.exclusive_scan.look_ahead.sum (avg %Diff: +0.32%)
['warpspeed_atomic_sm90_rebased_base/B200/lookahead/lookahead.json', 'warpspeed_atomic_sm90_rebased/B200/lookahead/lookahead.json']
# base

## [0] NVIDIA B200

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |      Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-----------|---------|----------|
|   I8    |      I64      |      2^16      |  11.259 us |       0.39% |  11.260 us |       0.45% |  0.001 us |   0.01% |  🔵 SAME  |
|   I8    |      I64      |      2^20      |  13.072 us |       4.39% |  12.914 us |       5.78% | -0.158 us |  -1.21% |  🔵 SAME  |
|   I8    |      I64      |      2^24      |  27.665 us |       0.99% |  27.678 us |       1.00% |  0.012 us |   0.05% |  🔵 SAME  |
|   I8    |      I64      |      2^28      | 212.515 us |       0.49% | 212.561 us |       0.46% |  0.046 us |   0.02% |  🔵 SAME  |
|   I8    |      I64      |      2^32      |   3.234 ms |       0.35% |   3.236 ms |       0.37% |  1.317 us |   0.04% |  🔵 SAME  |
|   I16   |      I64      |      2^16      |  11.183 us |       1.01% |  11.180 us |       1.00% | -0.002 us |  -0.02% |  🔵 SAME  |
|   I16   |      I64      |      2^20      |  13.219 us |       3.03% |  13.196 us |       3.36% | -0.023 us |  -0.17% |  🔵 SAME  |
|   I16   |      I64      |      2^24      |  30.392 us |       3.74% |  30.418 us |       3.47% |  0.027 us |   0.09% |  🔵 SAME  |
|   I16   |      I64      |      2^28      | 211.690 us |       0.53% | 211.633 us |       0.48% | -0.057 us |  -0.03% |  🔵 SAME  |
|   I16   |      I64      |      2^32      |   3.286 ms |       1.42% |   3.283 ms |       1.41% | -3.710 us |  -0.11% |  🔵 SAME  |
|   I32   |      I64      |      2^16      |   9.789 us |       9.01% |  10.232 us |       9.82% |  0.443 us |   4.53% |  🔵 SAME  |
|   I32   |      I64      |      2^20      |  13.157 us |       4.01% |  13.177 us |       4.24% |  0.021 us |   0.16% |  🔵 SAME  |
|   I32   |      I64      |      2^24      |  33.844 us |       3.29% |  33.919 us |       3.74% |  0.075 us |   0.22% |  🔵 SAME  |
|   I32   |      I64      |      2^28      | 322.287 us |       0.52% | 322.230 us |       0.49% | -0.058 us |  -0.02% |  🔵 SAME  |
|   I32   |      I64      |      2^32      |   5.051 ms |       1.04% |   5.049 ms |       1.12% | -2.133 us |  -0.04% |  🔵 SAME  |
|   I64   |      I64      |      2^16      |  11.563 us |       6.26% |  11.867 us |       7.82% |  0.304 us |   2.63% |  🔵 SAME  |
|   I64   |      I64      |      2^20      |  16.508 us |       6.21% |  16.328 us |       6.37% | -0.180 us |  -1.09% |  🔵 SAME  |
|   I64   |      I64      |      2^24      |  55.131 us |       2.38% |  54.966 us |       2.44% | -0.165 us |  -0.30% |  🔵 SAME  |
|   I64   |      I64      |      2^28      | 624.035 us |       0.23% | 635.159 us |       1.60% | 11.124 us |   1.78% |  🔴 SLOW  |
|   I64   |      I64      |      2^32      |  10.335 ms |       0.78% |  10.361 ms |       0.81% | 26.465 us |   0.26% |  🔵 SAME  |
|  I128   |      I64      |      2^16      |  12.799 us |       6.86% |  13.009 us |       5.64% |  0.209 us |   1.64% |  🔵 SAME  |
|  I128   |      I64      |      2^20      |  21.480 us |       1.11% |  21.493 us |       0.55% |  0.014 us |   0.06% |  🔵 SAME  |
|  I128   |      I64      |      2^24      | 146.257 us |       0.89% | 145.696 us |       0.81% | -0.561 us |  -0.38% |  🔵 SAME  |
|  I128   |      I64      |      2^28      |   2.011 ms |       0.20% |   2.017 ms |       0.21% |  5.615 us |   0.28% |  🔴 SLOW  |
|  I128   |      I64      |      2^32      |  31.665 ms |       0.04% |  31.746 ms |       0.04% | 81.617 us |   0.26% |  🔴 SLOW  |
|   F32   |      I64      |      2^16      |  10.720 us |       8.44% |  10.859 us |       7.94% |  0.139 us |   1.30% |  🔵 SAME  |
|   F32   |      I64      |      2^20      |  13.676 us |       6.00% |  13.696 us |       6.17% |  0.020 us |   0.15% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  37.715 us |       3.30% |  37.949 us |       3.42% |  0.234 us |   0.62% |  🔵 SAME  |
|   F32   |      I64      |      2^28      | 317.458 us |       0.44% | 317.606 us |       0.41% |  0.148 us |   0.05% |  🔵 SAME  |
|   F32   |      I64      |      2^32      |   4.873 ms |       0.75% |   4.875 ms |       0.31% |  2.561 us |   0.05% |  🔵 SAME  |
|   F64   |      I64      |      2^16      |  11.262 us |       1.70% |  11.251 us |       0.53% | -0.011 us |  -0.10% |  🔵 SAME  |
|   F64   |      I64      |      2^20      |  15.479 us |       3.62% |  15.497 us |       3.25% |  0.019 us |   0.12% |  🔵 SAME  |
|   F64   |      I64      |      2^24      |  56.859 us |       2.20% |  57.097 us |       2.14% |  0.238 us |   0.42% |  🔵 SAME  |
|   F64   |      I64      |      2^28      | 637.940 us |       0.20% | 638.823 us |       0.20% |  0.882 us |   0.14% |  🔵 SAME  |
|   F64   |      I64      |      2^32      |  10.057 ms |       0.26% |  10.064 ms |       0.27% |  7.057 us |   0.07% |  🔵 SAME  |
|   C32   |      I64      |      2^16      |  11.082 us |       3.97% |  11.134 us |       4.10% |  0.052 us |   0.47% |  🔵 SAME  |
|   C32   |      I64      |      2^20      |  15.219 us |       2.77% |  15.234 us |       2.48% |  0.015 us |   0.10% |  🔵 SAME  |
|   C32   |      I64      |      2^24      |  54.994 us |       2.27% |  55.204 us |       2.15% |  0.210 us |   0.38% |  🔵 SAME  |
|   C32   |      I64      |      2^28      | 622.218 us |       0.21% | 622.562 us |       0.20% |  0.344 us |   0.06% |  🔵 SAME  |
|   C32   |      I64      |      2^32      |   9.778 ms |       0.16% |   9.796 ms |       1.06% | 17.621 us |   0.18% |  🔴 SLOW  |
bench.exclusive_scan.custom (avg %Diff: +0.24%)
['warpspeed_atomic_sm90_rebased_base/B200/custom/custom.json', 'warpspeed_atomic_sm90_rebased/B200/custom/custom.json']
# base

## [0] NVIDIA B200

|  T{ct}  |  OffsetT{ct}  |  Elements{io}  |   Ref Time |   Ref Noise |   Cmp Time |   Cmp Noise |        Diff |   %Diff |  Status  |
|---------|---------------|----------------|------------|-------------|------------|-------------|-------------|---------|----------|
|   I8    |      I32      |      2^16      |  25.661 us |       1.57% |  25.847 us |       2.96% |    0.186 us |   0.73% |  🔵 SAME  |
|   I8    |      I32      |      2^20      |  32.185 us |       6.93% |  33.199 us |       8.64% |    1.014 us |   3.15% |  🔵 SAME  |
|   I8    |      I32      |      2^24      |  96.852 us |       3.50% |  97.677 us |       4.58% |    0.825 us |   0.85% |  🔵 SAME  |
|   I8    |      I32      |      2^28      |   1.000 ms |       0.21% |   1.001 ms |       0.22% |    0.331 us |   0.03% |  🔵 SAME  |
|   I8    |      I64      |      2^16      |  25.921 us |       2.37% |  25.770 us |       2.15% |   -0.151 us |  -0.58% |  🔵 SAME  |
|   I8    |      I64      |      2^20      |  34.364 us |       9.50% |  36.170 us |       9.60% |    1.806 us |   5.26% |  🔵 SAME  |
|   I8    |      I64      |      2^24      |  98.855 us |       5.17% |  99.301 us |       5.35% |    0.446 us |   0.45% |  🔵 SAME  |
|   I8    |      I64      |      2^28      |   1.001 ms |       0.23% |   1.002 ms |       0.24% |    0.623 us |   0.06% |  🔵 SAME  |
|   I8    |      I64      |      2^32      |  15.675 ms |       0.09% |  15.675 ms |       0.09% |    0.360 us |   0.00% |  🔵 SAME  |
|   I16   |      I32      |      2^16      |  11.287 us |       2.27% |  11.348 us |       3.68% |    0.061 us |   0.54% |  🔵 SAME  |
|   I16   |      I32      |      2^20      |  14.401 us |       7.11% |  14.394 us |       7.13% |   -0.007 us |  -0.05% |  🔵 SAME  |
|   I16   |      I32      |      2^24      |  44.436 us |       2.84% |  44.590 us |       2.83% |    0.155 us |   0.35% |  🔵 SAME  |
|   I16   |      I32      |      2^28      | 365.207 us |       0.58% | 367.563 us |       0.59% |    2.357 us |   0.65% |  🔴 SLOW  |
|   I16   |      I64      |      2^16      |  11.312 us |       2.87% |  11.295 us |       2.59% |   -0.017 us |  -0.15% |  🔵 SAME  |
|   I16   |      I64      |      2^20      |  14.438 us |       7.08% |  14.612 us |       6.77% |    0.174 us |   1.21% |  🔵 SAME  |
|   I16   |      I64      |      2^24      |  45.138 us |       2.73% |  45.384 us |       2.65% |    0.246 us |   0.54% |  🔵 SAME  |
|   I16   |      I64      |      2^28      | 377.250 us |       0.71% | 379.231 us |       0.64% |    1.980 us |   0.52% |  🔵 SAME  |
|   I16   |      I64      |      2^32      |   5.678 ms |       0.24% |   5.709 ms |       0.25% |   31.069 us |   0.55% |  🔴 SLOW  |
|   I32   |      I32      |      2^16      |   9.404 us |       6.38% |   9.471 us |       7.21% |    0.066 us |   0.71% |  🔵 SAME  |
|   I32   |      I32      |      2^20      |  13.461 us |       5.65% |  13.522 us |       6.08% |    0.062 us |   0.46% |  🔵 SAME  |
|   I32   |      I32      |      2^24      |  37.417 us |       3.08% |  37.352 us |       3.53% |   -0.065 us |  -0.17% |  🔵 SAME  |
|   I32   |      I32      |      2^28      | 335.757 us |       0.39% | 336.436 us |       0.37% |    0.678 us |   0.20% |  🔵 SAME  |
|   I32   |      I64      |      2^16      |   9.584 us |       8.24% |   9.698 us |       9.01% |    0.115 us |   1.19% |  🔵 SAME  |
|   I32   |      I64      |      2^20      |  13.334 us |       5.59% |  13.394 us |       5.59% |    0.060 us |   0.45% |  🔵 SAME  |
|   I32   |      I64      |      2^24      |  37.435 us |       3.21% |  37.335 us |       3.21% |   -0.101 us |  -0.27% |  🔵 SAME  |
|   I32   |      I64      |      2^28      | 335.939 us |       0.37% | 336.651 us |       0.39% |    0.712 us |   0.21% |  🔵 SAME  |
|   I32   |      I64      |      2^32      |   5.212 ms |       1.03% |   5.222 ms |       0.93% |   10.220 us |   0.20% |  🔵 SAME  |
|   I64   |      I32      |      2^16      |  11.246 us |       1.43% |  11.253 us |       1.12% |    0.006 us |   0.06% |  🔵 SAME  |
|   I64   |      I32      |      2^20      |  15.689 us |       4.95% |  15.982 us |       6.00% |    0.294 us |   1.87% |  🔵 SAME  |
|   I64   |      I32      |      2^24      |  61.542 us |       1.74% |  61.825 us |       1.64% |    0.283 us |   0.46% |  🔵 SAME  |
|   I64   |      I32      |      2^28      | 759.613 us |       0.14% | 761.179 us |       0.15% |    1.565 us |   0.21% |  🔴 SLOW  |
|   I64   |      I64      |      2^16      |  10.914 us |       4.78% |  11.018 us |       4.18% |    0.104 us |   0.96% |  🔵 SAME  |
|   I64   |      I64      |      2^20      |  15.580 us |       5.08% |  15.651 us |       5.10% |    0.071 us |   0.46% |  🔵 SAME  |
|   I64   |      I64      |      2^24      |  61.669 us |       1.53% |  61.859 us |       1.62% |    0.190 us |   0.31% |  🔵 SAME  |
|   I64   |      I64      |      2^28      | 759.370 us |       0.14% | 761.186 us |       0.13% |    1.816 us |   0.24% |  🔴 SLOW  |
|   I64   |      I64      |      2^32      |  11.904 ms |       0.01% |  11.931 ms |       0.01% |   27.789 us |   0.23% |  🔴 SLOW  |
|  I128   |      I32      |      2^16      |  13.078 us |       4.88% |  13.075 us |       5.06% |   -0.003 us |  -0.02% |  🔵 SAME  |
|  I128   |      I32      |      2^20      |  25.058 us |       3.53% |  25.212 us |       3.41% |    0.154 us |   0.61% |  🔵 SAME  |
|  I128   |      I32      |      2^24      | 181.350 us |       0.78% | 181.616 us |       0.74% |    0.265 us |   0.15% |  🔵 SAME  |
|  I128   |      I32      |      2^28      |   2.694 ms |       0.09% |   2.696 ms |       0.09% |    1.119 us |   0.04% |  🔵 SAME  |
|  I128   |      I64      |      2^16      |  13.033 us |       5.35% |  12.992 us |       5.67% |   -0.041 us |  -0.31% |  🔵 SAME  |
|  I128   |      I64      |      2^20      |  25.138 us |       3.58% |  25.249 us |       3.32% |    0.110 us |   0.44% |  🔵 SAME  |
|  I128   |      I64      |      2^24      | 181.435 us |       0.85% | 181.763 us |       0.76% |    0.328 us |   0.18% |  🔵 SAME  |
|  I128   |      I64      |      2^28      |   2.694 ms |       0.09% |   2.696 ms |       0.09% |    1.491 us |   0.06% |  🔵 SAME  |
|  I128   |      I64      |      2^32      |  42.903 ms |       0.02% |  42.941 ms |       0.02% |   37.397 us |   0.09% |  🔴 SLOW  |
|   F32   |      I32      |      2^16      |  11.093 us |       4.94% |  10.991 us |       6.18% |   -0.102 us |  -0.92% |  🔵 SAME  |
|   F32   |      I32      |      2^20      |  13.859 us |       6.67% |  13.972 us |       7.02% |    0.112 us |   0.81% |  🔵 SAME  |
|   F32   |      I32      |      2^24      |  39.168 us |       3.13% |  39.287 us |       3.09% |    0.119 us |   0.30% |  🔵 SAME  |
|   F32   |      I32      |      2^28      | 358.122 us |       0.34% | 359.261 us |       0.35% |    1.139 us |   0.32% |  🔵 SAME  |
|   F32   |      I64      |      2^16      |  10.882 us |       5.82% |  10.825 us |       5.14% |   -0.057 us |  -0.52% |  🔵 SAME  |
|   F32   |      I64      |      2^20      |  13.996 us |       6.87% |  14.217 us |       7.12% |    0.222 us |   1.58% |  🔵 SAME  |
|   F32   |      I64      |      2^24      |  39.448 us |       3.06% |  39.431 us |       3.06% |   -0.017 us |  -0.04% |  🔵 SAME  |
|   F32   |      I64      |      2^28      | 358.475 us |       0.35% | 359.230 us |       0.36% |    0.756 us |   0.21% |  🔵 SAME  |
|   F32   |      I64      |      2^32      |   5.478 ms |       0.48% |   5.489 ms |       0.40% |   10.834 us |   0.20% |  🔵 SAME  |
|   F64   |      I32      |      2^16      |  11.168 us |       3.82% |  11.230 us |       2.11% |    0.062 us |   0.56% |  🔵 SAME  |
|   F64   |      I32      |      2^20      |  15.277 us |       2.58% |  15.115 us |       3.74% |   -0.162 us |  -1.06% |  🔵 SAME  |
|   F64   |      I32      |      2^24      |  61.966 us |       1.48% |  61.220 us |       1.62% |   -0.746 us |  -1.20% |  🔵 SAME  |
|   F64   |      I32      |      2^28      | 761.700 us |       0.15% | 748.388 us |       0.15% |  -13.311 us |  -1.75% |  🟢 FAST  |
|   F64   |      I64      |      2^16      |  10.669 us |       8.69% |  10.900 us |       7.10% |    0.230 us |   2.16% |  🔵 SAME  |
|   F64   |      I64      |      2^20      |  15.154 us |       4.14% |  15.152 us |       3.88% |   -0.002 us |  -0.02% |  🔵 SAME  |
|   F64   |      I64      |      2^24      |  62.009 us |       1.43% |  61.195 us |       1.64% |   -0.814 us |  -1.31% |  🔵 SAME  |
|   F64   |      I64      |      2^28      | 759.378 us |       0.13% | 746.655 us |       0.12% |  -12.723 us |  -1.68% |  🟢 FAST  |
|   F64   |      I64      |      2^32      |  11.938 ms |       0.01% |  11.753 ms |       0.18% | -185.138 us |  -1.55% |  🟢 FAST  |
|   C32   |      I32      |      2^16      | 117.472 us |       2.67% | 117.473 us |       1.87% |    0.002 us |   0.00% |  🔵 SAME  |
|   C32   |      I32      |      2^20      | 191.006 us |       4.79% | 166.919 us |       0.92% |  -24.087 us | -12.61% |  🟢 FAST  |
|   C32   |      I32      |      2^24      |   1.331 ms |       5.24% |   1.398 ms |       5.17% |   66.663 us |   5.01% |  🔵 SAME  |
|   C32   |      I32      |      2^28      |  17.039 ms |       2.65% |  17.923 ms |       3.60% |  883.591 us |   5.19% |  🔴 SLOW  |
|   C32   |      I64      |      2^16      | 117.257 us |       0.94% | 116.674 us |       0.83% |   -0.583 us |  -0.50% |  🔵 SAME  |
|   C32   |      I64      |      2^20      | 192.256 us |       2.33% | 177.821 us |       7.08% |  -14.435 us |  -7.51% |  🟢 FAST  |
|   C32   |      I64      |      2^24      |   1.285 ms |       5.24% |   1.335 ms |       6.00% |   49.980 us |   3.89% |  🔵 SAME  |
|   C32   |      I64      |      2^28      |  17.148 ms |       2.62% |  17.523 ms |       3.64% |  375.019 us |   2.19% |  🔵 SAME  |
|   C32   |      I64      |      2^32      | 268.572 ms |       2.08% | 274.882 ms |       3.03% |    6.310 ms |   2.35% |  🔴 SLOW  |

@github-actions

Copy link
Copy Markdown
Contributor

🥳 CI Workflow Results

🟩 Finished in 2d 15h: Pass: 100%/291 | Total: 12d 00h | Max: 2h 23m | Hits: 19%/976660

See results here.

return error;
}

const int scan_grid_dim = atomic_scheduling ? ::cuda::std::min(sm_count, num_tiles) : num_tiles;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: try using occupancy or higher CTA count per SM if it improves performance.

}

void* d_tile_state = allocations[0];
::cuda::std::uint32_t* d_atomic_counter = static_cast<::cuda::std::uint32_t*>(allocations[1]);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical: add a test checking alignment, as previous implementation doesn't enforce alignment on temporary allocations.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think an assertion should be fine. Each temporary storage allocation is 256 byte aligned.

@@ -1129,7 +1141,7 @@ CUB_RUNTIME_FUNCTION _CCCL_HOST _CCCL_FORCEINLINE cudaError_t invoke_lookahead(
}

// TODO(bgruber): we probably need to ensure alignment of d_temp_storage

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Drop once a test is added, as we already enforce aligned allocation of temporaries above.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be dropped today.

/*size*/ 16,
byteMaskStart);
}
NV_IF_ELSE_TARGET(

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: scalar copy is duplicated in 3 cases here, consider a helper function reducing code duplication.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agreed. I guess with "scalar" you mean the 16-byte masked copy?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes

Comment on lines +296 to +298
(const int rank = squad.threadRank(); if (rank < 16 && ((byteMaskStart >> rank) & 1u)) {
cpAsyncOobInfo.ptrGmemStartAlignDown[rank] = srcSmem[rank];
}));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important: Please put additional braces around the macro arguments:

Suggested change
(const int rank = squad.threadRank(); if (rank < 16 && ((byteMaskStart >> rank) & 1u)) {
cpAsyncOobInfo.ptrGmemStartAlignDown[rank] = srcSmem[rank];
}));
({const int rank = squad.threadRank(); if (rank < 16 && ((byteMaskStart >> rank) & 1u)) {
cpAsyncOobInfo.ptrGmemStartAlignDown[rank] = srcSmem[rank];
}}));

This helps clang-format.

Comment thread cub/cub/device/dispatch/kernels/kernel_scan.cuh

@bernhardmgruber bernhardmgruber left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR looks like it is not only adding a deterministic scan for SM90, but also the non-deterministic version. Please point this out clearly in the PR description and update the PR title.

Otherwise, this is looking pretty good already! Please make sure that the Blackwell kernels are not impacts (no SASS changes on the scan benchmarks for SM100)

Comment on lines +285 to +298
NV_IF_ELSE_TARGET(
NV_PROVIDES_SM_100,
(if (::cuda::ptx::elect_sync(~0)) {
::cuda::ptx::cp_async_bulk_cp_mask(
::cuda::ptx::space_global,
::cuda::ptx::space_shared,
cpAsyncOobInfo.ptrGmemStartAlignDown,
srcSmem,
/*size*/ 16,
byteMaskStart);
}),
(const int rank = squad.threadRank(); if (rank < 16 && ((byteMaskStart >> rank) & 1u)) {
cpAsyncOobInfo.ptrGmemStartAlignDown[rank] = srcSmem[rank];
}));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important question: Since you introduced code paths that access SMEM using regular loads and stores, is the line above:

::cuda::ptx::fence_proxy_async(::cuda::ptx::space_shared);

still valid? We need to acquire SMEM in the async proxy for the bulk copy, but now we are mixing bulk copies and regular loads from SMEM. Is this still legal?

@ahendriksen may be able to help here.

Comment on lines +320 to +324
(const int rank = squad.threadRank();
const ::cuda::std::byte* tail_smem_source = ptrSmemMiddle + cpAsyncOobInfo.underCopySizeBytes;
if (rank < 16 && ((byteMaskEnd >> rank) & 1u)) {
cpAsyncOobInfo.ptrGmemEndAlignDown[rank] = tail_smem_source[rank];
}));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important: we compute the copy masks based on offsets and counts, so it seems counter intuitive to use them for the fallback loops here. We should just use the information we used to create the masks in the first place.

Here, this would be (I think):

Suggested change
(const int rank = squad.threadRank();
const ::cuda::std::byte* tail_smem_source = ptrSmemMiddle + cpAsyncOobInfo.underCopySizeBytes;
if (rank < 16 && ((byteMaskEnd >> rank) & 1u)) {
cpAsyncOobInfo.ptrGmemEndAlignDown[rank] = tail_smem_source[rank];
}));
(const int rank = squad.threadRank();
const ::cuda::std::byte* tail_smem_source = ptrSmemMiddle + cpAsyncOobInfo.underCopySizeBytes;
if (rank < cpAsyncOobInfo.smemEndBytesAfter16BBoundary) {
cpAsyncOobInfo.ptrGmemEndAlignDown[rank] = tail_smem_source[rank];
}));

Applies to the other occurrences of this logic as well.


# pragma unroll 1
while (true)
while (idxTile < numTiles)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question: Are we 100% certain this does not change SASS for any kernel on SM100? Why do we even need this, since we have nextIdxTileValid = static_cast<int>(regNextBlockIdx.x) < numTiles; later to exit the loop?

refNextBlockIdxR.setFenceLdsToAsyncProxy();
}
bool nextIdxTileValid = ::cuda::ptx::clusterlaunchcontrol_query_cancel_is_canceled(regNextBlockIdx);
bool nextIdxTileValid = false;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
bool nextIdxTileValid = false;
bool nextIdxTileValid;

Comment on lines +737 to +746
int idxTile;
NV_IF_ELSE_TARGET(NV_PROVIDES_SM_100, (idxTile = specialRegisters.blockIdxX;), ({
__shared__ int s_first_tile;
if (specialRegisters.threadIdxX == 0)
{
s_first_tile = static_cast<int>(::atomicAdd(params.atomicCounter, 1u));
}
__syncthreads();
idxTile = s_first_tile;
}));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Consider using an IILE (immediately invoked lambda expression) here.

Comment on lines +793 to +797
bool nextIdxTileValid = false;
NV_IF_ELSE_TARGET(
NV_PROVIDES_SM_100,
(nextIdxTileValid = ::cuda::ptx::clusterlaunchcontrol_query_cancel_is_canceled(regNextBlockIdx);),
(nextIdxTileValid = static_cast<int>(regNextBlockIdx.x) < numTiles;));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Consider an IILE here.

}
if (cc >= ::cuda::compute_capability{9, 0} && require_stable_reduction_order)
{
return get_sm100_fallback_lookahead_policy();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important: Please add a TODO comment here that we should tune for Hopper:

Suggested change
return get_sm100_fallback_lookahead_policy();
// TODO(srinivas): tune for Hopper, using Blackwell default tunings for now.
return get_sm100_fallback_lookahead_policy();

}

void* d_tile_state = allocations[0];
::cuda::std::uint32_t* d_atomic_counter = static_cast<::cuda::std::uint32_t*>(allocations[1]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think an assertion should be fine. Each temporary storage allocation is 256 byte aligned.

@@ -1129,7 +1141,7 @@ CUB_RUNTIME_FUNCTION _CCCL_HOST _CCCL_FORCEINLINE cudaError_t invoke_lookahead(
}

// TODO(bgruber): we probably need to ensure alignment of d_temp_storage

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be dropped today.

Comment on lines +1120 to 1123
if (d_temp_storage == nullptr)
{
return cudaSuccess;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important: The check here is correct, but where did the num_items == 0 and early return go? This should be retained.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Review

Development

Successfully merging this pull request may close these issues.

Extend warpspeed run_to_run deterministic implementation to SM90

3 participants