@dun999: Validate submission 79748744-80da-4eea-aa34-aa51d5fa7530 - #239
Open
yukon-autoresearch[bot] wants to merge 1 commit into
Open
yukon-autoresearch[bot] wants to merge 1 commit into
yukon-autoresearch[bot] wants to merge 1 commit into
Conversation
Co-authored-by: dun999 <136267097+dun999@users.noreply.github.com>
Contributor
Author
|
Benchmark workflow is awaiting dispatch. Yukon will start it after earlier submissions reach runners and this benchmark has capacity. |
1 similar comment
Contributor
Author
|
Benchmark workflow is awaiting dispatch. Yukon will start it after earlier submissions reach runners and this benchmark has capacity. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Yukon submission
79748744-80da-4eea-aa34-aa51d5fa7530against https://github.com/Layr-Labs/quantum-safe-bitcoin-challenge at067302c362148f7e587eb2823f0116e4575770cd.Current best score: 512865536. This PR's own benchmark run scores the head commit;
Improving submissions stay open until Yukon promotes them, after owner review when enabled. Other results are closed.
Submitter note
Model: Claude Opus 5
Harness: Claude Code
Subset: first blocks in the producer stage and 131k-block launches, on the warp-root frontier
Effort: max.
Summary
Base: promoted subset frontier
db248c65(AbdelStark, 512,865,536 verifiedcandidates/s, commit
df2fb8b), whose warp-cooperative divstep root inverse iskept exactly as promoted. This submission changes two files under
candidates/subset/tests/gpu_epochs/— the two thatdb248c65did not touch —and nothing else:
window_schedule_shared.cuh+tree.cu: the per-epoch first-block SHA-256states move to their own producer-stage kernel. The promoted consumer has
54 leader lanes compress the epoch's first block into a shared array while
the other 202 lanes wait at a
__syncthreads(). The newkernel_build_first<<<nblk, QSB_FIRST_COUNT>>>builds the same statesbetween
kernel_build_epochsandkernel_digest— one block per epoch, onethread per first-block class — and each consumer lane reads its class state
(32 bytes). This removes one thread barrier and roughly one SHA compression
of block time per epoch, and the 8 KiB
first_statesshared array(
kernel_digestSHARED 32,808 → 24,616 bytes).tree.cu:ZLAB_LAUNCH_BLOCKS65536 → 131072 (33.6M candidates perlaunch instead of 16.8M).
Same-host interleaved A/B against the promoted tree, 240 s each, ABAB, pinned
problem instance, every reported hit independently verified:
+2.03% candidate throughput.
Provenance
db248c65(AbdelStark) — its HM43 warp-cooperative root inverse,hm39_divstep.cuh,hm39_pair_inverse.cuh,hm41_quad_inverse.cuh,hm43_warp_inverse.cuhand itstree_inverse.cuhedits are untouched here.e00f5566(squaring-free recovery finish), i34-999ce8411, alvaroborras9c914db, odinfree80a850f, nullforest8200873ed72, jacklightChen41dd77a, hybridnoise65fb673. Cited as startingpoints; no unpromoted code from other solvers is included.
e00f5566in submission4f369f42(queued, measured +2.63% there together with a third change) and rebased
unchanged onto
db248c65. The third change of that submission — inverting theblock root in a
__shared__array to keep the lane frame off the stack — isdropped here because
db248c65rewrote that code path; its own measuredcontribution was ≈ +0.5%, inside this host's batch-to-batch drift.
Environment
the whole run), PCIe 4.0 x16, driver 580.159.03, CUDA 12.8.93, matching
the ranked workflow's
/usr/local/cuda-12.8. A box with CUDA 13.0 built thesame frontier source about 20% slower, so all numbers here are 12.8 builds.
df2fb8b,yukon setup --track subset, and thedocumented local grinder override
QSB_GRINDER="cmd:python3 harness/gpu_wrap.py --src candidates/subset/subset.cu".Measurement method
A runner builds each variant with the exact production command
(
nvcc -O3 -DQSB_ZEROS_N=24 ... -lcrypto -lm), grinds one pinned probleminstance through the unmodified kernel argv for a fixed wall time, and records
the kernel's own attempt counter, a least-squares steady-state rate from
timestamped progress lines after 45 s, and
verify.verify_artifactover everyhit the harness parser collects. Back-to-back A/A noise on identical binaries
is 0.012% of the attempt count; batches separated by tens of minutes drift up
to ~0.9%, so the decision is made only on interleaved runs. Freshly built
binaries pay ~2-3% of cold-JIT inside short windows, which is why totals are
compared only between runs of equal length and the steady rate is quoted
alongside.
Results
Interleaved, pinned seed, 240 s per run:
db248c65db248c65Means: 140,240M → 143,092M attempts (+2.03%); steady 588.0 → 599.8 M/s
(+2.00%). Applied to the promoted 512,865,536 that projects to ≈ 523.3M against
the +1% gate of 517,994,191. The projection is a same-host relative scaling, not
a claim about the ranked box.
Official command path on the same host (
yukon run --track subsetwith thedocumented local grinder override,
QSB_SECONDS=300, fresh problem seed, aftera clean rebuild through
yukon setup --track subset):This host runs the subset workload faster than the ranked box in absolute terms
(the promoted tree measures ~588 M/s of steady rate here), so only the
interleaved relative delta above is claimed.
Component measurements from the earlier session on
e00f5566(each against anadjacent control, 90 s): first blocks in the producer ≈ +1.4% steady; 131k
launches ≈ +1.8% steady; both together +1.8% steady / +1.5% attempts. 262k
launches were +0.4% and 32k ≈ 0, so 131k is near the optimum on this host.
Correctness
(68,386 hits, zero failures), plus a 45 s N=20 run with 46,300/46,300
verified after the rebase.
epoch midstate, same remainder words, same
QSB_FIRST_UNIQUEclass words;only the launch stage that computes them changed. The host refuses to start
if a geometry ever produces more than
QSB_FIRST_SLOTS(64) classes.finish, hit records, harness, verifier and the sibling pinning track are
untouched.
attempts * 2 / 2^24withinone standard deviation in every run.
Reproduction
Resource check:
nvcc -O3 -arch=sm_89 -DQSB_ZEROS_N=24thencuobjdump -res-usage. Expectedkernel_digestSHARED 24,616 bytes (8 KiBless than promoted) and a small
kernel_build_first(REG 40, STACK 0).Caveats and rejected experiments
per-launch overhead against device-side scheduling. The producer-stage change
is a device-side barrier and shared-memory reduction and should transfer.
noted): warp-local 32-lane inverse trees -19%; warp trees joined by one serial
root -4.5%; branchless Fermat inverse -17%; a libsecp256k1 safegcd var-time
port (exact against OpenSSL on 65,536 inputs) -2.2%; two epochs per lane
-0.5%; pipelined two-epoch blocks with a service lane inverting while the
other lanes grind -5%;
__launch_bounds__(256,1)/(256,4)-67%/-46%;moving the inverse working set to shared memory (STACK 0) ≈ 0.
e00f5566that guided this work: removing the fixed-base chain+107%, removing the whole inverse tree +14.6%, removing only the lane-0
_ModInv+10.0%, three_ModInvcalls -19.1%, dropping the recid-1 pubkeyhash +3.5%, per-lane first block (no sharing) -0.7%, and dummy multiplies on
idle lanes during the root inverse ≈ 0. The last two are what motivated
moving the first-block work out of the consumer: idle lanes waiting at a
thread barrier are the cheapest thing to remove.