Skip to content

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

Open
srinivasyadav18 wants to merge 8 commits 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 8 commits 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: 09ca662c-6c29-40a4-995e-4bb65322c501

📥 Commits

Reviewing files that changed from the base of the PR and between 669019e and 1c1ae98.

📒 Files selected for processing (2)
  • c/parallel/src/scan.cu
  • cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh
🚧 Files skipped from review as they are similar to previous changes (2)
  • c/parallel/src/scan.cu
  • cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Scan look-ahead now supports more GPU targets, including a fallback scheduling path when newer hardware-specific behavior isn’t available.
    • Internal scan state handling now tracks tile storage and scheduling separately for more robust execution.
  • Bug Fixes

    • Improved bounds checking so look-ahead tile access respects the actual number of tiles.
    • Fixed scan scheduling to avoid out-of-range tile handling and improve stability across device types.

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]

Out-of-scope changes

Code Change Explanation
None

Suggested reviewers: fbusato, shwina, bernhardmgruber


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 on lines +34 to +39
template <typename AccumT>
struct lookahead_tile_state_arg_t
{
warpspeed::tile_state_t<AccumT>* tile_states;
::cuda::std::uint32_t* atomic_counter;
};

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 is going to massively impact performance.

The issue is that with 64 bit types we barely fit into the 16 byte atomic window with the tile state and the perf difference is really significant. With this we are effectively never getting the fast atomics

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.

struct lookahead_tile_state_arg_t

We do not actually modify tile-state but rather lookahead_tile_state_arg_t, which is helper struct to pass arguments to kernel.

I have posted complete performance report below.

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.

@srinivasyadav18 is right, this is just a helper struct for the union that is passed to the tile state setup kernel, so we can use the same kernel symbol between the old and new scan implementation. The struct is only used as a kernel argument. Should be fine.

@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

This comment has been minimized.

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.

Comment thread cub/cub/device/dispatch/dispatch_scan.cuh
Comment thread cub/cub/device/dispatch/dispatch_scan.cuh Outdated
Comment thread cub/cub/detail/warpspeed/squad/load_store.cuh Outdated
Comment thread cub/cub/detail/warpspeed/squad/load_store.cuh Outdated
Comment on lines +34 to +39
template <typename AccumT>
struct lookahead_tile_state_arg_t
{
warpspeed::tile_state_t<AccumT>* tile_states;
::cuda::std::uint32_t* atomic_counter;
};

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.

@srinivasyadav18 is right, this is just a helper struct for the union that is passed to the tile state setup kernel, so we can use the same kernel symbol between the old and new scan implementation. The struct is only used as a kernel argument. Should be fine.

@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.

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, I think its still needed, as we still do bulk async copies for the middle part (aligned portion of data).

Comment thread cub/cub/detail/warpspeed/squad/load_store.cuh Outdated

# 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?

@srinivasyadav18 srinivasyadav18 Jul 7, 2026

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.

while(true) produces bad codegen on SM90, leading to deadlock. Yes, there is some SASS difference, so I re-measured performance on GPUs >= SM90, and there is NO regression because of this.

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.

The status quo increases the SASS of the kernels on SM100 by a lot. Here is a summary from claude:

+96 to +112 instructions each (~4-5% growth)

The opcode histogram reveals the nature of the change:

  • +16 IMAD.WIDE.U32, +5 IMAD.WIDE.U32.X, +5 LEA.HI.X, +5 SHF.R.U64 — these are 64-bit address arithmetic instructions
  • +5 IADD3.X, +5 IMAD.X — extended-precision integer ops
  • +9 ISETP.LE.AND, +5 ISETP.LT.U32.AND/.EX — additional bound checks or comparisons
  • +4 EXIT, -5 BRA — more exit points, fewer branches (code is being duplicated/specialized rather than branching)
  • +3 LDC.64 — more 64-bit constant loads

Even if the measured perf on a benchmark does not show a runtime diff, it's a significant cost in code size (binary size and I-cache pressure).

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 SASS changes go completely away with:

Suggested change
while (idxTile < numTiles)
while ([&] {
NV_IF_ELSE_TARGET(NV_PROVIDES_SM_100, { return true; }, { return idxTile < numTiles; })
}())

Please apply this change.

