From 9ff5c30d0ccc5374d98ae33d9ceddc8b03398929 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Mon, 5 Oct 2026 22:41:37 +0000 Subject: [PATCH] Prover floor patch v2: every trace buffer sized to its padded need (setup keys and shards), the sweep-2 points Co-Authored-By: Claude Fable 5.1 --- .../prover-floor/sp1-gpu-6.8.1-floor.patch | 75 ++++++++++++++++++- tools/prover-floor/pc2-build-server.ps1 | 6 +- tools/prover-floor/pc2-floor-sweep2.ps1 | 65 ++++++++++++++++ tools/prover-floor/points-sweep2.txt | 15 ++-- 4 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 tools/prover-floor/pc2-floor-sweep2.ps1 diff --git a/proving/prover-floor/sp1-gpu-6.8.1-floor.patch b/proving/prover-floor/sp1-gpu-6.8.1-floor.patch index 8a355f920..c66939337 100644 --- a/proving/prover-floor/sp1-gpu-6.8.1-floor.patch +++ b/proving/prover-floor/sp1-gpu-6.8.1-floor.patch @@ -1,8 +1,42 @@ diff --git a/sp1-gpu/crates/jagged_tracegen/src/lib.rs b/sp1-gpu/crates/jagged_tracegen/src/lib.rs -index 579f70a..88bfc79 100644 +index 579f70a..09e73e8 100644 --- a/sp1-gpu/crates/jagged_tracegen/src/lib.rs +++ b/sp1-gpu/crates/jagged_tracegen/src/lib.rs -@@ -494,6 +494,11 @@ async fn allocate_and_initialize_traces( +@@ -481,6 +481,33 @@ async fn device_preprocessed_tracegen>( + named_traces + } + ++/// Igneum prover-floor patch: the dense elements a set of traces will occupy once `generate_jagged_traces` ++/// has laid them out, that is the sum of their buffers padded to the next multiple of 2^log_stacking_height ++/// (the "final padding" step below). Each phase (preprocessed, then main) is padded on its own. ++pub fn padded_trace_elements( ++ traces: &BTreeMap>, ++ log_stacking_height: u32, ++) -> usize { ++ let total: usize = traces ++ .values() ++ .map(|t| match t { ++ Trace::Real(trace) => trace.guts().as_buffer().len(), ++ Trace::Padding(_) => 0, ++ }) ++ .sum(); ++ total.next_multiple_of(1 << log_stacking_height) ++} ++ ++/// Igneum prover-floor patch: the capacity to allocate for a trace set: the exact padded size plus one ++/// stacking height of slack, never more than the prover's `max_trace_size`. `SP1_GPU_FLOOR_EXACT=0` restores ++/// upstream's full-capacity allocation. ++fn floor_capacity(max_trace_size: usize, needed: usize, log_stacking_height: u32) -> usize { ++ if std::env::var("SP1_GPU_FLOOR_EXACT").map(|v| v == "0").unwrap_or(false) { ++ return max_trace_size; ++ } ++ max_trace_size.min(needed + (1 << log_stacking_height)) ++} ++ + async fn allocate_and_initialize_traces( + preprocessed_traces: BTreeMap>, + max_trace_size: usize, +@@ -494,6 +521,11 @@ async fn allocate_and_initialize_traces( let total_gb = total_bytes as f64 / (1 << 30) as f64; tracing::debug!("Allocating {:?} GB of traces", total_gb); @@ -14,7 +48,40 @@ index 579f70a..88bfc79 100644 let mut dense_data: Buffer = Buffer::with_capacity_in(max_trace_size, backend.clone()); let mut col_index: Buffer = -@@ -1002,6 +1007,18 @@ pub async fn full_tracegen>( +@@ -677,9 +709,14 @@ pub async fn setup_tracegen>( + let preprocessed_traces = + device_preprocessed_tracegen(program, host_phase_tracegen, backend).await; + ++ let capacity = floor_capacity( ++ max_trace_size, ++ padded_trace_elements(&preprocessed_traces, log_stacking_height), ++ log_stacking_height, ++ ); + let jagged_traces = allocate_and_initialize_traces( + preprocessed_traces, +- max_trace_size, ++ capacity, + log_stacking_height, + max_log_row_count, + backend, +@@ -984,9 +1021,15 @@ pub async fn full_tracegen>( + + log_chip_stats(machine, &chip_set, &main_traces); + ++ let capacity = floor_capacity( ++ max_trace_size, ++ padded_trace_elements(&preprocessed_traces, log_stacking_height) ++ + padded_trace_elements(&main_traces, log_stacking_height), ++ log_stacking_height, ++ ); + let mut jagged_mle = allocate_and_initialize_traces( + preprocessed_traces, +- max_trace_size, ++ capacity, + log_stacking_height, + max_log_row_count, + backend, +@@ -1002,6 +1045,18 @@ pub async fn full_tracegen>( ) .await; @@ -22,7 +89,7 @@ index 579f70a..88bfc79 100644 + let dense = jagged_mle.dense(); + let (free, total) = sp1_gpu_cudart::cuda_memory_info().unwrap_or((0, 0)); + eprintln!( -+ "FLOOR tracegen used preprocessed_elements={} main_elements={} dense_len={} capacity_elements={max_trace_size} device_used_mib={}", ++ "FLOOR tracegen used preprocessed_elements={} main_elements={} dense_len={} capacity_elements={capacity} max_trace_size={max_trace_size} device_used_mib={}", + dense.preprocessed_offset, + dense.main_size(), + dense.dense.len(), diff --git a/tools/prover-floor/pc2-build-server.ps1 b/tools/prover-floor/pc2-build-server.ps1 index f35e59b27..dd94da4a2 100644 --- a/tools/prover-floor/pc2-build-server.ps1 +++ b/tools/prover-floor/pc2-build-server.ps1 @@ -1,13 +1,13 @@ # Prover floor (5 October 2026): builds sp1-gpu-server 6.8.1 from source with the Igneum floor patch on PC 2 inside # WSL2 Ubuntu-24.04 as root, into /opt/igneum-floor (the live /root/.sp1/bin/sp1-gpu-server and /opt/igneum are # never touched). CPU only: the miners keep mining, the card is not used. Generated by make-build-playbook.sh; -# patch sha256 700173fe2d852a382f050b36437612ea70f9513fa93093e6f86ea72b5e9ebf9b. CUDA_ARCHS=86,89,120 (the 12 GB tier is sm_86 (3060) and sm_89 (4070), the 16 GB tier sm_89 and sm_120; PC 2 runs sm_120; a shipped build lists every target the stock server does: 80, 86, 89, 90, 100, 120). +# patch sha256 08ce05557ee756ff5c302912a0b36910603e67eb786ed58b6529455e0c3b2d52. CUDA_ARCHS=86,89,120 (the 12 GB tier is sm_86 (3060) and sm_89 (4070), the 16 GB tier sm_89 and sm_120; PC 2 runs sm_120; a shipped build lists every target the stock server does: 80, 86, 89, 90, 100, 120). $ErrorActionPreference = 'Continue' function Stamp { (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ') } "RESULT start $(Stamp)" $job = $env:IGNEUM_JOB_DIR; if (-not $job) { $job = Join-Path $env:TEMP 'igneum-floor' }; New-Item -ItemType Directory -Force -Path $job | Out-Null function WslPath($p) { $w = (& wsl.exe -d Ubuntu-24.04 -u root -- wslpath -a ($p -replace '\\', '/') 2>$null); if ($w) { ($w -replace "`0", '').Trim() } else { '/mnt/c' + ($p.Substring(2) -replace '\\', '/') } } -$patchB64 = 'ZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL2phZ2dlZF90cmFjZWdlbi9zcmMvbGliLnJzIGIvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKaW5kZXggNTc5ZjcwYS4uODhiZmM3OSAxMDA2NDQKLS0tIGEvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKQEAgLTQ5NCw2ICs0OTQsMTEgQEAgYXN5bmMgZm4gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogCiAgICAgbGV0IHRvdGFsX2diID0gdG90YWxfYnl0ZXMgYXMgZjY0IC8gKDEgPDwgMzApIGFzIGY2NDsKICAgICB0cmFjaW5nOjpkZWJ1ZyEoIkFsbG9jYXRpbmcgezo/fSBHQiBvZiB0cmFjZXMiLCB0b3RhbF9nYik7CisgICAgaWYgc3RkOjplbnY6OnZhcigiU1AxX0dQVV9GTE9PUl9MT0ciKS5pc19vaygpIHsKKyAgICAgICAgZXByaW50bG4hKAorICAgICAgICAgICAgIkZMT09SIHRyYWNlZ2VuIGFsbG9jIGNhcGFjaXR5X2VsZW1lbnRzPXttYXhfdHJhY2Vfc2l6ZX0gYnl0ZXM9e3RvdGFsX2J5dGVzfSAoe3RvdGFsX2diOi4zfSBHQikiCisgICAgICAgICk7CisgICAgfQogICAgIGxldCBtdXQgZGVuc2VfZGF0YTogQnVmZmVyPEZlbHQsIFRhc2tTY29wZT4gPQogICAgICAgICBCdWZmZXI6OndpdGhfY2FwYWNpdHlfaW4obWF4X3RyYWNlX3NpemUsIGJhY2tlbmQuY2xvbmUoKSk7CiAgICAgbGV0IG11dCBjb2xfaW5kZXg6IEJ1ZmZlcjx1MzIsIFRhc2tTY29wZT4gPQpAQCAtMTAwMiw2ICsxMDA3LDE4IEBAIHB1YiBhc3luYyBmbiBmdWxsX3RyYWNlZ2VuPEE6IEN1ZGFUcmFjZWdlbkFpcjxGZWx0Pj4oCiAgICAgKQogICAgIC5hd2FpdDsKIAorICAgIGlmIHN0ZDo6ZW52Ojp2YXIoIlNQMV9HUFVfRkxPT1JfTE9HIikuaXNfb2soKSB7CisgICAgICAgIGxldCBkZW5zZSA9IGphZ2dlZF9tbGUuZGVuc2UoKTsKKyAgICAgICAgbGV0IChmcmVlLCB0b3RhbCkgPSBzcDFfZ3B1X2N1ZGFydDo6Y3VkYV9tZW1vcnlfaW5mbygpLnVud3JhcF9vcigoMCwgMCkpOworICAgICAgICBlcHJpbnRsbiEoCisgICAgICAgICAgICAiRkxPT1IgdHJhY2VnZW4gdXNlZCBwcmVwcm9jZXNzZWRfZWxlbWVudHM9e30gbWFpbl9lbGVtZW50cz17fSBkZW5zZV9sZW49e30gY2FwYWNpdHlfZWxlbWVudHM9e21heF90cmFjZV9zaXplfSBkZXZpY2VfdXNlZF9taWI9e30iLAorICAgICAgICAgICAgZGVuc2UucHJlcHJvY2Vzc2VkX29mZnNldCwKKyAgICAgICAgICAgIGRlbnNlLm1haW5fc2l6ZSgpLAorICAgICAgICAgICAgZGVuc2UuZGVuc2UubGVuKCksCisgICAgICAgICAgICAodG90YWwgLSBmcmVlKSA+PiAyMAorICAgICAgICApOworICAgIH0KKwogICAgIChwdWJsaWNfdmFsdWVzLCBqYWdnZWRfbWxlLCBjaGlwX3NldCwgcGVybWl0KQogfQogCmRpZmYgLS1naXQgYS9zcDEtZ3B1L2NyYXRlcy9wcm92ZXJfY29tcG9uZW50cy9zcmMvYnVpbGRlci5ycyBiL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzCmluZGV4IDVkY2NkOWQuLjU3NGQ0ZmEgMTAwNjQ0Ci0tLSBhL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzCisrKyBiL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzCkBAIC0yMywyOCArMjMsNzUgQEAgdXNlIGNyYXRlOjp7CiAgICAgU1AxQ3VkYVByb3ZlckNvbXBvbmVudHMsCiB9OwogCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaCAoNSBPY3RvYmVyIDIwMjYpLiBVcHN0cmVhbSBzaXplcyBldmVyeSBkZXZpY2UgYnVmZmVyIGZvciBhIDI0IEdCIGNhcmQgb3IgbGFyZ2VyCisvLy8gYW5kIHBhbmljcyBiZWxvdyB0aGF0LCB3aGF0ZXZlciB0aGUgc2hhcmQuIEhlcmUgdGhlIGNhcmQncyBtZW1vcnkgKG9yIGBTUDFfR1BVX01FTU9SWV9CVURHRVRfR0JgKSBwaWNrcyBhCisvLy8gdGllciwgYW5kIGBTUDFfR1BVX0VMRU1FTlRfVEhSRVNIT0xEYCAvIGBTUDFfR1BVX1JFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OYCBzZXQgdGhlIHR3byBidWZmZXJzIGRpcmVjdGx5LgorLy8vIFRoZSBwcm9vZiBmb3JtYXQsIHRoZSB2ZXJpZmllciBhbmQgdGhlIHByb2dyYW0gaWRzIGRvIG5vdCBjaGFuZ2U6IHRoZSBlbGVtZW50IHRocmVzaG9sZCBvbmx5IGRlY2lkZXMgd2hlcmUKKy8vLyB0aGUgZXhlY3V0b3Igc3BsaXRzIHNoYXJkcywgYXMgdXBzdHJlYW0ncyBvd24gMjQgR0IgdGllciBhbHJlYWR5IGRvZXMuCitmbiBlbnZfdXNpemUobmFtZTogJnN0cikgLT4gT3B0aW9uPHVzaXplPiB7CisgICAgc3RkOjplbnY6OnZhcihuYW1lKS5vaygpLmFuZF90aGVuKHxzfCBzLnBhcnNlOjo8dXNpemU+KCkub2soKSkKK30KKworZm4gZW52X2Y2NChuYW1lOiAmc3RyKSAtPiBPcHRpb248ZjY0PiB7CisgICAgc3RkOjplbnY6OnZhcihuYW1lKS5vaygpLmFuZF90aGVuKHxzfCBzLnBhcnNlOjo8ZjY0PigpLm9rKCkpCit9CisKKy8vLyBUaGUgY29yZSBlbGVtZW50IHRocmVzaG9sZCBmb3IgYSBtZW1vcnkgYnVkZ2V0IGluIEdCICh1cHN0cmVhbSdzIG93biBmaWd1cmUgZm9yIHRoZSBidWRnZXQsICs0LCBhcyBpdAorLy8vIGNvbXB1dGVkIGl0OiBhIDMyIEdCIGNhcmQgaXMgMzYsIGEgMjQgR0IgY2FyZCAyOCwgYSAxNiBHQiBjYXJkIDIwLCBhIDEyIEdCIGNhcmQgMTYpLgorcHViIGZuIGVsZW1lbnRfdGhyZXNob2xkX2Zvcl9idWRnZXQoZ3B1X21lbW9yeV9nYjogdXNpemUsIGZ1bGxfc2l6ZV9zaGFyZHM6IGJvb2wpIC0+IHU2NCB7CisgICAgaWYgZ3B1X21lbW9yeV9nYiA+IDMwIHx8IChmdWxsX3NpemVfc2hhcmRzICYmIGdwdV9tZW1vcnlfZ2IgPj0gMjQpIHsKKyAgICAgICAgRUxFTUVOVF9USFJFU0hPTEQKKyAgICB9IGVsc2UgaWYgZ3B1X21lbW9yeV9nYiA+PSAyNCB7CisgICAgICAgIEVMRU1FTlRfVEhSRVNIT0xEIC0gKDEgPDwgMjYpIC0gKDEgPDwgMjUpIC0gKDEgPDwgMjQpCisgICAgfSBlbHNlIGlmIGdwdV9tZW1vcnlfZ2IgPj0gMTggeworICAgICAgICAoMSA8PCAyNykgKyAoMSA8PCAyNikKKyAgICB9IGVsc2UgeworICAgICAgICAxIDw8IDI3CisgICAgfQorfQorCisvLy8gVGhlIHJlY3Vyc2lvbiB0cmFjZSBhbGxvY2F0aW9uIChlbGVtZW50cykgZm9yIGEgbWVtb3J5IGJ1ZGdldC4KK3B1YiBmbiByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbl9mb3JfYnVkZ2V0KGdwdV9tZW1vcnlfZ2I6IHVzaXplKSAtPiB1c2l6ZSB7CisgICAgaWYgZ3B1X21lbW9yeV9nYiA+PSAyNCB7CisgICAgICAgIFJFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OCisgICAgfSBlbHNlIHsKKyAgICAgICAgUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT04KKyAgICB9Cit9CisKK3B1YiBmbiBncHVfbWVtb3J5X2diKCkgLT4gdXNpemUgeworICAgIGxldCBnYiA9IDEwMjQuMCAqIDEwMjQuMCAqIDEwMjQuMDsKKyAgICBtYXRjaCBlbnZfZjY0KCJTUDFfR1BVX01FTU9SWV9CVURHRVRfR0IiKSB7CisgICAgICAgIFNvbWUoYikgPT4gKGIuY2VpbCgpIGFzIHVzaXplKSArIDQsCisgICAgICAgIE5vbmUgPT4gKCgoY3VkYV9tZW1vcnlfaW5mbygpLnVud3JhcCgpLjEgYXMgZjY0KSAvIGdiKS5jZWlsKCkgYXMgdXNpemUpICsgNCwKKyAgICB9Cit9CisKK3B1YiBmbiByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbigpIC0+IHVzaXplIHsKKyAgICBlbnZfdXNpemUoIlNQMV9HUFVfUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT04iKQorICAgICAgICAudW53cmFwX29yX2Vsc2UofHwgcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb25fZm9yX2J1ZGdldChncHVfbWVtb3J5X2diKCkpKQorfQorCiBwdWIgZm4gbG9jYWxfZ3B1X29wdHMoKSAtPiBTUDFDb3JlT3B0cyB7CiAgICAgbGV0IG11dCBvcHRzID0gU1AxQ29yZU9wdHM6OmRlZmF1bHQoKTsKIAogICAgIGxldCBsb2cyX3NoYXJkX3NpemUgPSAyNDsKICAgICBvcHRzLnNoYXJkX3NpemUgPSAxIDw8IGxvZzJfc2hhcmRfc2l6ZTsKIAotICAgIGxldCBnYiA9IDEwMjQuMCAqIDEwMjQuMCAqIDEwMjQuMDsKLQotICAgIC8vIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSBvbiB0aGUgR1BVLgotICAgIGxldCBncHVfbWVtb3J5X2diOiB1c2l6ZSA9ICgoKGN1ZGFfbWVtb3J5X2luZm8oKS51bndyYXAoKS4xIGFzIGY2NCkgLyBnYikuY2VpbCgpIGFzIHVzaXplKSArIDQ7Ci0KLSAgICBpZiBncHVfbWVtb3J5X2diIDwgMjQgewotICAgICAgICBwYW5pYyEoIlVuc3VwcG9ydGVkIEdQVSBtZW1vcnk6IHtncHVfbWVtb3J5X2difSwgbXVzdCBiZSBhdCBsZWFzdCAyNEdCIik7Ci0gICAgfQorICAgIC8vIFRoZSBjYXJkJ3MgbWVtb3J5IHBsdXMgNCwgYXMgdXBzdHJlYW0gY29tcHV0ZWQgaXQgKGEgMzIgR0IgY2FyZCByZWFkcyAzNiksIG9yIHRoZSBidWRnZXQgZ2l2ZW4uCisgICAgbGV0IGdwdV9tZW1vcnlfZ2IgPSBncHVfbWVtb3J5X2diKCk7CiAKLSAgICBsZXQgc2hhcmRfdGhyZXNob2xkID0gaWYgIW9wdHMuZnVsbF9zaXplX3NoYXJkcyAmJiBncHVfbWVtb3J5X2diIDw9IDMwIHsKLSAgICAgICAgRUxFTUVOVF9USFJFU0hPTEQgLSAoMSA8PCAyNikgLSAoMSA8PCAyNSkgLSAoMSA8PCAyNCkKLSAgICB9IGVsc2UgewotICAgICAgICBFTEVNRU5UX1RIUkVTSE9MRAorICAgIGxldCBzaGFyZF90aHJlc2hvbGQgPSBtYXRjaCBlbnZfdXNpemUoIlNQMV9HUFVfRUxFTUVOVF9USFJFU0hPTEQiKSB7CisgICAgICAgIFNvbWUodCkgPT4gdCBhcyB1NjQsCisgICAgICAgIE5vbmUgPT4gZWxlbWVudF90aHJlc2hvbGRfZm9yX2J1ZGdldChncHVfbWVtb3J5X2diLCBvcHRzLmZ1bGxfc2l6ZV9zaGFyZHMpLAogICAgIH07CisgICAgbGV0IGhlaWdodF90aHJlc2hvbGQgPSBvcHRzLnNoYXJkaW5nX3RocmVzaG9sZC5oZWlnaHRfdGhyZXNob2xkOwogCi0gICAgdHJhY2luZzo6ZGVidWchKCJTaGFyZCB0aHJlc2hvbGQ6IHtzaGFyZF90aHJlc2hvbGR9Iik7CisgICAgZXByaW50bG4hKAorICAgICAgICAiRkxPT1Igb3B0cyBncHVfbWVtb3J5X2diPXtncHVfbWVtb3J5X2difSBlbGVtZW50X3RocmVzaG9sZD17c2hhcmRfdGhyZXNob2xkfSBoZWlnaHRfdGhyZXNob2xkPXtoZWlnaHRfdGhyZXNob2xkfSByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbj17fSBmdWxsX3NpemVfc2hhcmRzPXt9IiwKKyAgICAgICAgcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb24oKSwKKyAgICAgICAgb3B0cy5mdWxsX3NpemVfc2hhcmRzCisgICAgKTsKICAgICBvcHRzLnNoYXJkaW5nX3RocmVzaG9sZC5lbGVtZW50X3RocmVzaG9sZCA9IHNoYXJkX3RocmVzaG9sZDsKIAogICAgIG9wdHMuZ2xvYmFsX2RlcGVuZGVuY2llc19vcHQgPSB0cnVlOwpAQCAtOTIsNyArMTM5LDcgQEAgcHViIGFzeW5jIGZuIHJlY3Vyc2lvbl9wcm92ZXJfYW5kX3ZlcmlmaWVyKAogKSB7CiAgICAgbGV0IHJlY3Vyc2lvbl92ZXJpZmllciA9IFNQMUN1ZGFQcm92ZXJDb21wb25lbnRzOjpjb21wcmVzc192ZXJpZmllcigpOwogICAgICgKLSAgICAgICAgbmV3X2N1ZGFfcHJvdmVyKCZyZWN1cnNpb25fdmVyaWZpZXIsIFJFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OLCA0LCBmYWxzZSwgZmFsc2UsIHNjb3BlKQorICAgICAgICBuZXdfY3VkYV9wcm92ZXIoJnJlY3Vyc2lvbl92ZXJpZmllciwgcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb24oKSwgNCwgZmFsc2UsIGZhbHNlLCBzY29wZSkKICAgICAgICAgICAgIC5hd2FpdCwKICAgICAgICAgcmVjdXJzaW9uX3ZlcmlmaWVyLAogICAgICkKZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL3NlcnZlci9zcmMvc2VydmVyLnJzIGIvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMKaW5kZXggNDAzNWYxZi4uMGQwZDkwNyAxMDA2NDQKLS0tIGEvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMKQEAgLTE1Nyw2ICsxNTcsNyBAQCBpbXBsIFNlcnZlciB7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBsZXQgcGsgPSBDYWNoZWRQcm9ncmFtIHsgZWxmOiBBcmM6Om5ldyhFbGY6OkR5bmFtaWMoZWxmLmludG8oKSkpLCB2azogdmsuY2xvbmUoKSB9OwogICAgICAgICAgICAgICAgIGN0eC5wa19jYWNoZS5pbnNlcnQoZWxmX2hhc2gsIHBrKTsKKyAgICAgICAgICAgICAgICBmbG9vcl9tZW1vcnlfbGluZSgiYWZ0ZXIgc2V0dXAiKTsKICAgICAgICAgICAgICAgICBSZXNwb25zZTo6U2V0dXAgeyBpZDogZWxmX2hhc2gsIHZrIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJlcXVlc3Q6OkRlc3Ryb3kgeyBrZXkgfSA9PiB7CkBAIC0xNzcsMTUgKzE3OCwzMSBAQCBpbXBsIFNlcnZlciB7CiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFNQMUNvbnRleHQ6OmJ1aWxkZXIoKS5wcm9vZl9ub25jZShwcm9vZl9ub25jZSkuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICBtYXRjaCBwcm92ZXIucHJvdmVfd2l0aF9tb2RlKCZjYWNoZWQuZWxmLCBzdGRpbiwgY29udGV4dCwgbW9kZSkuYXdhaXQgeworICAgICAgICAgICAgICAgIGxldCBzdGFydGVkID0gc3RkOjp0aW1lOjpJbnN0YW50Ojpub3coKTsKKyAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBtYXRjaCBwcm92ZXIucHJvdmVfd2l0aF9tb2RlKCZjYWNoZWQuZWxmLCBzdGRpbiwgY29udGV4dCwgbW9kZSkuYXdhaXQgewogICAgICAgICAgICAgICAgICAgICBPayhwcm9vZikgPT4gUmVzcG9uc2U6OlByb29mIHsgcHJvb2YgfSwKICAgICAgICAgICAgICAgICAgICAgRXJyKGUpID0+IFJlc3BvbnNlOjpQcm92ZXJFcnJvcihlLnRvX3N0cmluZygpKSwKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmbG9vcl9tZW1vcnlfbGluZSgmZm9ybWF0ISgiYWZ0ZXIgcHJvdmUgezo/fSBpbiB7Oi4xfSBzIiwgbW9kZSwgc3RhcnRlZC5lbGFwc2VkKCkuYXNfc2Vjc19mNjQoKSkpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKKy8vLyBJZ25ldW0gcHJvdmVyLWZsb29yIHBhdGNoOiB0aGUgZGV2aWNlIG1lbW9yeSBpbiB1c2UgKHRvdGFsIG1pbnVzIGZyZWUsIGFzIHRoZSBkcml2ZXIgcmVwb3J0cyBpdCkgYXQgdGhlCisvLy8gcG9pbnRzIHRoYXQgYm91bmQgYSBwcm9vZiwgc28gYSBydW4ncyBsb2cgY2FycmllcyB0aGUgdGVybXMgb2YgdGhlIHBlYWsgd2l0aG91dCBhIHNhbXBsZXIuCitmbiBmbG9vcl9tZW1vcnlfbGluZSh3aGF0OiAmc3RyKSB7CisgICAgaWYgbGV0IE9rKChmcmVlLCB0b3RhbCkpID0gc3AxX2dwdV9jdWRhcnQ6OmN1ZGFfbWVtb3J5X2luZm8oKSB7CisgICAgICAgIGVwcmludGxuISgKKyAgICAgICAgICAgICJGTE9PUiBtZW1vcnkge3doYXR9OiBkZXZpY2VfdXNlZF9taWI9e30gZnJlZV9taWI9e30gdG90YWxfbWliPXt9IiwKKyAgICAgICAgICAgICh0b3RhbCAtIGZyZWUpID4+IDIwLAorICAgICAgICAgICAgZnJlZSA+PiAyMCwKKyAgICAgICAgICAgIHRvdGFsID4+IDIwCisgICAgICAgICk7CisgICAgfQorfQorCiBmbiBzaGEyNTYoZGF0YTogJlt1OF0pIC0+IFt1ODsgMzJdIHsKICAgICB1c2Ugc2hhMjo6e0RpZ2VzdCwgU2hhMjU2fTsKICAgICBsZXQgbXV0IGhhc2hlciA9IFNoYTI1Njo6bmV3KCk7Cg==' +$patchB64 = 'ZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL2phZ2dlZF90cmFjZWdlbi9zcmMvbGliLnJzIGIvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKaW5kZXggNTc5ZjcwYS4uMDllNzNlOCAxMDA2NDQKLS0tIGEvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvamFnZ2VkX3RyYWNlZ2VuL3NyYy9saWIucnMKQEAgLTQ4MSw2ICs0ODEsMzMgQEAgYXN5bmMgZm4gZGV2aWNlX3ByZXByb2Nlc3NlZF90cmFjZWdlbjxBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogICAgIG5hbWVkX3RyYWNlcwogfQogCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaDogdGhlIGRlbnNlIGVsZW1lbnRzIGEgc2V0IG9mIHRyYWNlcyB3aWxsIG9jY3VweSBvbmNlIGBnZW5lcmF0ZV9qYWdnZWRfdHJhY2VzYAorLy8vIGhhcyBsYWlkIHRoZW0gb3V0LCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhlaXIgYnVmZmVycyBwYWRkZWQgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgMl5sb2dfc3RhY2tpbmdfaGVpZ2h0CisvLy8gKHRoZSAiZmluYWwgcGFkZGluZyIgc3RlcCBiZWxvdykuIEVhY2ggcGhhc2UgKHByZXByb2Nlc3NlZCwgdGhlbiBtYWluKSBpcyBwYWRkZWQgb24gaXRzIG93bi4KK3B1YiBmbiBwYWRkZWRfdHJhY2VfZWxlbWVudHMoCisgICAgdHJhY2VzOiAmQlRyZWVNYXA8U3RyaW5nLCBUcmFjZTxUYXNrU2NvcGU+PiwKKyAgICBsb2dfc3RhY2tpbmdfaGVpZ2h0OiB1MzIsCispIC0+IHVzaXplIHsKKyAgICBsZXQgdG90YWw6IHVzaXplID0gdHJhY2VzCisgICAgICAgIC52YWx1ZXMoKQorICAgICAgICAubWFwKHx0fCBtYXRjaCB0IHsKKyAgICAgICAgICAgIFRyYWNlOjpSZWFsKHRyYWNlKSA9PiB0cmFjZS5ndXRzKCkuYXNfYnVmZmVyKCkubGVuKCksCisgICAgICAgICAgICBUcmFjZTo6UGFkZGluZyhfKSA9PiAwLAorICAgICAgICB9KQorICAgICAgICAuc3VtKCk7CisgICAgdG90YWwubmV4dF9tdWx0aXBsZV9vZigxIDw8IGxvZ19zdGFja2luZ19oZWlnaHQpCit9CisKKy8vLyBJZ25ldW0gcHJvdmVyLWZsb29yIHBhdGNoOiB0aGUgY2FwYWNpdHkgdG8gYWxsb2NhdGUgZm9yIGEgdHJhY2Ugc2V0OiB0aGUgZXhhY3QgcGFkZGVkIHNpemUgcGx1cyBvbmUKKy8vLyBzdGFja2luZyBoZWlnaHQgb2Ygc2xhY2ssIG5ldmVyIG1vcmUgdGhhbiB0aGUgcHJvdmVyJ3MgYG1heF90cmFjZV9zaXplYC4gYFNQMV9HUFVfRkxPT1JfRVhBQ1Q9MGAgcmVzdG9yZXMKKy8vLyB1cHN0cmVhbSdzIGZ1bGwtY2FwYWNpdHkgYWxsb2NhdGlvbi4KK2ZuIGZsb29yX2NhcGFjaXR5KG1heF90cmFjZV9zaXplOiB1c2l6ZSwgbmVlZGVkOiB1c2l6ZSwgbG9nX3N0YWNraW5nX2hlaWdodDogdTMyKSAtPiB1c2l6ZSB7CisgICAgaWYgc3RkOjplbnY6OnZhcigiU1AxX0dQVV9GTE9PUl9FWEFDVCIpLm1hcCh8dnwgdiA9PSAiMCIpLnVud3JhcF9vcihmYWxzZSkgeworICAgICAgICByZXR1cm4gbWF4X3RyYWNlX3NpemU7CisgICAgfQorICAgIG1heF90cmFjZV9zaXplLm1pbihuZWVkZWQgKyAoMSA8PCBsb2dfc3RhY2tpbmdfaGVpZ2h0KSkKK30KKwogYXN5bmMgZm4gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogICAgIHByZXByb2Nlc3NlZF90cmFjZXM6IEJUcmVlTWFwPFN0cmluZywgVHJhY2U8VGFza1Njb3BlPj4sCiAgICAgbWF4X3RyYWNlX3NpemU6IHVzaXplLApAQCAtNDk0LDYgKzUyMSwxMSBAQCBhc3luYyBmbiBhbGxvY2F0ZV9hbmRfaW5pdGlhbGl6ZV90cmFjZXMoCiAKICAgICBsZXQgdG90YWxfZ2IgPSB0b3RhbF9ieXRlcyBhcyBmNjQgLyAoMSA8PCAzMCkgYXMgZjY0OwogICAgIHRyYWNpbmc6OmRlYnVnISgiQWxsb2NhdGluZyB7Oj99IEdCIG9mIHRyYWNlcyIsIHRvdGFsX2diKTsKKyAgICBpZiBzdGQ6OmVudjo6dmFyKCJTUDFfR1BVX0ZMT09SX0xPRyIpLmlzX29rKCkgeworICAgICAgICBlcHJpbnRsbiEoCisgICAgICAgICAgICAiRkxPT1IgdHJhY2VnZW4gYWxsb2MgY2FwYWNpdHlfZWxlbWVudHM9e21heF90cmFjZV9zaXplfSBieXRlcz17dG90YWxfYnl0ZXN9ICh7dG90YWxfZ2I6LjN9IEdCKSIKKyAgICAgICAgKTsKKyAgICB9CiAgICAgbGV0IG11dCBkZW5zZV9kYXRhOiBCdWZmZXI8RmVsdCwgVGFza1Njb3BlPiA9CiAgICAgICAgIEJ1ZmZlcjo6d2l0aF9jYXBhY2l0eV9pbihtYXhfdHJhY2Vfc2l6ZSwgYmFja2VuZC5jbG9uZSgpKTsKICAgICBsZXQgbXV0IGNvbF9pbmRleDogQnVmZmVyPHUzMiwgVGFza1Njb3BlPiA9CkBAIC02NzcsOSArNzA5LDE0IEBAIHB1YiBhc3luYyBmbiBzZXR1cF90cmFjZWdlbjxBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogICAgIGxldCBwcmVwcm9jZXNzZWRfdHJhY2VzID0KICAgICAgICAgZGV2aWNlX3ByZXByb2Nlc3NlZF90cmFjZWdlbihwcm9ncmFtLCBob3N0X3BoYXNlX3RyYWNlZ2VuLCBiYWNrZW5kKS5hd2FpdDsKIAorICAgIGxldCBjYXBhY2l0eSA9IGZsb29yX2NhcGFjaXR5KAorICAgICAgICBtYXhfdHJhY2Vfc2l6ZSwKKyAgICAgICAgcGFkZGVkX3RyYWNlX2VsZW1lbnRzKCZwcmVwcm9jZXNzZWRfdHJhY2VzLCBsb2dfc3RhY2tpbmdfaGVpZ2h0KSwKKyAgICAgICAgbG9nX3N0YWNraW5nX2hlaWdodCwKKyAgICApOwogICAgIGxldCBqYWdnZWRfdHJhY2VzID0gYWxsb2NhdGVfYW5kX2luaXRpYWxpemVfdHJhY2VzKAogICAgICAgICBwcmVwcm9jZXNzZWRfdHJhY2VzLAotICAgICAgICBtYXhfdHJhY2Vfc2l6ZSwKKyAgICAgICAgY2FwYWNpdHksCiAgICAgICAgIGxvZ19zdGFja2luZ19oZWlnaHQsCiAgICAgICAgIG1heF9sb2dfcm93X2NvdW50LAogICAgICAgICBiYWNrZW5kLApAQCAtOTg0LDkgKzEwMjEsMTUgQEAgcHViIGFzeW5jIGZuIGZ1bGxfdHJhY2VnZW48QTogQ3VkYVRyYWNlZ2VuQWlyPEZlbHQ+PigKIAogICAgIGxvZ19jaGlwX3N0YXRzKG1hY2hpbmUsICZjaGlwX3NldCwgJm1haW5fdHJhY2VzKTsKIAorICAgIGxldCBjYXBhY2l0eSA9IGZsb29yX2NhcGFjaXR5KAorICAgICAgICBtYXhfdHJhY2Vfc2l6ZSwKKyAgICAgICAgcGFkZGVkX3RyYWNlX2VsZW1lbnRzKCZwcmVwcm9jZXNzZWRfdHJhY2VzLCBsb2dfc3RhY2tpbmdfaGVpZ2h0KQorICAgICAgICAgICAgKyBwYWRkZWRfdHJhY2VfZWxlbWVudHMoJm1haW5fdHJhY2VzLCBsb2dfc3RhY2tpbmdfaGVpZ2h0KSwKKyAgICAgICAgbG9nX3N0YWNraW5nX2hlaWdodCwKKyAgICApOwogICAgIGxldCBtdXQgamFnZ2VkX21sZSA9IGFsbG9jYXRlX2FuZF9pbml0aWFsaXplX3RyYWNlcygKICAgICAgICAgcHJlcHJvY2Vzc2VkX3RyYWNlcywKLSAgICAgICAgbWF4X3RyYWNlX3NpemUsCisgICAgICAgIGNhcGFjaXR5LAogICAgICAgICBsb2dfc3RhY2tpbmdfaGVpZ2h0LAogICAgICAgICBtYXhfbG9nX3Jvd19jb3VudCwKICAgICAgICAgYmFja2VuZCwKQEAgLTEwMDIsNiArMTA0NSwxOCBAQCBwdWIgYXN5bmMgZm4gZnVsbF90cmFjZWdlbjxBOiBDdWRhVHJhY2VnZW5BaXI8RmVsdD4+KAogICAgICkKICAgICAuYXdhaXQ7CiAKKyAgICBpZiBzdGQ6OmVudjo6dmFyKCJTUDFfR1BVX0ZMT09SX0xPRyIpLmlzX29rKCkgeworICAgICAgICBsZXQgZGVuc2UgPSBqYWdnZWRfbWxlLmRlbnNlKCk7CisgICAgICAgIGxldCAoZnJlZSwgdG90YWwpID0gc3AxX2dwdV9jdWRhcnQ6OmN1ZGFfbWVtb3J5X2luZm8oKS51bndyYXBfb3IoKDAsIDApKTsKKyAgICAgICAgZXByaW50bG4hKAorICAgICAgICAgICAgIkZMT09SIHRyYWNlZ2VuIHVzZWQgcHJlcHJvY2Vzc2VkX2VsZW1lbnRzPXt9IG1haW5fZWxlbWVudHM9e30gZGVuc2VfbGVuPXt9IGNhcGFjaXR5X2VsZW1lbnRzPXtjYXBhY2l0eX0gbWF4X3RyYWNlX3NpemU9e21heF90cmFjZV9zaXplfSBkZXZpY2VfdXNlZF9taWI9e30iLAorICAgICAgICAgICAgZGVuc2UucHJlcHJvY2Vzc2VkX29mZnNldCwKKyAgICAgICAgICAgIGRlbnNlLm1haW5fc2l6ZSgpLAorICAgICAgICAgICAgZGVuc2UuZGVuc2UubGVuKCksCisgICAgICAgICAgICAodG90YWwgLSBmcmVlKSA+PiAyMAorICAgICAgICApOworICAgIH0KKwogICAgIChwdWJsaWNfdmFsdWVzLCBqYWdnZWRfbWxlLCBjaGlwX3NldCwgcGVybWl0KQogfQogCmRpZmYgLS1naXQgYS9zcDEtZ3B1L2NyYXRlcy9wcm92ZXJfY29tcG9uZW50cy9zcmMvYnVpbGRlci5ycyBiL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzCmluZGV4IDVkY2NkOWQuLjU3NGQ0ZmEgMTAwNjQ0Ci0tLSBhL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzCisrKyBiL3NwMS1ncHUvY3JhdGVzL3Byb3Zlcl9jb21wb25lbnRzL3NyYy9idWlsZGVyLnJzCkBAIC0yMywyOCArMjMsNzUgQEAgdXNlIGNyYXRlOjp7CiAgICAgU1AxQ3VkYVByb3ZlckNvbXBvbmVudHMsCiB9OwogCisvLy8gSWduZXVtIHByb3Zlci1mbG9vciBwYXRjaCAoNSBPY3RvYmVyIDIwMjYpLiBVcHN0cmVhbSBzaXplcyBldmVyeSBkZXZpY2UgYnVmZmVyIGZvciBhIDI0IEdCIGNhcmQgb3IgbGFyZ2VyCisvLy8gYW5kIHBhbmljcyBiZWxvdyB0aGF0LCB3aGF0ZXZlciB0aGUgc2hhcmQuIEhlcmUgdGhlIGNhcmQncyBtZW1vcnkgKG9yIGBTUDFfR1BVX01FTU9SWV9CVURHRVRfR0JgKSBwaWNrcyBhCisvLy8gdGllciwgYW5kIGBTUDFfR1BVX0VMRU1FTlRfVEhSRVNIT0xEYCAvIGBTUDFfR1BVX1JFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OYCBzZXQgdGhlIHR3byBidWZmZXJzIGRpcmVjdGx5LgorLy8vIFRoZSBwcm9vZiBmb3JtYXQsIHRoZSB2ZXJpZmllciBhbmQgdGhlIHByb2dyYW0gaWRzIGRvIG5vdCBjaGFuZ2U6IHRoZSBlbGVtZW50IHRocmVzaG9sZCBvbmx5IGRlY2lkZXMgd2hlcmUKKy8vLyB0aGUgZXhlY3V0b3Igc3BsaXRzIHNoYXJkcywgYXMgdXBzdHJlYW0ncyBvd24gMjQgR0IgdGllciBhbHJlYWR5IGRvZXMuCitmbiBlbnZfdXNpemUobmFtZTogJnN0cikgLT4gT3B0aW9uPHVzaXplPiB7CisgICAgc3RkOjplbnY6OnZhcihuYW1lKS5vaygpLmFuZF90aGVuKHxzfCBzLnBhcnNlOjo8dXNpemU+KCkub2soKSkKK30KKworZm4gZW52X2Y2NChuYW1lOiAmc3RyKSAtPiBPcHRpb248ZjY0PiB7CisgICAgc3RkOjplbnY6OnZhcihuYW1lKS5vaygpLmFuZF90aGVuKHxzfCBzLnBhcnNlOjo8ZjY0PigpLm9rKCkpCit9CisKKy8vLyBUaGUgY29yZSBlbGVtZW50IHRocmVzaG9sZCBmb3IgYSBtZW1vcnkgYnVkZ2V0IGluIEdCICh1cHN0cmVhbSdzIG93biBmaWd1cmUgZm9yIHRoZSBidWRnZXQsICs0LCBhcyBpdAorLy8vIGNvbXB1dGVkIGl0OiBhIDMyIEdCIGNhcmQgaXMgMzYsIGEgMjQgR0IgY2FyZCAyOCwgYSAxNiBHQiBjYXJkIDIwLCBhIDEyIEdCIGNhcmQgMTYpLgorcHViIGZuIGVsZW1lbnRfdGhyZXNob2xkX2Zvcl9idWRnZXQoZ3B1X21lbW9yeV9nYjogdXNpemUsIGZ1bGxfc2l6ZV9zaGFyZHM6IGJvb2wpIC0+IHU2NCB7CisgICAgaWYgZ3B1X21lbW9yeV9nYiA+IDMwIHx8IChmdWxsX3NpemVfc2hhcmRzICYmIGdwdV9tZW1vcnlfZ2IgPj0gMjQpIHsKKyAgICAgICAgRUxFTUVOVF9USFJFU0hPTEQKKyAgICB9IGVsc2UgaWYgZ3B1X21lbW9yeV9nYiA+PSAyNCB7CisgICAgICAgIEVMRU1FTlRfVEhSRVNIT0xEIC0gKDEgPDwgMjYpIC0gKDEgPDwgMjUpIC0gKDEgPDwgMjQpCisgICAgfSBlbHNlIGlmIGdwdV9tZW1vcnlfZ2IgPj0gMTggeworICAgICAgICAoMSA8PCAyNykgKyAoMSA8PCAyNikKKyAgICB9IGVsc2UgeworICAgICAgICAxIDw8IDI3CisgICAgfQorfQorCisvLy8gVGhlIHJlY3Vyc2lvbiB0cmFjZSBhbGxvY2F0aW9uIChlbGVtZW50cykgZm9yIGEgbWVtb3J5IGJ1ZGdldC4KK3B1YiBmbiByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbl9mb3JfYnVkZ2V0KGdwdV9tZW1vcnlfZ2I6IHVzaXplKSAtPiB1c2l6ZSB7CisgICAgaWYgZ3B1X21lbW9yeV9nYiA+PSAyNCB7CisgICAgICAgIFJFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OCisgICAgfSBlbHNlIHsKKyAgICAgICAgUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT04KKyAgICB9Cit9CisKK3B1YiBmbiBncHVfbWVtb3J5X2diKCkgLT4gdXNpemUgeworICAgIGxldCBnYiA9IDEwMjQuMCAqIDEwMjQuMCAqIDEwMjQuMDsKKyAgICBtYXRjaCBlbnZfZjY0KCJTUDFfR1BVX01FTU9SWV9CVURHRVRfR0IiKSB7CisgICAgICAgIFNvbWUoYikgPT4gKGIuY2VpbCgpIGFzIHVzaXplKSArIDQsCisgICAgICAgIE5vbmUgPT4gKCgoY3VkYV9tZW1vcnlfaW5mbygpLnVud3JhcCgpLjEgYXMgZjY0KSAvIGdiKS5jZWlsKCkgYXMgdXNpemUpICsgNCwKKyAgICB9Cit9CisKK3B1YiBmbiByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbigpIC0+IHVzaXplIHsKKyAgICBlbnZfdXNpemUoIlNQMV9HUFVfUkVDVVJTSU9OX1RSQUNFX0FMTE9DQVRJT04iKQorICAgICAgICAudW53cmFwX29yX2Vsc2UofHwgcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb25fZm9yX2J1ZGdldChncHVfbWVtb3J5X2diKCkpKQorfQorCiBwdWIgZm4gbG9jYWxfZ3B1X29wdHMoKSAtPiBTUDFDb3JlT3B0cyB7CiAgICAgbGV0IG11dCBvcHRzID0gU1AxQ29yZU9wdHM6OmRlZmF1bHQoKTsKIAogICAgIGxldCBsb2cyX3NoYXJkX3NpemUgPSAyNDsKICAgICBvcHRzLnNoYXJkX3NpemUgPSAxIDw8IGxvZzJfc2hhcmRfc2l6ZTsKIAotICAgIGxldCBnYiA9IDEwMjQuMCAqIDEwMjQuMCAqIDEwMjQuMDsKLQotICAgIC8vIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSBvbiB0aGUgR1BVLgotICAgIGxldCBncHVfbWVtb3J5X2diOiB1c2l6ZSA9ICgoKGN1ZGFfbWVtb3J5X2luZm8oKS51bndyYXAoKS4xIGFzIGY2NCkgLyBnYikuY2VpbCgpIGFzIHVzaXplKSArIDQ7Ci0KLSAgICBpZiBncHVfbWVtb3J5X2diIDwgMjQgewotICAgICAgICBwYW5pYyEoIlVuc3VwcG9ydGVkIEdQVSBtZW1vcnk6IHtncHVfbWVtb3J5X2difSwgbXVzdCBiZSBhdCBsZWFzdCAyNEdCIik7Ci0gICAgfQorICAgIC8vIFRoZSBjYXJkJ3MgbWVtb3J5IHBsdXMgNCwgYXMgdXBzdHJlYW0gY29tcHV0ZWQgaXQgKGEgMzIgR0IgY2FyZCByZWFkcyAzNiksIG9yIHRoZSBidWRnZXQgZ2l2ZW4uCisgICAgbGV0IGdwdV9tZW1vcnlfZ2IgPSBncHVfbWVtb3J5X2diKCk7CiAKLSAgICBsZXQgc2hhcmRfdGhyZXNob2xkID0gaWYgIW9wdHMuZnVsbF9zaXplX3NoYXJkcyAmJiBncHVfbWVtb3J5X2diIDw9IDMwIHsKLSAgICAgICAgRUxFTUVOVF9USFJFU0hPTEQgLSAoMSA8PCAyNikgLSAoMSA8PCAyNSkgLSAoMSA8PCAyNCkKLSAgICB9IGVsc2UgewotICAgICAgICBFTEVNRU5UX1RIUkVTSE9MRAorICAgIGxldCBzaGFyZF90aHJlc2hvbGQgPSBtYXRjaCBlbnZfdXNpemUoIlNQMV9HUFVfRUxFTUVOVF9USFJFU0hPTEQiKSB7CisgICAgICAgIFNvbWUodCkgPT4gdCBhcyB1NjQsCisgICAgICAgIE5vbmUgPT4gZWxlbWVudF90aHJlc2hvbGRfZm9yX2J1ZGdldChncHVfbWVtb3J5X2diLCBvcHRzLmZ1bGxfc2l6ZV9zaGFyZHMpLAogICAgIH07CisgICAgbGV0IGhlaWdodF90aHJlc2hvbGQgPSBvcHRzLnNoYXJkaW5nX3RocmVzaG9sZC5oZWlnaHRfdGhyZXNob2xkOwogCi0gICAgdHJhY2luZzo6ZGVidWchKCJTaGFyZCB0aHJlc2hvbGQ6IHtzaGFyZF90aHJlc2hvbGR9Iik7CisgICAgZXByaW50bG4hKAorICAgICAgICAiRkxPT1Igb3B0cyBncHVfbWVtb3J5X2diPXtncHVfbWVtb3J5X2difSBlbGVtZW50X3RocmVzaG9sZD17c2hhcmRfdGhyZXNob2xkfSBoZWlnaHRfdGhyZXNob2xkPXtoZWlnaHRfdGhyZXNob2xkfSByZWN1cnNpb25fdHJhY2VfYWxsb2NhdGlvbj17fSBmdWxsX3NpemVfc2hhcmRzPXt9IiwKKyAgICAgICAgcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb24oKSwKKyAgICAgICAgb3B0cy5mdWxsX3NpemVfc2hhcmRzCisgICAgKTsKICAgICBvcHRzLnNoYXJkaW5nX3RocmVzaG9sZC5lbGVtZW50X3RocmVzaG9sZCA9IHNoYXJkX3RocmVzaG9sZDsKIAogICAgIG9wdHMuZ2xvYmFsX2RlcGVuZGVuY2llc19vcHQgPSB0cnVlOwpAQCAtOTIsNyArMTM5LDcgQEAgcHViIGFzeW5jIGZuIHJlY3Vyc2lvbl9wcm92ZXJfYW5kX3ZlcmlmaWVyKAogKSB7CiAgICAgbGV0IHJlY3Vyc2lvbl92ZXJpZmllciA9IFNQMUN1ZGFQcm92ZXJDb21wb25lbnRzOjpjb21wcmVzc192ZXJpZmllcigpOwogICAgICgKLSAgICAgICAgbmV3X2N1ZGFfcHJvdmVyKCZyZWN1cnNpb25fdmVyaWZpZXIsIFJFQ1VSU0lPTl9UUkFDRV9BTExPQ0FUSU9OLCA0LCBmYWxzZSwgZmFsc2UsIHNjb3BlKQorICAgICAgICBuZXdfY3VkYV9wcm92ZXIoJnJlY3Vyc2lvbl92ZXJpZmllciwgcmVjdXJzaW9uX3RyYWNlX2FsbG9jYXRpb24oKSwgNCwgZmFsc2UsIGZhbHNlLCBzY29wZSkKICAgICAgICAgICAgIC5hd2FpdCwKICAgICAgICAgcmVjdXJzaW9uX3ZlcmlmaWVyLAogICAgICkKZGlmZiAtLWdpdCBhL3NwMS1ncHUvY3JhdGVzL3NlcnZlci9zcmMvc2VydmVyLnJzIGIvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMKaW5kZXggNDAzNWYxZi4uMGQwZDkwNyAxMDA2NDQKLS0tIGEvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMKKysrIGIvc3AxLWdwdS9jcmF0ZXMvc2VydmVyL3NyYy9zZXJ2ZXIucnMKQEAgLTE1Nyw2ICsxNTcsNyBAQCBpbXBsIFNlcnZlciB7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBsZXQgcGsgPSBDYWNoZWRQcm9ncmFtIHsgZWxmOiBBcmM6Om5ldyhFbGY6OkR5bmFtaWMoZWxmLmludG8oKSkpLCB2azogdmsuY2xvbmUoKSB9OwogICAgICAgICAgICAgICAgIGN0eC5wa19jYWNoZS5pbnNlcnQoZWxmX2hhc2gsIHBrKTsKKyAgICAgICAgICAgICAgICBmbG9vcl9tZW1vcnlfbGluZSgiYWZ0ZXIgc2V0dXAiKTsKICAgICAgICAgICAgICAgICBSZXNwb25zZTo6U2V0dXAgeyBpZDogZWxmX2hhc2gsIHZrIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJlcXVlc3Q6OkRlc3Ryb3kgeyBrZXkgfSA9PiB7CkBAIC0xNzcsMTUgKzE3OCwzMSBAQCBpbXBsIFNlcnZlciB7CiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFNQMUNvbnRleHQ6OmJ1aWxkZXIoKS5wcm9vZl9ub25jZShwcm9vZl9ub25jZSkuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICBtYXRjaCBwcm92ZXIucHJvdmVfd2l0aF9tb2RlKCZjYWNoZWQuZWxmLCBzdGRpbiwgY29udGV4dCwgbW9kZSkuYXdhaXQgeworICAgICAgICAgICAgICAgIGxldCBzdGFydGVkID0gc3RkOjp0aW1lOjpJbnN0YW50Ojpub3coKTsKKyAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBtYXRjaCBwcm92ZXIucHJvdmVfd2l0aF9tb2RlKCZjYWNoZWQuZWxmLCBzdGRpbiwgY29udGV4dCwgbW9kZSkuYXdhaXQgewogICAgICAgICAgICAgICAgICAgICBPayhwcm9vZikgPT4gUmVzcG9uc2U6OlByb29mIHsgcHJvb2YgfSwKICAgICAgICAgICAgICAgICAgICAgRXJyKGUpID0+IFJlc3BvbnNlOjpQcm92ZXJFcnJvcihlLnRvX3N0cmluZygpKSwKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmbG9vcl9tZW1vcnlfbGluZSgmZm9ybWF0ISgiYWZ0ZXIgcHJvdmUgezo/fSBpbiB7Oi4xfSBzIiwgbW9kZSwgc3RhcnRlZC5lbGFwc2VkKCkuYXNfc2Vjc19mNjQoKSkpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKKy8vLyBJZ25ldW0gcHJvdmVyLWZsb29yIHBhdGNoOiB0aGUgZGV2aWNlIG1lbW9yeSBpbiB1c2UgKHRvdGFsIG1pbnVzIGZyZWUsIGFzIHRoZSBkcml2ZXIgcmVwb3J0cyBpdCkgYXQgdGhlCisvLy8gcG9pbnRzIHRoYXQgYm91bmQgYSBwcm9vZiwgc28gYSBydW4ncyBsb2cgY2FycmllcyB0aGUgdGVybXMgb2YgdGhlIHBlYWsgd2l0aG91dCBhIHNhbXBsZXIuCitmbiBmbG9vcl9tZW1vcnlfbGluZSh3aGF0OiAmc3RyKSB7CisgICAgaWYgbGV0IE9rKChmcmVlLCB0b3RhbCkpID0gc3AxX2dwdV9jdWRhcnQ6OmN1ZGFfbWVtb3J5X2luZm8oKSB7CisgICAgICAgIGVwcmludGxuISgKKyAgICAgICAgICAgICJGTE9PUiBtZW1vcnkge3doYXR9OiBkZXZpY2VfdXNlZF9taWI9e30gZnJlZV9taWI9e30gdG90YWxfbWliPXt9IiwKKyAgICAgICAgICAgICh0b3RhbCAtIGZyZWUpID4+IDIwLAorICAgICAgICAgICAgZnJlZSA+PiAyMCwKKyAgICAgICAgICAgIHRvdGFsID4+IDIwCisgICAgICAgICk7CisgICAgfQorfQorCiBmbiBzaGEyNTYoZGF0YTogJlt1OF0pIC0+IFt1ODsgMzJdIHsKICAgICB1c2Ugc2hhMjo6e0RpZ2VzdCwgU2hhMjU2fTsKICAgICBsZXQgbXV0IGhhc2hlciA9IFNoYTI1Njo6bmV3KCk7Cg==' [IO.File]::WriteAllBytes((Join-Path $job 'floor.patch'), [Convert]::FromBase64String($patchB64)) $patchW = WslPath (Join-Path $job 'floor.patch') $bash = @' @@ -19,7 +19,7 @@ export CUDA_PATH="$CUDA_DIR" CUDACXX="$CUDA_DIR/bin/nvcc" PATH="$CUDA_DIR/bin:$P stamp() { date -u +%Y-%m-%dT%H:%M:%SZ; } FLOOR=/opt/igneum-floor; SRC=$FLOOR/sp1; mkdir -p $FLOOR/bin $FLOOR/home/.sp1/bin $FLOOR/logs PATCH="PATCH_PATH_PLACEHOLDER" -echo "RESULT patch_sha256 $(sha256sum "$PATCH" | cut -c1-64) expected 700173fe2d852a382f050b36437612ea70f9513fa93093e6f86ea72b5e9ebf9b" +echo "RESULT patch_sha256 $(sha256sum "$PATCH" | cut -c1-64) expected 08ce05557ee756ff5c302912a0b36910603e67eb786ed58b6529455e0c3b2d52" echo "RESULT toolchain nvcc=$(nvcc --version | grep -o 'release [0-9.]*') cargo=$(cargo --version) go=$(go version 2>/dev/null || echo MISSING) protoc=$(protoc --version 2>/dev/null || echo MISSING) cmake=$(cmake --version 2>/dev/null | head -1 || echo MISSING) nproc=$(nproc) disk_avail=$(df -BG /opt | awk 'NR==2 {print $4}')" if [ ! -d "$SRC/.git" ]; then echo "STAGE clone $(stamp)" diff --git a/tools/prover-floor/pc2-floor-sweep2.ps1 b/tools/prover-floor/pc2-floor-sweep2.ps1 new file mode 100644 index 000000000..485e0f5c7 --- /dev/null +++ b/tools/prover-floor/pc2-floor-sweep2.ps1 @@ -0,0 +1,65 @@ +# Prover floor (5 October 2026): the peak GPU memory and the time of one compressed shard proof through the PATCHED +# sp1-gpu-server (/opt/igneum-floor/home/.sp1/bin, reached by HOME=/opt/igneum-floor/home: the SDK spawns the +# server it finds under $HOME/.sp1/bin, sp1-cuda-6.8.1/src/server.rs) on PC 2's RTX 5090, the miners STOPPED by the +# job (--stop-miners) and the live prover switched off for the run (its server would otherwise own the socket). +# Every point: every server killed and its socket unlinked, a 1-s nvidia-smi sampler, one `--mode compressed +# --shard 0` of the pv1 host (/opt/igneum-pv1, the UNPATCHED SDK and verifier: its VERIFIED is the unpatched +# verifier's word on the patched server's proof), the peak, the time, the FLOOR lines the server prints. +# The point list comes from the FLOOR_POINTS environment the job carries, else the default sweep below. +$ErrorActionPreference = 'Continue' +$urlFile = if ($env:IGNEUM_APP_DIR) { Join-Path $env:IGNEUM_APP_DIR 'app.url' } else { Join-Path $env:LOCALAPPDATA 'igneum\app\app.url' } +if (-not (Test-Path $urlFile)) { $urlFile = Join-Path $env:LOCALAPPDATA 'igneum\app\app.url' } +$base = (Get-Content $urlFile -Raw).Trim().TrimEnd('/') +function Stamp { (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ') } +function Prove($on) { try { (Invoke-RestMethod -Method Post -Uri "$base/api/prove" -ContentType 'application/json' -Body (@{on=$on} | ConvertTo-Json -Compress) -TimeoutSec 10) | ConvertTo-Json -Compress } catch { "error: $_" } } +"RESULT start $(Stamp) prover off for the run: $(Prove $false)" +Start-Sleep -Seconds 45 +"RESULT gpus $(Stamp) $((& nvidia-smi --query-gpu=index,name,memory.used,memory.total,utilization.gpu,power.draw --format=csv,noheader,nounits 2>$null) -join ' | ')" +$job = $env:IGNEUM_JOB_DIR; if (-not $job) { $job = Join-Path $env:TEMP 'igneum-floor-measure' }; New-Item -ItemType Directory -Force -Path $job | Out-Null +function WslPath($p) { $w = (& wsl.exe -d Ubuntu-24.04 -u root -- wslpath -a ($p -replace '\\', '/') 2>$null); if ($w) { ($w -replace "`0", '').Trim() } else { '/mnt/c' + ($p.Substring(2) -replace '\\', '/') } } +$jobW = WslPath $job +$emptyW = WslPath (Join-Path $env:LOCALAPPDATA 'igneum\app\jobs\chain-pc2-pv1c\block-83616.json') +$points = if ($env:FLOOR_POINTS) { $env:FLOOR_POINTS } else { 'run x12 "$EMPTY" SP1_GPU_MEMORY_BUDGET_GB=12;run x12 "$V1" SP1_GPU_MEMORY_BUDGET_GB=12;run x12 "$ONE" SP1_GPU_MEMORY_BUDGET_GB=12;run x12 "$FULL" SP1_GPU_MEMORY_BUDGET_GB=12;run xe26 "$V1" SP1_GPU_ELEMENT_THRESHOLD=67108864;run xe26 "$EMPTY" SP1_GPU_ELEMENT_THRESHOLD=67108864;run x16 "$V1" SP1_GPU_MEMORY_BUDGET_GB=16;run x32 "$V1" SP1_GPU_MEMORY_BUDGET_GB=32;run x12r "$V1" SP1_GPU_MEMORY_BUDGET_GB=12 SP1_GPU_RECURSION_TRACE_ALLOCATION=100663296' } +$bash = @' +set -uo pipefail +export PATH="$HOME/.cargo/bin:$PATH" +CUDA_DIR="$(ls -d /usr/local/cuda-12.* 2>/dev/null | sort -V | tail -1 || true)"; [ -n "$CUDA_DIR" ] && export PATH="$CUDA_DIR/bin:$PATH" && export LD_LIBRARY_PATH="$CUDA_DIR/lib64:/usr/lib/wsl/lib:${LD_LIBRARY_PATH:-}" +stamp() { date -u +%Y-%m-%dT%H:%M:%SZ; } +JOB='JOBW_PLACEHOLDER'; H=/opt/igneum-pv1/igneum-prove-host; FX="/root/igneum-prove-pv1/proving/fixtures" +FLOORHOME=/opt/igneum-floor/home; SRV=$FLOORHOME/.sp1/bin/sp1-gpu-server +EMPTY='EMPTY_PLACEHOLDER'; V1="$FX/fees-v1-shards2.json"; FULL="$FX/block-338-shard1.json"; ONE="$FX/block-56-transfers.json" +[ -x "$SRV" ] || { echo "RESULT measure_failed no patched server at $SRV"; exit 2; } +[ -x "$H" ] || { echo "RESULT measure_failed no pv1 host at $H"; exit 2; } +echo "RESULT patched_server sha256=$(sha256sum $SRV | cut -c1-64) version=$($SRV --version 2>/dev/null) host=$(sha256sum $H | cut -c1-16)" +echo "RESULT live_server sha256=$(sha256sum /root/.sp1/bin/sp1-gpu-server | cut -c1-16) untouched" +pkill -f sp1-gpu-server 2>/dev/null; sleep 2; rm -f /tmp/sp1-cuda-*.sock +echo "RESULT idle_mib $(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | head -1)" +run() { # name fixture env... + local name="$1" fx="$2"; shift 2 + local tag="$name-$(basename $fx .json)" + pkill -f sp1-gpu-server 2>/dev/null; sleep 2; rm -f /tmp/sp1-cuda-*.sock + local csv="$JOB/smi-$tag.csv" log="$JOB/log-$tag.txt" + nvidia-smi --query-gpu=timestamp,memory.used,utilization.gpu --format=csv,noheader,nounits -l 1 > "$csv" 2>/dev/null & + local SMI=$! + local t0=$(date +%s) + env HOME=$FLOORHOME SP1_PROVER=cuda RUST_LOG=off SP1_GPU_FLOOR_LOG=1 "$@" $H "$fx" --mode compressed --shard 0 --out "$JOB/res-$tag.json" > "$log" 2>&1 + local rc=$? + local wall=$(( $(date +%s) - t0 )) + pkill -f sp1-gpu-server 2>/dev/null; sleep 1; kill $SMI 2>/dev/null; sleep 1; rm -f /tmp/sp1-cuda-*.sock + local peak=$(awk -F', *' '{ if ($2+0 > m) m=$2+0 } END { print m+0 }' "$csv") + local n=$(wc -l < "$csv") + local line=$(grep -E "^RESULT compressed shard" "$log" | tail -1 | sed -E 's/.*prove ([0-9.]+) s, proof ([0-9]+) bytes, verify ([0-9.]+) s, ([A-Z ]+);.*/prove_s=\1 bytes=\2 verify_s=\3 \4/') + local cyc=$(grep -E "^RESULT execute shard" "$log" | tail -1 | sed -E 's/.*: ([0-9]+) cycles.*/\1/') + local err=$(grep -iE "error|panick|out of memory|OOM|unsupported" "$log" | grep -v "^FLOOR" | head -1 | cut -c1-200) + echo "RESULT floor cfg=$name fixture=$(basename $fx .json) peak_mib=$peak samples=$n wall_s=$wall cycles=${cyc:-na} ${line:-no_result} exit=$rc env='$*' ${err:+err=$err}" + grep -E "^FLOOR" "$log" | sed "s/^/RESULT floorline cfg=$name fixture=$(basename $fx .json) /" | head -40 +} +POINTS_PLACEHOLDER_BASH +pkill -f sp1-gpu-server 2>/dev/null; sleep 1; rm -f /tmp/sp1-cuda-*.sock +echo "RESULT measure_end $(stamp)" +'@ +$bash = $bash.Replace('JOBW_PLACEHOLDER', $jobW).Replace('EMPTY_PLACEHOLDER', $emptyW).Replace('POINTS_PLACEHOLDER_BASH', ($points -replace ';', "`n")) +$bashFile = Join-Path $job 'measure.sh' +[IO.File]::WriteAllText($bashFile, ($bash -replace "`r`n", "`n"), (New-Object System.Text.UTF8Encoding $false)) +& wsl.exe -d Ubuntu-24.04 -u root -- bash (WslPath $bashFile) 2>&1 | ForEach-Object { ($_ -replace "`0", '') } +"RESULT end $(Stamp) prover back on: $(Prove $true)" diff --git a/tools/prover-floor/points-sweep2.txt b/tools/prover-floor/points-sweep2.txt index 0fde61d44..6b5f0ee56 100644 --- a/tools/prover-floor/points-sweep2.txt +++ b/tools/prover-floor/points-sweep2.txt @@ -1,6 +1,9 @@ -run r26b12 "$EMPTY" SP1_GPU_MEMORY_BUDGET_GB=12 SP1_GPU_RECURSION_TRACE_ALLOCATION=67108864 -run r26b12 "$V1" SP1_GPU_MEMORY_BUDGET_GB=12 SP1_GPU_RECURSION_TRACE_ALLOCATION=67108864 -run r25b12 "$V1" SP1_GPU_MEMORY_BUDGET_GB=12 SP1_GPU_RECURSION_TRACE_ALLOCATION=33554432 -run r26e26 "$V1" SP1_GPU_ELEMENT_THRESHOLD=67108864 SP1_GPU_RECURSION_TRACE_ALLOCATION=67108864 -run r26e26 "$ONE" SP1_GPU_ELEMENT_THRESHOLD=67108864 SP1_GPU_RECURSION_TRACE_ALLOCATION=67108864 -run r26e26 "$FULL" SP1_GPU_ELEMENT_THRESHOLD=67108864 SP1_GPU_RECURSION_TRACE_ALLOCATION=67108864 +run x12 "$EMPTY" SP1_GPU_MEMORY_BUDGET_GB=12 +run x12 "$V1" SP1_GPU_MEMORY_BUDGET_GB=12 +run x12 "$ONE" SP1_GPU_MEMORY_BUDGET_GB=12 +run x12 "$FULL" SP1_GPU_MEMORY_BUDGET_GB=12 +run xe26 "$V1" SP1_GPU_ELEMENT_THRESHOLD=67108864 +run xe26 "$EMPTY" SP1_GPU_ELEMENT_THRESHOLD=67108864 +run x16 "$V1" SP1_GPU_MEMORY_BUDGET_GB=16 +run x32 "$V1" SP1_GPU_MEMORY_BUDGET_GB=32 +run x12r "$V1" SP1_GPU_MEMORY_BUDGET_GB=12 SP1_GPU_RECURSION_TRACE_ALLOCATION=100663296