Comment thread cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh Outdated
Comment thread cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh Outdated
Comment thread cub/cub/device/dispatch/kernels/kernel_scan_lookahead.cuh Outdated
Comment thread cub/cub/device/dispatch/tuning/tuning_scan.cuh
Comment thread cub/cub/device/dispatch/dispatch_scan.cuh
Comment thread cub/cub/device/dispatch/dispatch_scan.cuh Outdated
Comment thread cub/cub/device/dispatch/dispatch_scan.cuh
@copy-pr-bot

copy-pr-bot Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@srinivasyadav18

Copy link
Copy Markdown
Contributor Author

/ok to test fa0e6e7

@github-actions

This comment has been minimized.

@srinivasyadav18

Copy link
Copy Markdown
Contributor Author

/ok to test 669019e

@github-actions

This comment has been minimized.

@srinivasyadav18

Copy link
Copy Markdown
Contributor Author

/ok to test 1c1ae98

@github-actions

This comment has been minimized.

@srinivasyadav18

Copy link
Copy Markdown
Contributor Author

/ok to test 67e93ef

Comment on lines +299 to +300
::cuda::std::conditional_t<(sizeof(AccumT) <= 4), scan_resources_t, scan_resources_t&> res; // this is the only shared
// mutable state

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: I tried this quickly locally and it seems all kernels in cub.bench.scan.exclusive.sum.lookahead.base get shorter if we store scan_resources_t by value. Can you please send this diff:

Suggested change
::cuda::std::conditional_t<(sizeof(AccumT) <= 4), scan_resources_t, scan_resources_t&> res; // this is the only shared
// mutable state
scan_resources_t res; // this is the only shared mutable state

as a separate PR with a benchmark? Thx!

Comment on lines +798 to +804
const bool nextIdxTileValid = [&] {
bool valid = false;
NV_IF_ELSE_TARGET(NV_PROVIDES_SM_100,
(valid = ::cuda::ptx::clusterlaunchcontrol_query_cancel_is_canceled(regNextBlockIdx);),
(valid = static_cast<int>(regNextBlockIdx.x) < numTiles;));
return valid;
}();

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
const bool nextIdxTileValid = [&] {
bool valid = false;
NV_IF_ELSE_TARGET(NV_PROVIDES_SM_100,
(valid = ::cuda::ptx::clusterlaunchcontrol_query_cancel_is_canceled(regNextBlockIdx);),
(valid = static_cast<int>(regNextBlockIdx.x) < numTiles;));
return valid;
}();
const bool nextIdxTileValid = [&] {
NV_IF_ELSE_TARGET(NV_PROVIDES_SM_100,
(return ::cuda::ptx::clusterlaunchcontrol_query_cancel_is_canceled(regNextBlockIdx);),
(return static_cast<int>(regNextBlockIdx.x) < numTiles;));
}();

{
device_scan_init_lookahead_body(tile_state.lookahead, num_tiles);
device_scan_init_lookahead_body(tile_state.lookahead.tile_states, num_tiles);
if (tile_state.lookahead.atomic_counter != nullptr && blockIdx.x == 0 && threadIdx.x == 0)

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.

Remark: I would reorder the condition so only one thread needs to load the value of atomic_counter and check it for nullptr.

Suggested change
if (tile_state.lookahead.atomic_counter != nullptr && blockIdx.x == 0 && threadIdx.x == 0)
if (blockIdx.x == 0 && threadIdx.x == 0 && tile_state.lookahead.atomic_counter != nullptr)

Comment on lines +81 to +85
device_scan_init_lookahead_body(tile_state.lookahead.tile_states, num_tiles);
if (tile_state.lookahead.atomic_counter != nullptr && blockIdx.x == 0 && threadIdx.x == 0)
{
*tile_state.lookahead.atomic_counter = 0;
}

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: it's easy to miss the setup if atomic_counter when only looking at device_scan_init_lookahead_body. I would move the code into device_scan_init_lookahead_body

Comment on lines +82 to +85
if (tile_state.lookahead.atomic_counter != nullptr && blockIdx.x == 0 && threadIdx.x == 0)
{
*tile_state.lookahead.atomic_counter = 0;
}

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: this is only needed when we are not on SM100+ or when StableReductionOrder == true. Please add a StableReductionOrder parameter to DeviceScanInitKernel and add an NV_IF_ELSE_TARGET here.

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

🥳 CI Workflow Results

🟩 Finished in 2h 33m: Pass: 100%/291 | Total: 12d 06h | Max: 2h 32m | Hits: 18%/1046130

See results here.

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