Initial commit: jackpotminer Equihash 192,7 miner

GPU-accelerated Equihash 192,7 miner in Rust with three solver backends:
- CPU: Wagner's algorithm, AVX2 packed slots (xenoncat-style)
- OpenCL: full on-GPU solve (kernels/equihash.cl); runs on NVIDIA and AMD
- CUDA: driver-API replay of miniZ's extracted fatbin (src/miniz/)

Also includes a default-off pearlhash backend (src/pearl/, native CPU core +
NVRTC int8-GEMM GPU kernels) and a WIP Ethash CUDA backend (src/ethash/).

Reverse-engineering scratch (alpha-miner, pearl-dump/) and the active runtime
config (mine.toml) are gitignored; mine.example.toml is the template.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jackpotincorporated
2026-06-05 23:08:20 -04:00
commit e2fab622b5
82 changed files with 781504 additions and 0 deletions
+308
View File
@@ -0,0 +1,308 @@
//! Personalised BLAKE2b state used by Equihash.
//!
//! The personalisation string is `"ZcashPoW" || LE32(n) || LE32(k)` and the
//! digest length is `HASH_OUTPUT` bytes. The base state absorbs the 140-byte
//! block header; each index `g` is then hashed by cloning the base state and
//! appending `LE32(g)`.
//!
//! [`generate_hash`] (one hash at a time, via `blake2b_simd`) is used by the
//! verification paths. The solver's hot round-0 loop instead uses
//! [`BatchHasher`], which precomputes the midstate of the shared first 128-byte
//! header block once and then compresses only the final 16-byte block — four
//! `g` values at a time with AVX2 — mirroring xenoncat's hashing strategy.
use crate::params::{HASH_OUTPUT, HEADER_LEN, K, N};
use blake2b_simd::{Params, State};
/// Build the Equihash personalisation block: `"ZcashPoW" || LE32(n) || LE32(k)`.
pub fn personalization() -> [u8; 16] {
let mut personal = [0u8; 16];
personal[..8].copy_from_slice(b"ZcashPoW");
personal[8..12].copy_from_slice(&(N as u32).to_le_bytes());
personal[12..16].copy_from_slice(&(K as u32).to_le_bytes());
personal
}
/// Create the base BLAKE2b state with the header absorbed.
///
/// `header` must be exactly the 140 pre-solution header bytes.
pub fn base_state(header: &[u8]) -> State {
let personal = personalization();
let mut state = Params::new()
.hash_length(HASH_OUTPUT)
.personal(&personal)
.to_state();
state.update(header);
state
}
/// Compute the BLAKE2b output for index `g` from a base state.
#[inline]
pub fn generate_hash(base: &State, g: u32) -> [u8; HASH_OUTPUT] {
let mut s = base.clone();
s.update(&g.to_le_bytes());
let hash = s.finalize();
let mut out = [0u8; HASH_OUTPUT];
out.copy_from_slice(hash.as_bytes());
out
}
// ---------------------------------------------------------------------------
// Batched midstate hasher (round-0 hot path).
//
// The 140-byte header plus the 4-byte index `g` is 144 bytes = two BLAKE2b
// blocks. The first 128-byte block is identical for every `g`, so we compress
// it once into a midstate and, per `g`, compress only the final block (the 12
// trailing header bytes + `LE32(g)`, zero-padded). With AVX2 four such final
// blocks are compressed in parallel lanes.
// ---------------------------------------------------------------------------
/// BLAKE2b IV.
const IV: [u64; 8] = [
0x6a09e667f3bcc908,
0xbb67ae8584caa73b,
0x3c6ef372fe94f82b,
0xa54ff53a5f1d36f1,
0x510e527fade682d1,
0x9b05688c2b3e6c1f,
0x1f83d9abfb41bd6b,
0x5be0cd19137e2179,
];
/// BLAKE2b message schedule.
const SIGMA: [[usize; 16]; 12] = [
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
[11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4],
[7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8],
[9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13],
[2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9],
[12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11],
[13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10],
[6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5],
[10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3],
];
/// Number of trailing header bytes that land in the final block (140 - 128).
const TAIL_LEN: usize = HEADER_LEN - 128;
/// Cumulative byte count for the (last) final-block compression: 140 + 4.
const FINAL_COUNT: u64 = (HEADER_LEN + 4) as u64;
/// Initial BLAKE2b state words: IV xor'd with the parameter block (digest
/// length 48, fanout/depth 1, our personalisation in bytes 48..64).
fn init_words() -> [u64; 8] {
let mut param = [0u8; 64];
param[0] = HASH_OUTPUT as u8; // digest length
param[2] = 1; // fanout
param[3] = 1; // depth
param[48..64].copy_from_slice(&personalization());
let mut h = IV;
for i in 0..8 {
h[i] ^= u64::from_le_bytes(param[i * 8..i * 8 + 8].try_into().unwrap());
}
h
}
#[inline(always)]
fn scalar_g(v: &mut [u64; 16], a: usize, b: usize, c: usize, d: usize, x: u64, y: u64) {
v[a] = v[a].wrapping_add(v[b]).wrapping_add(x);
v[d] = (v[d] ^ v[a]).rotate_right(32);
v[c] = v[c].wrapping_add(v[d]);
v[b] = (v[b] ^ v[c]).rotate_right(24);
v[a] = v[a].wrapping_add(v[b]).wrapping_add(y);
v[d] = (v[d] ^ v[a]).rotate_right(16);
v[c] = v[c].wrapping_add(v[d]);
v[b] = (v[b] ^ v[c]).rotate_right(63);
}
/// Scalar BLAKE2b compression of one 128-byte block into `h`.
fn scalar_compress(h: &mut [u64; 8], block: &[u8; 128], count: u64, last: bool) {
let mut m = [0u64; 16];
for i in 0..16 {
m[i] = u64::from_le_bytes(block[i * 8..i * 8 + 8].try_into().unwrap());
}
let mut v = [0u64; 16];
v[..8].copy_from_slice(h);
v[8..].copy_from_slice(&IV);
v[12] ^= count;
if last {
v[14] ^= !0u64;
}
for s in &SIGMA {
scalar_g(&mut v, 0, 4, 8, 12, m[s[0]], m[s[1]]);
scalar_g(&mut v, 1, 5, 9, 13, m[s[2]], m[s[3]]);
scalar_g(&mut v, 2, 6, 10, 14, m[s[4]], m[s[5]]);
scalar_g(&mut v, 3, 7, 11, 15, m[s[6]], m[s[7]]);
scalar_g(&mut v, 0, 5, 10, 15, m[s[8]], m[s[9]]);
scalar_g(&mut v, 1, 6, 11, 12, m[s[10]], m[s[11]]);
scalar_g(&mut v, 2, 7, 8, 13, m[s[12]], m[s[13]]);
scalar_g(&mut v, 3, 4, 9, 14, m[s[14]], m[s[15]]);
}
for i in 0..8 {
h[i] ^= v[i] ^ v[i + 8];
}
}
/// Precomputed midstate for a fixed header, hashing many `g` indices.
#[derive(Clone)]
pub struct BatchHasher {
/// State words after compressing the shared first 128-byte block.
mid: [u64; 8],
/// The trailing header bytes (140 - 128) that begin the final block.
tail: [u8; TAIL_LEN],
}
impl BatchHasher {
pub fn new(header: &[u8]) -> Self {
assert_eq!(header.len(), HEADER_LEN, "header must be {HEADER_LEN} bytes");
let mut mid = init_words();
let mut blk = [0u8; 128];
blk.copy_from_slice(&header[..128]);
scalar_compress(&mut mid, &blk, 128, false);
let mut tail = [0u8; TAIL_LEN];
tail.copy_from_slice(&header[128..HEADER_LEN]);
Self { mid, tail }
}
/// Assemble the zero-padded final block for index `g`.
#[inline]
fn final_block(&self, g: u32) -> [u8; 128] {
let mut blk = [0u8; 128];
blk[..TAIL_LEN].copy_from_slice(&self.tail);
blk[TAIL_LEN..TAIL_LEN + 4].copy_from_slice(&g.to_le_bytes());
blk
}
/// Hash a single index `g` (scalar; used as the AVX2 fallback and in tests).
pub fn hash1(&self, g: u32) -> [u8; HASH_OUTPUT] {
let mut h = self.mid;
let blk = self.final_block(g);
scalar_compress(&mut h, &blk, FINAL_COUNT, true);
let mut out = [0u8; HASH_OUTPUT];
for i in 0..HASH_OUTPUT / 8 {
out[i * 8..i * 8 + 8].copy_from_slice(&h[i].to_le_bytes());
}
out
}
/// Hash four consecutive indices `g0, g0+1, g0+2, g0+3`, writing each
/// 48-byte digest into `out[0..4]`. Uses AVX2 when available.
#[inline]
pub fn hash4(&self, g0: u32, out: &mut [[u8; HASH_OUTPUT]; 4]) {
#[cfg(target_arch = "x86_64")]
{
if is_x86_feature_detected!("avx2") {
unsafe { self.hash4_avx2(g0, out) };
return;
}
}
for (l, o) in out.iter_mut().enumerate() {
*o = self.hash1(g0 + l as u32);
}
}
#[cfg(target_arch = "x86_64")]
#[target_feature(enable = "avx2")]
unsafe fn hash4_avx2(&self, g0: u32, out: &mut [[u8; HASH_OUTPUT]; 4]) {
use core::arch::x86_64::*;
#[inline(always)]
unsafe fn rotr32(x: __m256i) -> __m256i {
_mm256_or_si256(_mm256_srli_epi64(x, 32), _mm256_slli_epi64(x, 32))
}
#[inline(always)]
unsafe fn rotr24(x: __m256i) -> __m256i {
_mm256_or_si256(_mm256_srli_epi64(x, 24), _mm256_slli_epi64(x, 40))
}
#[inline(always)]
unsafe fn rotr16(x: __m256i) -> __m256i {
_mm256_or_si256(_mm256_srli_epi64(x, 16), _mm256_slli_epi64(x, 48))
}
#[inline(always)]
unsafe fn rotr63(x: __m256i) -> __m256i {
_mm256_or_si256(_mm256_srli_epi64(x, 63), _mm256_slli_epi64(x, 1))
}
#[inline(always)]
unsafe fn g4(v: &mut [__m256i; 16], a: usize, b: usize, c: usize, d: usize, x: __m256i, y: __m256i) {
v[a] = _mm256_add_epi64(_mm256_add_epi64(v[a], v[b]), x);
v[d] = rotr32(_mm256_xor_si256(v[d], v[a]));
v[c] = _mm256_add_epi64(v[c], v[d]);
v[b] = rotr24(_mm256_xor_si256(v[b], v[c]));
v[a] = _mm256_add_epi64(_mm256_add_epi64(v[a], v[b]), y);
v[d] = rotr16(_mm256_xor_si256(v[d], v[a]));
v[c] = _mm256_add_epi64(v[c], v[d]);
v[b] = rotr63(_mm256_xor_si256(v[b], v[c]));
}
// Message words. Only m0 and m1 are nonzero; m1's high 32 bits hold the
// per-lane `g`. (TAIL_LEN is 12 for 192,7: 8 bytes -> m0, 4 -> m1 low.)
let tail0 = u64::from_le_bytes(self.tail[0..8].try_into().unwrap());
let tail_hi = u32::from_le_bytes(self.tail[8..12].try_into().unwrap()) as u64;
let m1_lane = |g: u32| (tail_hi | ((g as u64) << 32)) as i64;
let mut m = [_mm256_setzero_si256(); 16];
m[0] = _mm256_set1_epi64x(tail0 as i64);
m[1] = _mm256_set_epi64x(m1_lane(g0 + 3), m1_lane(g0 + 2), m1_lane(g0 + 1), m1_lane(g0));
let mut v = [_mm256_setzero_si256(); 16];
for i in 0..8 {
v[i] = _mm256_set1_epi64x(self.mid[i] as i64);
v[i + 8] = _mm256_set1_epi64x(IV[i] as i64);
}
v[12] = _mm256_xor_si256(v[12], _mm256_set1_epi64x(FINAL_COUNT as i64));
v[14] = _mm256_xor_si256(v[14], _mm256_set1_epi64x(-1)); // last-block flag
for s in &SIGMA {
g4(&mut v, 0, 4, 8, 12, m[s[0]], m[s[1]]);
g4(&mut v, 1, 5, 9, 13, m[s[2]], m[s[3]]);
g4(&mut v, 2, 6, 10, 14, m[s[4]], m[s[5]]);
g4(&mut v, 3, 7, 11, 15, m[s[6]], m[s[7]]);
g4(&mut v, 0, 5, 10, 15, m[s[8]], m[s[9]]);
g4(&mut v, 1, 6, 11, 12, m[s[10]], m[s[11]]);
g4(&mut v, 2, 7, 8, 13, m[s[12]], m[s[13]]);
g4(&mut v, 3, 4, 9, 14, m[s[14]], m[s[15]]);
}
// Output: digest is h[i] = mid[i] ^ v[i] ^ v[i+8]; we need the first
// HASH_OUTPUT/8 words (48 bytes -> 6 words) per lane, little-endian.
let mut tmp = [0u64; 4];
for i in 0..HASH_OUTPUT / 8 {
let o = _mm256_xor_si256(
_mm256_xor_si256(_mm256_set1_epi64x(self.mid[i] as i64), v[i]),
v[i + 8],
);
_mm256_storeu_si256(tmp.as_mut_ptr() as *mut __m256i, o);
for l in 0..4 {
out[l][i * 8..i * 8 + 8].copy_from_slice(&tmp[l].to_le_bytes());
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn batch_matches_reference() {
// Deterministic 140-byte header.
let header: Vec<u8> = (0..HEADER_LEN as u32).map(|i| (i.wrapping_mul(2654435761) >> 24) as u8).collect();
let base = base_state(&header);
let hasher = BatchHasher::new(&header);
// hash1 (scalar) must match the reference for assorted g.
for &g in &[0u32, 1, 2, 3, 4, 7, 255, 1024, 1_000_003, u32::MAX] {
assert_eq!(hasher.hash1(g), generate_hash(&base, g), "hash1 mismatch at g={g}");
}
// hash4 (AVX2 or scalar fallback) must match for several aligned batches.
for base_g in [0u32, 4, 100, 1_000_000] {
let mut out = [[0u8; HASH_OUTPUT]; 4];
hasher.hash4(base_g, &mut out);
for l in 0..4 {
assert_eq!(out[l], generate_hash(&base, base_g + l as u32), "hash4 mismatch at g={}", base_g + l as u32);
}
}
}
}
+1000
View File
File diff suppressed because it is too large Load Diff
+210
View File
@@ -0,0 +1,210 @@
//! Optional local control server (`--control-port`): a `127.0.0.1` JSON-line
//! service that lets the GUI config tool retrieve and adjust a running miner's
//! *live* controls on the fly — per-device enable + clock/power, and the CPU
//! group size + per-row enable. Bound to localhost only (no auth); intended for
//! a tool running on the same machine.
//!
//! Protocol: one JSON request object per line, one JSON reply per line.
//! {"op":"get"} -> snapshot
//! {"op":"set_device","index":0,"enabled":true,"power_w":250,
//! "core_off":150,"mem_off":0} -> {"ok":true}
//! {"op":"set_cpu_group_size","value":4} -> {"ok":true}
//! {"op":"set_cpu_row","index":0,"enabled":true} -> {"ok":true}
use std::io::{BufRead, BufReader, Write};
use std::net::{TcpListener, TcpStream};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::time::Duration;
use serde_json::{json, Value};
use crate::controls::Controls;
use crate::cpu_groups::CpuMining;
use crate::miner::Stats;
/// Serve until `running` is cleared. Non-blocking accept so shutdown is prompt.
pub fn serve(port: u16, controls: Arc<Controls>, cpu_mining: Arc<CpuMining>, stats: Arc<Stats>, running: Arc<AtomicBool>) {
let listener = match TcpListener::bind(("127.0.0.1", port)) {
Ok(l) => l,
Err(e) => {
log::warn!("control server: cannot bind 127.0.0.1:{port}: {e}");
return;
}
};
if listener.set_nonblocking(true).is_err() {
log::warn!("control server: set_nonblocking failed; control disabled");
return;
}
log::info!("control server on 127.0.0.1:{port} (live retrieve/adjust)");
while running.load(Ordering::Relaxed) {
match listener.accept() {
Ok((stream, _)) => handle(stream, &controls, &cpu_mining, &stats),
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => {
std::thread::sleep(Duration::from_millis(150));
}
Err(e) => {
log::debug!("control accept error: {e}");
std::thread::sleep(Duration::from_millis(150));
}
}
}
}
/// Serve one connection: read request lines (with a read timeout so a stalled
/// client can't pin the thread past shutdown) and reply to each.
fn handle(stream: TcpStream, controls: &Controls, cpu_mining: &CpuMining, stats: &Stats) {
let _ = stream.set_nonblocking(false);
let _ = stream.set_read_timeout(Some(Duration::from_secs(5)));
let mut writer = match stream.try_clone() {
Ok(s) => s,
Err(_) => return,
};
let mut reader = BufReader::new(stream);
let mut line = String::new();
loop {
line.clear();
match reader.read_line(&mut line) {
Ok(0) => return,
Ok(_) => {}
Err(_) => return,
}
if line.trim().is_empty() {
continue;
}
let resp = process(line.trim(), controls, cpu_mining, stats);
if writer.write_all(resp.to_string().as_bytes()).is_err()
|| writer.write_all(b"\n").is_err()
|| writer.flush().is_err()
{
return;
}
}
}
fn process(line: &str, controls: &Controls, cpu_mining: &CpuMining, stats: &Stats) -> Value {
let req: Value = match serde_json::from_str(line) {
Ok(v) => v,
Err(e) => return json!({"ok": false, "error": format!("bad json: {e}")}),
};
match req.get("op").and_then(Value::as_str).unwrap_or("") {
"get" => snapshot(controls, cpu_mining, stats),
"set_device" => set_device(&req, controls),
"set_cpu_group_size" => {
if let Some(n) = req.get("value").and_then(Value::as_u64) {
cpu_mining.set_group_size(n as usize);
}
json!({"ok": true})
}
"set_cpu_row" => {
let i = req.get("index").and_then(Value::as_u64).unwrap_or(u64::MAX) as usize;
if let Some(e) = req.get("enabled").and_then(Value::as_bool) {
let groups = cpu_mining.groups();
if i < groups.len() && groups.group(i).enabled() != e {
cpu_mining.toggle_group(i);
}
}
json!({"ok": true})
}
other => json!({"ok": false, "error": format!("unknown op '{other}'")}),
}
}
fn set_device(req: &Value, controls: &Controls) -> Value {
let i = req.get("index").and_then(Value::as_u64).unwrap_or(u64::MAX) as usize;
if i >= controls.device_count() {
return json!({"ok": false, "error": "device index out of range"});
}
let d = controls.device(i);
if let Some(e) = req.get("enabled").and_then(Value::as_bool) {
d.set_enabled(e);
}
if let Some(p) = req.get("power_w").and_then(Value::as_u64) {
d.set_power_w(p as u32);
}
if let Some(c) = req.get("core_off").and_then(Value::as_i64) {
d.set_core_off(c as i32);
}
if let Some(m) = req.get("mem_off").and_then(Value::as_i64) {
d.set_mem_off(m as i32);
}
json!({"ok": true})
}
fn snapshot(controls: &Controls, cpu_mining: &CpuMining, stats: &Stats) -> Value {
let cards = stats.cards();
let devices: Vec<Value> = cards
.iter()
.enumerate()
.map(|(i, c)| {
let d = controls.device(i);
json!({
"index": i,
"label": c.label,
"name": c.name,
"enabled": d.enabled(),
"power_w": d.power_w(),
"core_off": d.core_off(),
"mem_off": d.mem_off(),
"watts": c.power_mw as f64 / 1000.0,
"temp_c": c.temp_c,
"shares": c.shares,
"solutions": c.solutions,
})
})
.collect();
let groups = cpu_mining.groups();
let rows: Vec<Value> = groups
.iter()
.enumerate()
.map(|(i, g)| json!({"index": i, "label": g.label(), "enabled": g.enabled(), "shares": g.shares()}))
.collect();
json!({
"ok": true,
"unlocked": controls.unlocked(),
"devices": devices,
"cpu": {"group_size": cpu_mining.group_size(), "rows": rows},
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::miner::Stats;
#[test]
fn protocol_get_and_set() {
let controls = Controls::new(1, 0, 0, 0, 0, true);
let cpu = CpuMining::new((0..8).collect(), 4, false); // sizes [1,2,4,8]
let stats = Stats::for_test(vec!["GPU 0".into()]);
// get: one device, cpu rows reflect the grouping (8 cores / 4 = 2 rows).
let v = process("{\"op\":\"get\"}", &controls, &cpu, &stats);
assert_eq!(v["ok"], true);
assert_eq!(v["devices"].as_array().unwrap().len(), 1);
assert_eq!(v["cpu"]["group_size"], 4);
assert_eq!(v["cpu"]["rows"].as_array().unwrap().len(), 2);
// set device 0 disabled.
assert!(controls.device(0).enabled());
process("{\"op\":\"set_device\",\"index\":0,\"enabled\":false,\"power_w\":250}", &controls, &cpu, &stats);
assert!(!controls.device(0).enabled());
// out-of-range device index is rejected.
let e = process("{\"op\":\"set_device\",\"index\":9}", &controls, &cpu, &stats);
assert_eq!(e["ok"], false);
// set CPU group size to the nearest available (2).
process("{\"op\":\"set_cpu_group_size\",\"value\":2}", &controls, &cpu, &stats);
assert_eq!(cpu.group_size(), 2);
// toggle a CPU row on.
assert!(!cpu.groups().group(0).enabled());
process("{\"op\":\"set_cpu_row\",\"index\":0,\"enabled\":true}", &controls, &cpu, &stats);
assert!(cpu.groups().group(0).enabled());
// garbage and unknown ops are reported, not panicked.
assert_eq!(process("not json", &controls, &cpu, &stats)["ok"], false);
assert_eq!(process("{\"op\":\"nope\"}", &controls, &cpu, &stats)["ok"], false);
}
}
+259
View File
@@ -0,0 +1,259 @@
//! Live, user-adjustable hardware controls, shared between the TUI (which
//! mutates them on key presses) and the worker threads (which apply them to each
//! card's GPU tuner). Pure atomics — no backend dependency, so it compiles for
//! every feature set even though only the CUDA backend acts on the values.
//!
//! `core_off`/`mem_off` are absolute VF clock offsets in MHz; `power_w` is an
//! absolute power-limit target in watts (0 = leave at the card default). `seq`
//! bumps on every change so workers re-apply lazily, and only after the user
//! actually touches a control.
use std::sync::atomic::{AtomicBool, AtomicI32, AtomicU32, AtomicU64, AtomicUsize, Ordering};
use std::sync::Arc;
/// Per-GPU hardware controls plus the TUI's currently-selected device. Workers
/// each drive `device(worker_id)`; the dashboard adjusts `device(selected())`
/// and cycles `selected` with Tab.
pub struct Controls {
devices: Vec<HwControls>,
/// Number of CPU-group rows that follow the GPU devices in the selection
/// order (Tab cycles GPUs first, then groups). Dynamic: changing the CPU
/// group size from the dashboard changes how many rows there are, so the TUI
/// keeps this in sync via [`Controls::set_group_rows`]. The control blocks
/// above are GPU-only; groups carry their own state in [`crate::cpu_groups`].
groups: AtomicUsize,
selected: AtomicUsize,
/// Whether the live control keys may actually change clocks/power. Locked by
/// default (set via `--unlock-controls`) so stray key presses can't retune.
unlocked: bool,
}
impl Controls {
/// One control block per GPU device (each seeded from the CLI tuning flags),
/// plus `groups` selectable CPU-group rows after them.
pub fn new(devices: usize, groups: usize, core_off: i32, mem_off: i32, power_w: u32, unlocked: bool) -> Arc<Self> {
Arc::new(Self {
devices: (0..devices.max(1)).map(|_| HwControls::new(core_off, mem_off, power_w)).collect(),
groups: AtomicUsize::new(groups),
selected: AtomicUsize::new(0),
unlocked,
})
}
/// Update the number of selectable CPU-group rows (after a regroup).
pub fn set_group_rows(&self, n: usize) {
self.groups.store(n, Ordering::Relaxed);
}
/// Whether live hardware controls are enabled.
pub fn unlocked(&self) -> bool {
self.unlocked
}
/// The control block for device `i` (clamped to the valid range).
pub fn device(&self, i: usize) -> &HwControls {
&self.devices[i.min(self.devices.len() - 1)]
}
/// Number of GPU device control blocks.
pub fn device_count(&self) -> usize {
self.devices.len()
}
/// Total selectable rows: GPU devices followed by CPU groups.
fn total(&self) -> usize {
self.devices.len() + self.groups.load(Ordering::Relaxed)
}
/// The unified selection index over [GPU devices.., CPU groups..].
pub fn selected(&self) -> usize {
self.selected.load(Ordering::Relaxed).min(self.total() - 1)
}
/// The selected GPU device index, or `None` when a CPU group is selected.
pub fn selected_device(&self) -> Option<usize> {
let s = self.selected();
(s < self.devices.len()).then_some(s)
}
/// The selected CPU-group index, or `None` when a GPU device is selected.
pub fn selected_group(&self) -> Option<usize> {
let s = self.selected();
(s >= self.devices.len()).then(|| s - self.devices.len())
}
/// Advance the dashboard's selection (GPUs then groups; wraps around).
pub fn select_next(&self) {
let n = self.total();
self.selected.store((self.selected() + 1) % n, Ordering::Relaxed);
}
}
/// Fixed bounds for the clock-offset controls. Generous on purpose — the NVML
/// tuner additionally clamps to the card's real VF-offset range at apply time,
/// so these just stop the displayed value from running away.
const CORE_OFF_MIN: i32 = -1000;
const CORE_OFF_MAX: i32 = 1500;
const MEM_OFF_MIN: i32 = -2000;
const MEM_OFF_MAX: i32 = 6000;
pub struct HwControls {
core_off: AtomicI32,
mem_off: AtomicI32,
power_w: AtomicU32,
/// Power-limit clamp range (watts), learned from the card at startup.
pwr_min: AtomicU32,
pwr_max: AtomicU32,
pwr_limits_set: AtomicBool,
/// Whether this device should mine. Toggled from the dashboard (Backspace);
/// the worker drains and idles while false. Devices start enabled.
enabled: AtomicBool,
seq: AtomicU64,
}
impl HwControls {
/// Seed initial offsets/power from the CLI tuning flags so the panel opens
/// showing what's already applied (0 ⇒ "default"). Initial offsets are
/// clamped to the fixed bounds.
fn new(core_off: i32, mem_off: i32, power_w: u32) -> Self {
Self {
core_off: AtomicI32::new(core_off.clamp(CORE_OFF_MIN, CORE_OFF_MAX)),
mem_off: AtomicI32::new(mem_off.clamp(MEM_OFF_MIN, MEM_OFF_MAX)),
power_w: AtomicU32::new(power_w),
pwr_min: AtomicU32::new(0),
pwr_max: AtomicU32::new(u32::MAX),
pwr_limits_set: AtomicBool::new(false),
enabled: AtomicBool::new(true),
seq: AtomicU64::new(0),
}
}
/// Whether this device is currently set to mine.
pub fn enabled(&self) -> bool {
self.enabled.load(Ordering::Relaxed)
}
/// Flip the device between mining and idle (dashboard Backspace).
pub fn toggle_enabled(&self) {
self.enabled.fetch_xor(true, Ordering::Relaxed);
}
/// Set the device's enabled state directly (control server).
pub fn set_enabled(&self, on: bool) {
self.enabled.store(on, Ordering::Relaxed);
}
pub fn seq(&self) -> u64 {
self.seq.load(Ordering::Relaxed)
}
pub fn core_off(&self) -> i32 {
self.core_off.load(Ordering::Relaxed)
}
pub fn mem_off(&self) -> i32 {
self.mem_off.load(Ordering::Relaxed)
}
pub fn power_w(&self) -> u32 {
self.power_w.load(Ordering::Relaxed)
}
// Only the TUI key-handler thread mutates these, so a load/clamp/store is
// race-free; workers only read.
pub fn adjust_core(&self, delta: i32) {
let n = (self.core_off.load(Ordering::Relaxed) + delta).clamp(CORE_OFF_MIN, CORE_OFF_MAX);
self.core_off.store(n, Ordering::Relaxed);
self.bump();
}
/// Set the displayed core offset without triggering a re-apply — used to
/// reflect a value already pushed to the card (e.g. by `--auto-tune`).
pub fn set_core_display(&self, v: i32) {
self.core_off.store(v.clamp(CORE_OFF_MIN, CORE_OFF_MAX), Ordering::Relaxed);
}
/// As [`Self::set_core_display`] but for the memory offset.
pub fn set_mem_display(&self, v: i32) {
self.mem_off.store(v.clamp(MEM_OFF_MIN, MEM_OFF_MAX), Ordering::Relaxed);
}
pub fn adjust_mem(&self, delta: i32) {
let n = (self.mem_off.load(Ordering::Relaxed) + delta).clamp(MEM_OFF_MIN, MEM_OFF_MAX);
self.mem_off.store(n, Ordering::Relaxed);
self.bump();
}
/// Set absolute clock offsets / power directly (control server), clamped and
/// triggering a re-apply (bump) like the dashboard adjust keys.
pub fn set_core_off(&self, v: i32) {
self.core_off.store(v.clamp(CORE_OFF_MIN, CORE_OFF_MAX), Ordering::Relaxed);
self.bump();
}
pub fn set_mem_off(&self, v: i32) {
self.mem_off.store(v.clamp(MEM_OFF_MIN, MEM_OFF_MAX), Ordering::Relaxed);
self.bump();
}
pub fn set_power_w(&self, v: u32) {
let min = self.pwr_min.load(Ordering::Relaxed);
let max = self.pwr_max.load(Ordering::Relaxed);
self.power_w.store(v.clamp(min, max), Ordering::Relaxed);
self.bump();
}
/// Adjust the power-limit target, clamped to the card's reported range
/// (defaults to a 0 floor until the card publishes its limits).
pub fn adjust_power(&self, delta: i32) {
let min = self.pwr_min.load(Ordering::Relaxed) as i64;
let max = self.pwr_max.load(Ordering::Relaxed) as i64;
let cur = self.power_w.load(Ordering::Relaxed) as i64;
let next = (cur + delta as i64).clamp(min, max) as u32;
self.power_w.store(next, Ordering::Relaxed);
self.bump();
}
/// Publish the card's power-limit range (watts) and seed the baseline from
/// its current limit, once. Doesn't trigger a re-apply.
pub fn init_power(&self, current: u32, min: u32, max: u32) {
if !self.pwr_limits_set.swap(true, Ordering::Relaxed) {
self.pwr_min.store(min, Ordering::Relaxed);
self.pwr_max.store(max, Ordering::Relaxed);
// Seed baseline unless the CLI already set an explicit limit.
let _ = self
.power_w
.compare_exchange(0, current, Ordering::Relaxed, Ordering::Relaxed);
}
}
fn bump(&self) {
self.seq.fetch_add(1, Ordering::Relaxed);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn selection_spans_devices_then_groups() {
// 2 GPUs followed by 3 CPU groups.
let c = Controls::new(2, 3, 0, 0, 0, false);
// Starts on the first GPU.
assert_eq!(c.selected_device(), Some(0));
assert_eq!(c.selected_group(), None);
// Tab walks GPU0, GPU1, group0, group1, group2, then wraps to GPU0.
c.select_next();
assert_eq!(c.selected_device(), Some(1));
c.select_next();
assert_eq!(c.selected_device(), None);
assert_eq!(c.selected_group(), Some(0));
c.select_next();
assert_eq!(c.selected_group(), Some(1));
c.select_next();
assert_eq!(c.selected_group(), Some(2));
c.select_next();
assert_eq!(c.selected_device(), Some(0));
}
#[test]
fn selection_with_no_groups() {
let c = Controls::new(1, 0, 0, 0, 0, false);
assert_eq!(c.selected_device(), Some(0));
assert_eq!(c.selected_group(), None);
c.select_next(); // single row: wraps back to itself
assert_eq!(c.selected_device(), Some(0));
}
}
+395
View File
@@ -0,0 +1,395 @@
//! CPU mining split into groups of cores that the dashboard can toggle on/off.
//!
//! The logical CPUs are partitioned into fixed-size groups (see
//! [`CpuGroups::new`]). Each group is mined by its own worker thread running on a
//! dedicated rayon pool sized to the group's core count, so enabling a group adds
//! roughly that many mining threads and disabling it stops them. Groups draw from
//! the same shared nonce counter and submit through the same pool client as the
//! GPU workers, so CPU mining runs alongside whatever backend is active.
//!
//! State here is pure atomics shared between the worker threads (which read
//! `enabled` and bump the counters) and the TUI (which toggles `enabled` and
//! reads the counters for the per-group Sol/s rows).
use std::collections::{BTreeMap, BTreeSet};
use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering};
use std::sync::{Arc, Mutex};
/// One toggleable group of specific CPU cores. The group's worker pins its
/// mining threads to exactly these logical cores (see `miner::cpu_group_worker`).
pub struct CpuGroup {
cores: Vec<usize>,
enabled: AtomicBool,
solutions: AtomicU64,
shares: AtomicU64,
}
impl CpuGroup {
/// The logical cores this group pins its threads to.
pub fn cores(&self) -> &[usize] {
&self.cores
}
/// Number of cores (and therefore mining threads) this group runs.
pub fn ncores(&self) -> usize {
self.cores.len()
}
/// Human-readable core list, e.g. "CPU cores 0-3", "CPU core 7", or
/// "CPU cores 0,2,4,6" for a non-contiguous selection.
pub fn label(&self) -> String {
format!("CPU {}", fmt_cores(&self.cores))
}
pub fn enabled(&self) -> bool {
self.enabled.load(Ordering::Relaxed)
}
/// Flip the group between mining and idle (called from the TUI key handler).
pub fn toggle(&self) {
self.enabled.fetch_xor(true, Ordering::Relaxed);
}
/// Set the enabled state directly (used when rebuilding groups for a new
/// group size, to restore the previously-enabled cores).
pub fn set_enabled(&self, on: bool) {
self.enabled.store(on, Ordering::Relaxed);
}
pub fn solutions(&self) -> u64 {
self.solutions.load(Ordering::Relaxed)
}
pub fn shares(&self) -> u64 {
self.shares.load(Ordering::Relaxed)
}
/// Counters the group's worker bumps as it mines (see `miner::submit_solutions`).
pub(crate) fn solutions_atomic(&self) -> &AtomicU64 {
&self.solutions
}
pub(crate) fn shares_atomic(&self) -> &AtomicU64 {
&self.shares
}
}
/// All CPU core groups, shared between the worker threads and the dashboard.
pub struct CpuGroups {
groups: Vec<CpuGroup>,
}
impl CpuGroups {
/// Group the selected `cores` into mining groups of up to `cores_per_group`,
/// **aligned to core-index blocks**: a core belongs to block
/// `core / cores_per_group`, and each non-empty block becomes one group. So a
/// group never straddles a `cores_per_group`-aligned boundary (keeping its
/// threads within one cache/NUMA-friendly range), and a partial selection
/// splits at the boundary rather than being sliced into raw chunks — e.g.
/// cores 2..=9 with size 4 give `[2,3] | [4,5,6,7] | [8,9]`, not
/// `[2,3,4,5] | [6,7,8,9]`. `cores` is the set to mine on (`--cpu-cores`,
/// default all); each group starts enabled iff `start_enabled`
/// (`--cpu-mining`). Groups (rows) are ordered by ascending core index.
pub fn new(cores: Vec<usize>, cores_per_group: usize, start_enabled: bool) -> Arc<Self> {
let cores_per_group = cores_per_group.max(1);
let mut blocks: BTreeMap<usize, Vec<usize>> = BTreeMap::new();
for c in cores {
blocks.entry(c / cores_per_group).or_default().push(c);
}
let groups = blocks
.into_values()
.map(|mut cores| {
cores.sort_unstable();
CpuGroup {
cores,
enabled: AtomicBool::new(start_enabled),
solutions: AtomicU64::new(0),
shares: AtomicU64::new(0),
}
})
.collect();
Arc::new(Self { groups })
}
pub fn len(&self) -> usize {
self.groups.len()
}
#[allow(dead_code)] // paired with len() for clippy::len_without_is_empty
pub fn is_empty(&self) -> bool {
self.groups.is_empty()
}
pub fn group(&self, i: usize) -> &CpuGroup {
&self.groups[i]
}
pub fn iter(&self) -> impl Iterator<Item = &CpuGroup> {
self.groups.iter()
}
}
/// Format a sorted core list compactly, collapsing contiguous runs into ranges:
/// `[5]` -> "core 5", `[0,1,2,3]` -> "cores 0-3", `[0,2,4]` -> "cores 0,2,4",
/// `[0,1,2,8,9]` -> "cores 0-2,8-9".
fn fmt_cores(cores: &[usize]) -> String {
if cores.is_empty() {
return "cores (none)".to_string();
}
let mut parts: Vec<String> = Vec::new();
let mut i = 0;
while i < cores.len() {
let start = cores[i];
let mut j = i;
while j + 1 < cores.len() && cores[j + 1] == cores[j] + 1 {
j += 1;
}
parts.push(if j == i {
format!("{start}")
} else {
format!("{start}-{}", cores[j])
});
i = j + 1;
}
let noun = if cores.len() == 1 { "core" } else { "cores" };
format!("{noun} {}", parts.join(","))
}
/// Build a [`CpuGroups`] for `cores`/`size`, enabling each group whose cores are
/// all in `enabled` (so the previously-enabled cores survive a regroup).
fn grouped(cores: &[usize], size: usize, enabled: &BTreeSet<usize>) -> Arc<CpuGroups> {
let groups = CpuGroups::new(cores.to_vec(), size, false);
for g in groups.iter() {
let on = !g.cores().is_empty() && g.cores().iter().all(|c| enabled.contains(c));
g.set_enabled(on);
}
groups
}
/// Live controller for CPU mining. Owns the selected cores plus the current
/// group size, and rebuilds the [`CpuGroups`] when the size is cycled from the
/// dashboard (the worker supervisor watches `group_size()` and respawns to
/// match). Which *cores* are enabled is tracked here so it survives a resize:
/// e.g. enabling cores 0-3 at size 4 keeps them on after switching to size 2.
pub struct CpuMining {
cores: Vec<usize>,
/// Group sizes the dashboard cycles through (sorted, includes the CLI value).
sizes: Vec<usize>,
size_idx: AtomicUsize,
/// The set of cores currently enabled for mining (drives each group's state).
enabled: Mutex<BTreeSet<usize>>,
/// The current grouping, swapped on resize; read by the TUI and supervisor.
groups: Mutex<Arc<CpuGroups>>,
/// Bumps on every regroup so the TUI can resync its per-group state.
generation: AtomicU64,
}
impl CpuMining {
/// `cores` are the logical cores to mine on (`--cpu-cores`), `initial_size`
/// the starting group size (`--cpu-group-size`), and `start_enabled` whether
/// mining begins on (`--cpu-mining`).
pub fn new(cores: Vec<usize>, initial_size: usize, start_enabled: bool) -> Arc<Self> {
let initial_size = initial_size.max(1);
let enabled: BTreeSet<usize> = if start_enabled { cores.iter().copied().collect() } else { BTreeSet::new() };
let groups = grouped(&cores, initial_size, &enabled);
// Cycle list: the usual powers of two plus the requested size, capped so a
// group never exceeds the core count (unless the user explicitly asked for
// a larger size), sorted and de-duplicated.
let cap = cores.len().max(initial_size).max(1);
let mut sizes: Vec<usize> = [1usize, 2, 4, 8]
.into_iter()
.chain([initial_size])
.filter(|&s| s >= 1 && s <= cap)
.collect();
sizes.sort_unstable();
sizes.dedup();
let size_idx = sizes.iter().position(|&s| s == initial_size).unwrap_or(0);
Arc::new(Self {
cores,
sizes,
size_idx: AtomicUsize::new(size_idx),
enabled: Mutex::new(enabled),
groups: Mutex::new(groups),
generation: AtomicU64::new(0),
})
}
/// The current cores-per-group.
pub fn group_size(&self) -> usize {
self.sizes[self.size_idx.load(Ordering::Relaxed).min(self.sizes.len() - 1)]
}
/// Advance to the next group size in the cycle (dashboard 'g' key). The
/// supervisor notices the change and regroups.
pub fn cycle_group_size(&self) {
let n = self.sizes.len();
if n > 1 {
let next = (self.size_idx.load(Ordering::Relaxed) + 1) % n;
self.size_idx.store(next, Ordering::Relaxed);
}
}
/// Set the group size to the nearest available value (control server). The
/// supervisor notices the change and regroups.
pub fn set_group_size(&self, n: usize) {
if let Some((idx, _)) = self
.sizes
.iter()
.enumerate()
.min_by_key(|(_, &s)| (s as i64 - n as i64).unsigned_abs())
{
self.size_idx.store(idx, Ordering::Relaxed);
}
}
/// A handle to the current grouping (cheap Arc clone).
pub fn groups(&self) -> Arc<CpuGroups> {
self.groups.lock().unwrap().clone()
}
/// Regroup counter; the TUI resets its per-group stats when this changes.
pub fn generation(&self) -> u64 {
self.generation.load(Ordering::Relaxed)
}
/// Toggle mining on the current grouping's `gi`-th group, updating the
/// persistent set of enabled cores so the choice survives a later resize.
pub fn toggle_group(&self, gi: usize) {
let groups = self.groups();
if gi >= groups.len() {
return;
}
let g = groups.group(gi);
g.toggle();
let on = g.enabled();
let mut set = self.enabled.lock().unwrap();
for &c in g.cores() {
if on {
set.insert(c);
} else {
set.remove(&c);
}
}
}
/// Rebuild the grouping for the current size, preserving the enabled cores,
/// publish it, and bump the generation. Returns the new grouping.
pub fn rebuild(&self) -> Arc<CpuGroups> {
let size = self.group_size();
let set = self.enabled.lock().unwrap().clone();
let groups = grouped(&self.cores, size, &set);
*self.groups.lock().unwrap() = groups.clone();
self.generation.fetch_add(1, Ordering::Relaxed);
groups
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn partitions_cores_into_groups() {
// Even split.
let g = CpuGroups::new((0..24).collect(), 4, false);
assert_eq!(g.len(), 6);
assert!(g.iter().all(|x| x.ncores() == 4));
// Remainder lands in a smaller final group.
let g = CpuGroups::new((0..10).collect(), 4, false);
assert_eq!(g.len(), 3);
assert_eq!(g.group(0).ncores(), 4);
assert_eq!(g.group(2).ncores(), 2);
assert_eq!(g.group(2).cores(), &[8, 9]);
assert_eq!(g.group(2).label(), "CPU cores 8-9");
// Degenerate inputs don't panic or divide by zero.
assert!(CpuGroups::new(vec![], 4, false).is_empty());
assert_eq!(CpuGroups::new((0..3).collect(), 0, false).len(), 3); // per_group clamped to 1
}
#[test]
fn groups_use_the_selected_cores() {
// Cores bucket by aligned 4-core block (core/4 -> 0:cores0-3, 1:cores4-7,
// 2:cores8-11), so [1,3,5,7,8] becomes [1,3] | [5,7] | [8].
let g = CpuGroups::new(vec![1, 3, 5, 7, 8], 4, true);
assert_eq!(g.len(), 3);
assert_eq!(g.group(0).cores(), &[1, 3]);
assert_eq!(g.group(0).label(), "CPU cores 1,3");
assert_eq!(g.group(1).cores(), &[5, 7]);
assert_eq!(g.group(2).cores(), &[8]);
assert_eq!(g.group(2).label(), "CPU core 8");
assert!(g.iter().all(|x| x.enabled())); // start_enabled = true
}
#[test]
fn groups_align_to_blocks() {
// A selection crossing 4-core block boundaries splits at the boundary,
// not into raw chunks of 4: cores 2..=9 -> [2,3] | [4,5,6,7] | [8,9].
let g = CpuGroups::new((2..10).collect(), 4, false);
assert_eq!(g.len(), 3);
assert_eq!(g.group(0).cores(), &[2, 3]);
assert_eq!(g.group(1).cores(), &[4, 5, 6, 7]);
assert_eq!(g.group(2).cores(), &[8, 9]);
// Group size 1 is one row per core regardless of selection.
assert_eq!(CpuGroups::new((0..4).collect(), 1, false).len(), 4);
}
#[test]
fn start_enabled_controls_initial_state() {
// Default (--cpu-mining absent): all groups start disabled.
assert!(CpuGroups::new((0..8).collect(), 4, false).iter().all(|g| !g.enabled()));
// --cpu-mining: all groups start enabled.
assert!(CpuGroups::new((0..8).collect(), 4, true).iter().all(|g| g.enabled()));
}
#[test]
fn cpu_mining_cycles_size_and_preserves_enabled_cores() {
// 8 cores, start at size 4 fully enabled -> two groups [0-3],[4-7], both on.
let m = CpuMining::new((0..8).collect(), 4, true);
assert_eq!(m.group_size(), 4);
assert_eq!(m.groups().len(), 2);
assert!(m.groups().iter().all(|g| g.enabled()));
// Disable the second group (cores 4-7): now only cores 0-3 are enabled.
m.toggle_group(1);
assert!(m.groups().group(0).enabled());
assert!(!m.groups().group(1).enabled());
// Cycle to size 8 and rebuild: the single [0-7] group is off, because not
// all of its cores were enabled.
while m.group_size() != 8 {
m.cycle_group_size();
}
let g = m.rebuild();
assert_eq!(g.len(), 1);
assert!(!g.group(0).enabled());
// Cycle to size 2 and rebuild: cores 0-3 are still tracked as enabled, so
// [0,1] and [2,3] come back on while [4,5] and [6,7] stay off — the choice
// survived two regroups (not derived from the all-off size-8 grouping).
while m.group_size() != 2 {
m.cycle_group_size();
}
let g = m.rebuild();
assert_eq!(g.len(), 4);
assert!(g.group(0).enabled()); // [0,1]
assert!(g.group(1).enabled()); // [2,3]
assert!(!g.group(2).enabled()); // [4,5]
assert!(!g.group(3).enabled()); // [6,7]
assert!(m.generation() >= 2);
}
#[test]
fn toggle_flips_enabled() {
let g = CpuGroups::new((0..8).collect(), 4, false);
assert!(!g.group(0).enabled());
g.group(0).toggle();
assert!(g.group(0).enabled());
assert!(!g.group(1).enabled()); // independent
g.group(0).toggle();
assert!(!g.group(0).enabled());
}
}
+1201
View File
File diff suppressed because it is too large Load Diff
+783
View File
@@ -0,0 +1,783 @@
//! Equihash 192,7 solver (Wagner's algorithm) plus solution
//! encoding/decoding and verification.
//!
//! The solver follows the reference "basic" algorithm from the Zcash
//! specification, generalised over the (n, k) constants in [`crate::params`].
//! It is correctness-oriented; heavy lifting of the initial hashing stage can
//! be offloaded to the GPU (see [`crate::gpu`]).
use std::collections::HashSet;
use blake2b_simd::State;
use rayon::prelude::*;
use crate::blake::{base_state, generate_hash, BatchHasher};
use crate::params::*;
/// A partially-collided list entry: the remaining (trimmed) hash bytes plus the
/// trail of leaf indices that produced it.
#[derive(Clone)]
struct Row {
hash: Vec<u8>,
indices: Vec<u32>,
}
/// Expand a packed little-endian-on-the-wire bit array into one byte group per
/// `bit_len`-bit element (each element right-aligned in `(bit_len+7)/8 +
/// byte_pad` bytes). Mirrors Zcash's `ExpandArray`.
pub fn expand_array(input: &[u8], bit_len: usize, byte_pad: usize) -> Vec<u8> {
assert!(bit_len >= 8 && bit_len + 7 <= 32);
let out_width = (bit_len + 7) / 8 + byte_pad;
let elements = input.len() * 8 / bit_len;
let mut out = vec![0u8; elements * out_width];
let bit_len_mask: u32 = (1u32 << bit_len) - 1;
let mut acc_bits = 0usize;
let mut acc_value: u64 = 0;
let mut j = 0usize;
for &b in input {
acc_value = (acc_value << 8) | b as u64;
acc_bits += 8;
if acc_bits >= bit_len {
acc_bits -= bit_len;
for x in byte_pad..out_width {
let shift = acc_bits + 8 * (out_width - x - 1);
let mask = (bit_len_mask >> (8 * (out_width - x - 1))) & 0xFF;
out[j + x] = ((acc_value >> shift) as u32 & mask) as u8;
}
j += out_width;
}
}
out
}
/// Inverse of [`expand_array`]; mirrors Zcash's `CompressArray`.
pub fn compress_array(input: &[u8], out_len: usize, bit_len: usize, byte_pad: usize) -> Vec<u8> {
let in_width = (bit_len + 7) / 8 + byte_pad;
let bit_len_mask: u32 = (1u32 << bit_len) - 1;
let mut out = vec![0u8; out_len];
let mut acc_bits = 0usize;
let mut acc_value: u64 = 0;
let mut j = 0usize;
for o in out.iter_mut() {
if acc_bits < 8 {
acc_value <<= bit_len;
for x in byte_pad..in_width {
let g = (bit_len_mask >> (8 * (in_width - x - 1))) & 0xFF;
acc_value |= ((input[j + x] as u32 & g) as u64) << (8 * (in_width - x - 1));
}
j += in_width;
acc_bits += bit_len;
}
acc_bits -= 8;
*o = ((acc_value >> acc_bits) & 0xFF) as u8;
}
out
}
/// Encode a solution's indices into the compact 400-byte wire form.
pub fn indices_to_solution(indices: &[u32]) -> Vec<u8> {
let cbl = COLLISION_BIT_LENGTH;
let byte_pad = 4 - ((cbl + 1) + 7) / 8;
let mut bytes = Vec::with_capacity(indices.len() * 4);
for &idx in indices {
bytes.extend_from_slice(&idx.to_be_bytes());
}
let min_len = (cbl + 1) * indices.len() / 8;
compress_array(&bytes, min_len, cbl + 1, byte_pad)
}
/// Decode the compact wire form back into solution indices.
pub fn solution_to_indices(minimal: &[u8]) -> Vec<u32> {
let cbl = COLLISION_BIT_LENGTH;
let byte_pad = 4 - ((cbl + 1) + 7) / 8;
let expanded = expand_array(minimal, cbl + 1, byte_pad);
expanded
.chunks_exact(4)
.map(|c| u32::from_be_bytes([c[0], c[1], c[2], c[3]]))
.collect()
}
/// Build the expanded, byte-padded solver hash for a single leaf index.
fn leaf_row(base: &State, idx: u32) -> Row {
let g = idx / INDICES_PER_HASH_OUTPUT as u32;
let i = (idx % INDICES_PER_HASH_OUTPUT as u32) as usize;
let h = generate_hash(base, g);
let start = i * HASH_BYTES;
Row {
hash: expand_array(&h[start..start + HASH_BYTES], COLLISION_BIT_LENGTH, 0),
indices: vec![idx],
}
}
// ---------------------------------------------------------------------------
// Bucketed solver (Wagner's algorithm with back-references) — the same
// structure the GPU kernels use, on the CPU. Each round groups entries by their
// leading 24-bit collision block (which, since blocks are byte-aligned, groups
// exact collisions), emits one XOR child per colliding pair, and records the
// pair as a back-reference. After the rounds the references are walked to
// recover each candidate's 128 leaf indices, then verified + de-duplicated.
// Distinctness isn't enforced during the rounds — the few degenerate
// (index-repeating) candidates are discarded cheaply at the end, as in the GPU
// pipeline.
//
// Grouping uses xenoncat's two-level split rather than a single 2^24-wide
// counting sort: the high `TOP_BITS` of the leading block select one of
// `TOP_BUCKETS` partitions, and the remaining `LOW_BITS` are resolved by a small
// per-bucket histogram that stays resident in L1/L2 (vs. a 2^24-entry / 64 MiB
// histogram that has to be zeroed, scatter-filled, and cloned every round). Two
// entries can collide only when their *whole* leading block matches, so they
// always land in the same partition — making the partitions independent
// collision domains that are processed in parallel across the rayon pool the
// single CPU worker otherwise leaves idle.
//
// The data layout follows xenoncat's packed slots and targets AVX2 throughput:
// * Entries live in fixed 32-byte `SLOT`s (one `__m256i`); producing a child
// is a single load/xor/permute/store (`xor_child_avx2`).
// * A dense parallel `keys[]` array mirrors each entry's leading block, so the
// `partition_top`/`count_pairs`/`low_group` histogram sweeps stream over
// 4 bytes/entry instead of striding the slots.
// * `collide` runs two passes — count pairs, then emit children directly into
// one pre-sized arena at per-partition offsets — so there is no per-bucket
// allocation and no final concatenation copy; the `keys`/`slots` buffers
// ping-pong between rounds.
// * Round 0 repacks BLAKE2b digests into 24-bit blocks with `pshufb`.
// A further bandwidth step (not yet taken) is xenoncat's full radix scatter of
// the payload into bucket-contiguous storage, turning the inner-loop slot
// gathers into sequential reads.
// ---------------------------------------------------------------------------
/// 24-bit collision blocks carried by a round-0 entry (= 8 for 192,7).
const NBLK0: usize = HASH_LENGTH / COLLISION_BYTE_LENGTH;
/// High bits of the leading block used to pick a partition (12 for 192,7).
const TOP_BITS: usize = COLLISION_BIT_LENGTH / 2;
/// Low bits resolved by the per-bucket histogram (12 for 192,7).
const LOW_BITS: usize = COLLISION_BIT_LENGTH - TOP_BITS;
/// Number of top-level partitions (4096).
const TOP_BUCKETS: usize = 1 << TOP_BITS;
/// Histogram width within a partition (4096 entries → 16 KiB).
const LOW_BUCKETS: usize = 1 << LOW_BITS;
/// Mask isolating the low resolved bits.
const LOW_MASK: u32 = (LOW_BUCKETS - 1) as u32;
/// Number of u32 words in a padded entry slot (32 bytes = one AVX2 register).
/// Every round stores its residual hash words in a fixed 8-word slot so the XOR
/// that produces a child is a single 256-bit load/xor/permute/store and every
/// slot access is naturally aligned — xenoncat's packed-slot trick (and the same
/// `uint4`-aligned-slot idea the CUDA backend already uses), on the CPU. The
/// leading collision word lives in lane 0 and is mirrored into a dense parallel
/// `keys[]` array so the histogram passes stream over 4 bytes/entry instead of
/// striding the 32-byte slots.
const SLOT: usize = 8;
/// Scalar child producer: `out[0..8] = (a XOR b)` rotated left one lane; returns
/// the child's new leading word (lane 1 of the XOR). Lane 0 of the XOR is the
/// just-collided block (always zero) and is rotated out.
#[inline]
unsafe fn xor_child_scalar(out: *mut u32, a: *const u32, b: *const u32) -> u32 {
let mut x = [0u32; SLOT];
for t in 0..SLOT {
x[t] = *a.add(t) ^ *b.add(t);
}
for t in 0..SLOT {
*out.add(t) = x[(t + 1) % SLOT];
}
x[1]
}
/// AVX2 child producer: one `vpxor` + one `vpermd` (rotate the 8 lanes left by
/// one) + one store. Replaces the per-word scalar XOR loop.
#[cfg(target_arch = "x86_64")]
#[target_feature(enable = "avx2")]
unsafe fn xor_child_avx2(out: *mut u32, a: *const u32, b: *const u32) -> u32 {
use core::arch::x86_64::*;
let x = _mm256_xor_si256(
_mm256_loadu_si256(a as *const __m256i),
_mm256_loadu_si256(b as *const __m256i),
);
// rotate left by one 32-bit lane: out[i] = x[(i + 1) % 8]
let p = _mm256_permutevar8x32_epi32(x, _mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 0));
_mm256_storeu_si256(out as *mut __m256i, p);
_mm_cvtsi128_si32(_mm256_castsi256_si128(p)) as u32
}
/// Scalar round-0 repack: 24 digest bytes -> eight big-endian 24-bit blocks.
#[inline]
fn repack_index_scalar(src: &[u8], dst: &mut [u32]) {
for b in 0..NBLK0 {
let p = 3 * b;
dst[b] = ((src[p] as u32) << 16) | ((src[p + 1] as u32) << 8) | src[p + 2] as u32;
}
}
/// AVX2 round-0 repack via two `pshufb`s: gathers the eight 3-byte big-endian
/// groups straight into eight little-endian u32 lanes (the top byte of each is
/// zeroed by the 0x80 mask bytes). `src` must hold this index's 24 digest bytes.
#[cfg(target_arch = "x86_64")]
#[target_feature(enable = "avx2")]
unsafe fn repack_index_avx2(src: &[u8], dst: *mut u32) {
use core::arch::x86_64::*;
// lo half: u32 j <- src[3j..3j+3] big-endian -> LE bytes [3j+2, 3j+1, 3j, 0].
let mask_lo = _mm_setr_epi8(2, 1, 0, -128, 5, 4, 3, -128, 8, 7, 6, -128, 11, 10, 9, -128);
// hi half loads from src+8, so its byte indices are the above minus 8.
let mask_hi = _mm_setr_epi8(6, 5, 4, -128, 9, 8, 7, -128, 12, 11, 10, -128, 15, 14, 13, -128);
let a = _mm_loadu_si128(src.as_ptr() as *const __m128i); // src[0..16]
let b = _mm_loadu_si128(src.as_ptr().add(8) as *const __m128i); // src[8..24]
_mm_storeu_si128(dst as *mut __m128i, _mm_shuffle_epi8(a, mask_lo));
_mm_storeu_si128((dst as *mut __m128i).add(1), _mm_shuffle_epi8(b, mask_hi));
}
/// Repack one index's digest into its eight-word slot. Dispatches to AVX2.
#[inline]
fn repack_index(src: &[u8], dst: &mut [u32]) {
#[cfg(target_arch = "x86_64")]
{
if is_x86_feature_detected!("avx2") {
unsafe { repack_index_avx2(src, dst.as_mut_ptr()) };
return;
}
}
repack_index_scalar(src, dst);
}
/// Partition the `n` entries into `TOP_BUCKETS` runs by the high `TOP_BITS` of
/// their (dense) leading block. Returns `(starts, order)`, where partition `v`
/// owns the input indices `order[starts[v]..starts[v + 1]]`. The histogram
/// passes stream over `keys[]` (4 bytes/entry) instead of striding the slots.
fn partition_top(keys: &[u32], n: usize) -> (Vec<u32>, Vec<u32>) {
let mut starts = vec![0u32; TOP_BUCKETS + 1];
for k in 0..n {
starts[(keys[k] >> LOW_BITS) as usize + 1] += 1;
}
for i in 0..TOP_BUCKETS {
starts[i + 1] += starts[i];
}
let mut order = vec![0u32; n];
let mut cur = starts.clone(); // small: TOP_BUCKETS + 1 entries
for k in 0..n {
let b = (keys[k] >> LOW_BITS) as usize;
order[cur[b] as usize] = k as u32;
cur[b] += 1;
}
(starts, order)
}
/// Count the colliding pairs a partition will emit, from the low-bit histogram
/// alone (no reordering). `clamp` caps each exact-collision group, matching the
/// emit pass so the output offsets line up. `hist` is reusable `LOW_BUCKETS`
/// scratch.
fn count_pairs(keys: &[u32], run: &[u32], hist: &mut [u32], clamp: usize) -> usize {
for h in hist.iter_mut() {
*h = 0;
}
for &k in run {
hist[(keys[k as usize] & LOW_MASK) as usize] += 1;
}
let mut pairs = 0usize;
for i in 0..LOW_BUCKETS {
let c = (hist[i] as usize).min(clamp);
pairs += c * (c - 1) / 2;
}
pairs
}
/// Within one partition, group `run`'s entries by the low bits of their leading
/// block, writing the grouped indices into `sorted`. `hist` is reusable
/// `LOW_BUCKETS + 1` scratch. After this call `sorted` lists the run's indices
/// with equal low keys contiguous, so callers recover each exact-collision
/// group by walking adjacent equal keys.
fn low_group(keys: &[u32], run: &[u32], hist: &mut [u32], sorted: &mut Vec<u32>) {
let m = run.len();
sorted.clear();
if m == 0 {
return;
}
for h in hist.iter_mut() {
*h = 0;
}
for &k in run {
hist[(keys[k as usize] & LOW_MASK) as usize + 1] += 1;
}
for i in 0..LOW_BUCKETS {
hist[i + 1] += hist[i];
}
sorted.resize(m, 0);
// hist[low] now holds the run-start offset; reuse it as the live cursor.
for &k in run {
let low = (keys[k as usize] & LOW_MASK) as usize;
sorted[hist[low] as usize] = k;
hist[low] += 1;
}
}
/// Walk a partition's grouped entries (`sorted`) and emit one child per
/// colliding pair into the partition's output sub-slices, returning the count
/// written. `clamp` bounds each exact-collision group (`usize::MAX` = exact).
/// Monomorphised over the XOR producer so the AVX2 intrinsics inline cleanly
/// inside a `target_feature` wrapper while sharing one source of truth.
macro_rules! emit_bucket_body {
($keys:expr, $slots:expr, $sorted:expr, $kout:expr, $sout:expr, $pout:expr, $clamp:expr, $xor:path) => {{
let s = $sorted;
let m = s.len();
let mut w = 0usize;
let mut i = 0;
while i < m {
let key = $keys[s[i] as usize] & LOW_MASK;
let mut j = i + 1;
while j < m && ($keys[s[j] as usize] & LOW_MASK) == key {
j += 1;
}
let hi = j.min(i.saturating_add($clamp));
for a in i..hi {
let l = s[a] as usize;
for b in (a + 1)..hi {
let mr = s[b] as usize;
let nk = $xor(
$sout.as_mut_ptr().add(w * SLOT),
$slots.as_ptr().add(l * SLOT),
$slots.as_ptr().add(mr * SLOT),
);
$kout[w] = nk;
$pout[w] = ((l as u64) << 32) | mr as u64;
w += 1;
}
}
i = j;
}
w
}};
}
unsafe fn emit_bucket_scalar(
keys: &[u32],
slots: &[u32],
sorted: &[u32],
kout: &mut [u32],
sout: &mut [u32],
pout: &mut [u64],
clamp: usize,
) -> usize {
emit_bucket_body!(keys, slots, sorted, kout, sout, pout, clamp, xor_child_scalar)
}
#[cfg(target_arch = "x86_64")]
#[target_feature(enable = "avx2")]
unsafe fn emit_bucket_avx2(
keys: &[u32],
slots: &[u32],
sorted: &[u32],
kout: &mut [u32],
sout: &mut [u32],
pout: &mut [u64],
clamp: usize,
) -> usize {
emit_bucket_body!(keys, slots, sorted, kout, sout, pout, clamp, xor_child_avx2)
}
/// Emit a partition's children, dispatching to the AVX2 producer when available.
unsafe fn emit_bucket(
keys: &[u32],
slots: &[u32],
sorted: &[u32],
kout: &mut [u32],
sout: &mut [u32],
pout: &mut [u64],
clamp: usize,
) -> usize {
#[cfg(target_arch = "x86_64")]
{
if is_x86_feature_detected!("avx2") {
return emit_bucket_avx2(keys, slots, sorted, kout, sout, pout, clamp);
}
}
emit_bucket_scalar(keys, slots, sorted, kout, sout, pout, clamp)
}
/// Group `n` entries by their leading block, then emit one child per colliding
/// pair: the XOR of the residual blocks (rotated into a fresh 8-word slot) plus
/// a packed `(l << 32) | mr` back-reference. Two passes — count, then emit
/// directly into one pre-sized arena — so there is no per-partition allocation
/// or final concatenation copy. Returns `(keys_out, slots_out, parents)`.
fn collide(keys: &[u32], slots: &[u32], n: usize, clamp: usize) -> (Vec<u32>, Vec<u32>, Vec<u64>) {
let (starts, order) = partition_top(keys, n);
// Pass 1: per-partition child counts (histogram-derived, no reordering).
let counts: Vec<usize> = (0..TOP_BUCKETS)
.into_par_iter()
.map_init(
|| vec![0u32; LOW_BUCKETS],
|hist, v| {
let run = &order[starts[v] as usize..starts[v + 1] as usize];
count_pairs(keys, run, hist, clamp)
},
)
.collect();
let mut out_starts = vec![0usize; TOP_BUCKETS + 1];
for v in 0..TOP_BUCKETS {
out_starts[v + 1] = out_starts[v] + counts[v];
}
let total = out_starts[TOP_BUCKETS];
let mut keys_out = vec![0u32; total];
let mut slots_out = vec![0u32; total * SLOT];
let mut parents = vec![0u64; total];
// Carve the output arena into disjoint per-partition sub-slices so workers
// write their children directly into place (no concatenation).
let mut kparts: Vec<&mut [u32]> = Vec::with_capacity(TOP_BUCKETS);
let mut sparts: Vec<&mut [u32]> = Vec::with_capacity(TOP_BUCKETS);
let mut pparts: Vec<&mut [u64]> = Vec::with_capacity(TOP_BUCKETS);
{
let (mut kr, mut sr, mut pr) = (&mut keys_out[..], &mut slots_out[..], &mut parents[..]);
for &c in &counts {
let (kh, kt) = kr.split_at_mut(c);
let (sh, st) = sr.split_at_mut(c * SLOT);
let (ph, pt) = pr.split_at_mut(c);
kparts.push(kh);
sparts.push(sh);
pparts.push(ph);
kr = kt;
sr = st;
pr = pt;
}
}
// Pass 2: group each partition and emit its colliding pairs in place.
kparts
.into_par_iter()
.zip(sparts)
.zip(pparts)
.enumerate()
.for_each(|(v, ((kout, sout), pout))| {
let run = &order[starts[v] as usize..starts[v + 1] as usize];
let mut hist = vec![0u32; LOW_BUCKETS + 1];
let mut sorted = Vec::new();
low_group(keys, run, &mut hist, &mut sorted);
let w = unsafe { emit_bucket(keys, slots, &sorted, kout, sout, pout, clamp) };
debug_assert_eq!(w, kout.len());
});
(keys_out, slots_out, parents)
}
/// Final round (slots hold `[w0, w1, …]`): among entries sharing leading block
/// `w0`, a pair whose `w1` also matches XORs the last two blocks to zero — a
/// candidate. Returns the `(l, mr)` parents of each candidate.
fn collide_final(keys: &[u32], slots: &[u32], n: usize, clamp: usize) -> Vec<(u32, u32)> {
let (starts, order) = partition_top(keys, n);
(0..TOP_BUCKETS)
.into_par_iter()
.map_init(
|| (vec![0u32; LOW_BUCKETS + 1], Vec::<u32>::new()),
|(hist, sorted), v| {
let run = &order[starts[v] as usize..starts[v + 1] as usize];
low_group(keys, run, hist, sorted);
let m = sorted.len();
let mut local = Vec::new();
let mut i = 0;
while i < m {
let key = keys[sorted[i] as usize] & LOW_MASK;
let mut j = i + 1;
while j < m && (keys[sorted[j] as usize] & LOW_MASK) == key {
j += 1;
}
let hi = j.min(i.saturating_add(clamp));
for a in i..hi {
let l = sorted[a] as usize;
for b in (a + 1)..hi {
let mr = sorted[b] as usize;
if slots[l * SLOT + 1] == slots[mr * SLOT + 1] {
local.push((l as u32, mr as u32));
}
}
}
i = j;
}
local
},
)
.reduce(Vec::new, |mut acc, mut v| {
acc.append(&mut v);
acc
})
}
/// CPU solver, exact (no clamp): hash the first round with BLAKE2b, run the
/// bucketed collision rounds, recover each candidate's leaves, then verify +
/// de-duplicate.
///
/// WARNING: with no clamp this runs the naive (basic-spec) Wagner algorithm,
/// which does not track index distinctness during the rounds. For dense
/// Equihash 192,7 headers the degenerate (duplicate-index) collisions cascade in
/// the last rounds and the candidate count explodes — easily tens of GB of
/// recovery buffers. Mining and `--selftest` use [`solve_with`] with a clamp
/// instead (the same bound the GPU enforces via fixed-size bucket slots). Use
/// this only when you specifically want unclamped semantics and have bounded the
/// header.
#[allow(dead_code)] // exact public API; callers use solve_with (clamp 0 == exact)
pub fn solve(header: &[u8]) -> Vec<Vec<u32>> {
solve_with(header, None)
}
/// As [`solve`], but optionally clamps each exact-collision group to `clamp`
/// entries. Clamping bounds the naive algorithm's degenerate-collision blow-up
/// (xenoncat's / the GPU's bounded buckets), trading a small, probabilistic loss
/// of solutions for a working, fast solve. `None` is exact (see the warning on
/// [`solve`]); a clamp around 1664 keeps the ~2 real solutions per nonce.
pub fn solve_with(header: &[u8], clamp: Option<usize>) -> Vec<Vec<u32>> {
let clamp = clamp.unwrap_or(usize::MAX);
// ---- round 0: hash every index into NBLK0 big-endian 24-bit blocks, stored
// in padded 8-word slots with the leading block mirrored into `keys`. Entry
// k corresponds to leaf index k (the gen order), so no leaf table is needed.
// The midstate hasher emits four `g` digests per call (AVX2), each yielding
// INDICES_PER_HASH_OUTPUT entries; one chunk = four `g` values = 8 entries.
let n0 = INIT_SIZE;
let hasher = BatchHasher::new(header);
let mut keys: Vec<u32> = vec![0u32; n0];
let mut slots: Vec<u32> = vec![0u32; n0 * SLOT];
let kgroup = 4 * INDICES_PER_HASH_OUTPUT; // eight entries
let sgroup = kgroup * SLOT;
debug_assert_eq!(n0 % kgroup, 0, "round-0 buffer must split into whole 4-g groups");
slots
.par_chunks_mut(sgroup)
.zip(keys.par_chunks_mut(kgroup))
.enumerate()
.for_each(|(c, (schunk, kchunk))| {
let g0 = (c * 4) as u32;
let mut hs = [[0u8; HASH_OUTPUT]; 4];
hasher.hash4(g0, &mut hs);
for j in 0..4 {
for i in 0..INDICES_PER_HASH_OUTPUT {
let e = j * INDICES_PER_HASH_OUTPUT + i;
let src = &hs[j][i * HASH_BYTES..i * HASH_BYTES + HASH_BYTES];
let dst = &mut schunk[e * SLOT..e * SLOT + SLOT];
repack_index(src, dst);
kchunk[e] = dst[0];
}
}
});
// ---- collision rounds: 6 intermediate rounds (tables 1..6), then final.
// parents[t] (t = 0..K-2) maps a round-(t+1) entry to its two round-t parents.
// `keys`/`slots` ping-pong between rounds (the previous buffers are freed as
// the new ones replace them).
let mut parents: Vec<Vec<u64>> = Vec::with_capacity(K - 1);
let mut n = n0;
for _ in 0..(K - 1) {
let (ok, os, op) = collide(&keys, &slots, n, clamp);
n = op.len();
parents.push(op);
keys = ok;
slots = os;
if n == 0 {
return Vec::new();
}
}
let candidates = collide_final(&keys, &slots, n, clamp);
if candidates.is_empty() {
return Vec::new();
}
// ---- recover 128 leaf indices per candidate by walking back-references.
let mut recovered: Vec<u32> = Vec::with_capacity(candidates.len() * SOLUTION_INDICES);
let mut refs: Vec<u32> = Vec::with_capacity(SOLUTION_INDICES);
let mut next: Vec<u32> = Vec::with_capacity(SOLUTION_INDICES);
for (a, b) in candidates {
refs.clear();
refs.push(a);
refs.push(b);
for par in parents.iter().rev() {
next.clear();
for &x in &refs {
let p = par[x as usize];
next.push((p >> 32) as u32);
next.push((p & 0xffff_ffff) as u32);
}
std::mem::swap(&mut refs, &mut next);
}
// refs are now round-0 indices == leaf indices.
recovered.extend_from_slice(&refs);
}
filter_candidates(&base_state(header), &recovered)
}
/// Re-order recovered leaf indices into the canonical solution ordering: at
/// every tree node the subtree with the smaller leading index comes first.
///
/// Both the CPU and GPU solvers recover the 128 leaves in tree in-order but do
/// not order sibling subtrees; this restores the ordering the spec (and
/// verifier) require.
pub fn canonicalize(leaves: &[u32]) -> Vec<u32> {
if leaves.len() <= 1 {
return leaves.to_vec();
}
let half = leaves.len() / 2;
let left = canonicalize(&leaves[..half]);
let right = canonicalize(&leaves[half..]);
let mut out = Vec::with_capacity(leaves.len());
if left[0] < right[0] {
out.extend_from_slice(&left);
out.extend_from_slice(&right);
} else {
out.extend_from_slice(&right);
out.extend_from_slice(&left);
}
out
}
/// Filter raw GPU-recovered candidates (`n * SOLUTION_INDICES` leaf indices)
/// into valid, canonical, de-duplicated solutions. A cheap distinctness check
/// rejects the many degenerate (duplicate-index) candidates before the costlier
/// full verification. Shared by the CPU and GPU solvers.
pub fn filter_candidates(base: &State, recovered: &[u32]) -> Vec<Vec<u32>> {
let mut seen = HashSet::new();
let mut result = Vec::new();
for chunk in recovered.chunks_exact(SOLUTION_INDICES) {
let unique: HashSet<u32> = chunk.iter().copied().collect();
if unique.len() != SOLUTION_INDICES {
continue; // degenerate: repeated leaf indices
}
let canon = canonicalize(chunk);
if !is_valid_solution(base, &canon) {
continue;
}
let mut key = canon.clone();
key.sort_unstable();
if seen.insert(key) {
result.push(canon);
}
}
result
}
/// Verify a candidate solution against the spec: correct length, globally
/// distinct indices, the proper collisions at every tree level, the canonical
/// index ordering, and an all-zero final XOR.
pub fn is_valid_solution(base: &State, indices: &[u32]) -> bool {
if indices.len() != SOLUTION_INDICES {
return false;
}
// All 2^k indices must be globally distinct.
let unique: HashSet<u32> = indices.iter().copied().collect();
if unique.len() != indices.len() {
return false;
}
let mut rows: Vec<Row> = indices.iter().map(|&idx| leaf_row(base, idx)).collect();
let cb = COLLISION_BYTE_LENGTH;
while rows.len() > 1 {
let mut next = Vec::with_capacity(rows.len() / 2);
for pair in rows.chunks(2) {
let (a, b) = (&pair[0], &pair[1]);
// Leading collision block must match.
if a.hash[..cb] != b.hash[..cb] {
return false;
}
// Canonical ordering: smaller leading index on the left.
if a.indices[0] >= b.indices[0] {
return false;
}
let len = a.hash.len();
let mut nh = Vec::with_capacity(len - cb);
for x in cb..len {
nh.push(a.hash[x] ^ b.hash[x]);
}
let mut ni = a.indices.clone();
ni.extend_from_slice(&b.indices);
next.push(Row { hash: nh, indices: ni });
}
rows = next;
}
rows[0].hash.iter().all(|&x| x == 0)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn expand_compress_roundtrip() {
// 128 indices of 25 bits each round-trip through compress/expand.
let indices: Vec<u32> = (0..SOLUTION_INDICES as u32).map(|i| i * 7919 % INIT_SIZE as u32).collect();
let packed = indices_to_solution(&indices);
assert_eq!(packed.len(), SOLUTION_BYTES);
let back = solution_to_indices(&packed);
assert_eq!(back, indices);
}
#[test]
fn collision_block_sizes() {
assert_eq!(COLLISION_BIT_LENGTH, 24);
assert_eq!(HASH_LENGTH, 24);
assert_eq!(SOLUTION_INDICES, 128);
assert_eq!(SOLUTION_BYTES, 400);
assert_eq!(BLAKE_CALLS, 1 << 24);
}
// AVX2 round-0 repack must match the scalar reference for arbitrary digest
// bytes (24 valid bytes per index).
#[test]
fn repack_matches_scalar() {
let src: Vec<u8> = (0..24u32).map(|i| (i.wrapping_mul(37).wrapping_add(11)) as u8).collect();
let mut a = [0u32; NBLK0];
let mut b = [0u32; NBLK0];
repack_index_scalar(&src, &mut a);
#[cfg(target_arch = "x86_64")]
if is_x86_feature_detected!("avx2") {
unsafe { repack_index_avx2(&src, b.as_mut_ptr()) };
assert_eq!(a, b, "avx2 repack != scalar");
}
// Block 0 is the big-endian 24-bit value of the first three bytes.
assert_eq!(a[0], (src[0] as u32) << 16 | (src[1] as u32) << 8 | src[2] as u32);
}
// AVX2 XOR-child (xor + rotate-left-one-lane) must match the scalar version.
#[test]
fn xor_child_matches_scalar() {
let pa: [u32; SLOT] = [9, 8, 7, 6, 5, 4, 3, 2];
let pb: [u32; SLOT] = [1, 2, 3, 4, 5, 6, 7, 8];
let mut o1 = [0u32; SLOT];
let mut o2 = [0u32; SLOT];
let k1 = unsafe { xor_child_scalar(o1.as_mut_ptr(), pa.as_ptr(), pb.as_ptr()) };
// Reference: rotate-left-one of the lane-wise XOR; new key = lane 1.
let x: Vec<u32> = (0..SLOT).map(|i| pa[i] ^ pb[i]).collect();
let expect: Vec<u32> = (0..SLOT).map(|i| x[(i + 1) % SLOT]).collect();
assert_eq!(&o1[..], &expect[..]);
assert_eq!(k1, x[1]);
#[cfg(target_arch = "x86_64")]
if is_x86_feature_detected!("avx2") {
let k2 = unsafe { xor_child_avx2(o2.as_mut_ptr(), pa.as_ptr(), pb.as_ptr()) };
assert_eq!(o1, o2, "avx2 xor_child != scalar");
assert_eq!(k1, k2);
}
}
// Clamped solve over a fixed header must find valid solutions (Equihash
// 192,7 yields ~2 per nonce). The clamp bounds the naive algorithm's
// degenerate-collision blow-up, mirroring the GPU's fixed bucket slots.
#[test]
#[ignore]
fn full_solve_finds_valid_solutions() {
let header = vec![0x42u8; HEADER_LEN];
let base = base_state(&header);
for clamp in [8usize, 16, 32, 64] {
let t = std::time::Instant::now();
let sols = solve_with(&header, Some(clamp));
let ms = t.elapsed().as_secs_f64() * 1000.0;
eprintln!("clamp={clamp}: {} solution(s) in {ms:.0} ms", sols.len());
for s in &sols {
assert!(is_valid_solution(&base, s), "solver returned an invalid solution");
}
}
}
}
+562
View File
@@ -0,0 +1,562 @@
//! CUDA Ethash backend (feature `ethash`, default-off) — drives miniZ's extracted
//! Ethash/etchash solver by replaying a captured launch trace, the same idea as
//! `src/cuda.rs` for Equihash 192,7 but adapted to Ethash's DAG+search shape.
//!
//! ## What was reverse-engineered (see `src/ethash/README.md`, `pearl-dump/`)
//!
//! miniZ resolves the driver API via `dlopen("libcuda.so.1")` + `dlsym`, so the
//! launch trace was captured with `pearl-dump/dlhook.so` (redirects that dlopen to
//! `cuhook.so`) + `pearl-dump/cuhook.so` (logs allocs, `cuModuleGetGlobal`
//! constants, HtoD, and — packing the `kernelParams` array by the demangled
//! signatures — every kernel's args). The recovered ABI:
//!
//! * **DAG build** — `digitf<…>(u32 start, hash64* dag, u64 dag_items,
//! hash64* cache, u32 cache_items, …)` launched 539× with grid 512 / block
//! 256, `start` stepping by 512*256 to cover the DAG. Only `start` varies.
//! * **Search** — `equihash<…>(u64 start_nonce, Search_results* out)` (miniZ's
//! name; it's Dagger-Hashimoto). The DAG pointer, header and target are NOT
//! args — they live in `__constant__` symbols: `d_dag` (DAG base), `d_header`
//! (32 B), `d_target` (8 B boundary), plus `d_dag_size`/`i_dag_size`/`d_maxmem`.
//! * The **light cache** miniZ uploads (≈67 MB) is captured verbatim to a
//! sidecar so the DAG can be rebuilt and CPU verification uses the same cache.
//!
//! ## How a solve works here
//!
//! `new()` allocates our own DAG/cache/results buffers, uploads the captured
//! cache, writes the constants (rebasing `d_dag` to our DAG), and replays the 539
//! `digitf` launches to build the DAG. `search()` writes `d_header`/`d_target`,
//! launches the `equihash` kernel over a nonce batch, and reads back the
//! `Search_results`. Every GPU nonce is re-checked on the CPU (`verify`) before it
//! could ever be submitted, so a wrong replay can only yield nothing, never a bad
//! share. `selftest()` proves the path end-to-end without a pool.
use std::collections::HashMap;
use std::ffi::{c_int, c_uint, c_void, CStr, CString};
use std::ptr;
use anyhow::{anyhow, Context, Result};
/// CPU light verifier (real Ethash; gates shares before submit).
pub mod verify;
/// Ethash stratum dialect + mining loop.
pub mod stratum;
/// miniZ's Ethash solver, 8 arches (sm_50/60/61/70/75/80/86/120). Same fatbin
/// also covers etchash/ubqhash/reth.
static FATBIN: &[u8] = include_bytes!("ethash/ethash.fatbin");
/// The captured launch trace (alloc table, constant writes, digitf + equihash
/// launches). The ≈67 MB light-cache sidecar it references (`file=…`) is read at
/// runtime from the path recorded in the trace.
static RECORDING: &str = include_str!("ethash/recording.log");
// ---- CUDA Driver API FFI (subset; mirrors src/cuda.rs) ----
type CUresult = c_int;
type CUdevice = c_int;
type CUcontext = *mut c_void;
type CUmodule = *mut c_void;
type CUfunction = *mut c_void;
type CUdeviceptr = u64;
const CUDA_SUCCESS: CUresult = 0;
const CU_LAUNCH_PARAM_END: usize = 0x00;
const CU_LAUNCH_PARAM_BUFFER_POINTER: usize = 0x01;
const CU_LAUNCH_PARAM_BUFFER_SIZE: usize = 0x02;
extern "C" {
fn cuInit(flags: c_uint) -> CUresult;
fn cuDeviceGet(device: *mut CUdevice, ordinal: c_int) -> CUresult;
fn cuCtxCreate_v2(pctx: *mut CUcontext, flags: c_uint, dev: CUdevice) -> CUresult;
fn cuCtxDestroy_v2(ctx: CUcontext) -> CUresult;
fn cuCtxSetCurrent(ctx: CUcontext) -> CUresult;
fn cuModuleLoadData(module: *mut CUmodule, image: *const c_void) -> CUresult;
fn cuModuleUnload(module: CUmodule) -> CUresult;
fn cuModuleGetFunction(f: *mut CUfunction, m: CUmodule, name: *const i8) -> CUresult;
fn cuModuleGetGlobal_v2(dptr: *mut CUdeviceptr, bytes: *mut usize, m: CUmodule, name: *const i8) -> CUresult;
fn cuMemAlloc_v2(dptr: *mut CUdeviceptr, bytesize: usize) -> CUresult;
fn cuMemFree_v2(dptr: CUdeviceptr) -> CUresult;
fn cuMemsetD8_v2(dptr: CUdeviceptr, uc: u8, n: usize) -> CUresult;
fn cuMemcpyHtoD_v2(dst: CUdeviceptr, src: *const c_void, n: usize) -> CUresult;
fn cuMemcpyDtoH_v2(dst: *mut c_void, src: CUdeviceptr, n: usize) -> CUresult;
fn cuLaunchKernel(
f: CUfunction, gx: c_uint, gy: c_uint, gz: c_uint,
bx: c_uint, by: c_uint, bz: c_uint, shared: c_uint, stream: *mut c_void,
params: *mut *mut c_void, extra: *mut *mut c_void,
) -> CUresult;
fn cuCtxSynchronize() -> CUresult;
fn cuGetErrorName(error: CUresult, s: *mut *const i8) -> CUresult;
}
fn check(code: CUresult, what: &str) -> Result<()> {
if code == CUDA_SUCCESS {
return Ok(());
}
let name = unsafe {
let mut p: *const i8 = ptr::null();
if cuGetErrorName(code, &mut p) == CUDA_SUCCESS && !p.is_null() {
CStr::from_ptr(p).to_string_lossy().into_owned()
} else {
format!("CUDA error {code}")
}
};
Err(anyhow!("{what} failed: {name}"))
}
// ---- recording parser ----
fn hex_to_bytes(h: &str) -> Vec<u8> {
(0..h.len() / 2)
.map(|i| u8::from_str_radix(&h[2 * i..2 * i + 2], 16).unwrap_or(0))
.collect()
}
fn triplet(s: &str) -> (u32, u32, u32) {
let v: Vec<u32> = s.split(',').filter_map(|x| x.parse().ok()).collect();
(v.first().copied().unwrap_or(1), v.get(1).copied().unwrap_or(1), v.get(2).copied().unwrap_or(1))
}
struct Launch {
name: String,
grid: (u32, u32, u32),
block: (u32, u32, u32),
shared: u32,
arg: Vec<u8>,
}
/// Everything the replay needs, distilled from the trace.
struct Recording {
allocs: Vec<(u64, u64)>, // (base, size)
consts: Vec<(String, Vec<u8>)>, // constant-symbol writes (sym -> bytes)
cache_base: u64,
cache_size: u64,
cache_file: String,
digitf: Vec<Launch>, // the 539 DAG-build launches
search: Launch, // the first equihash launch (main pool)
dag_base: u64, // d_dag value (captured DAG base)
results_base: u64, // equihash arg[8..16] (captured results ptr)
}
fn field_u64(arg: &[u8], off: usize) -> u64 {
u64::from_le_bytes(arg[off..off + 8].try_into().unwrap())
}
fn parse_recording(text: &str) -> Result<Recording> {
let mut allocs = Vec::new();
let mut consts: Vec<(String, Vec<u8>)> = Vec::new();
let (mut cache_base, mut cache_size, mut cache_file) = (0u64, 0u64, String::new());
let mut digitf = Vec::new();
let mut search: Option<Launch> = None;
let mut dag_base = 0u64;
for line in text.lines() {
if let Some(rest) = line.strip_prefix("[alloc] ") {
// "<size> bytes @ 0x<base>"
let p: Vec<&str> = rest.split_whitespace().collect();
if let (Ok(size), Some(hex)) = (p[0].parse::<u64>(), p.get(3).and_then(|s| s.strip_prefix("0x"))) {
if let Ok(base) = u64::from_str_radix(hex, 16) {
allocs.push((base, size));
}
}
} else if let Some(rest) = line.strip_prefix("[htod] ") {
// "dst=0x.. size=N [(async)] [sym=X] [file=P] first=HEX"
let mut dst = 0u64;
let mut size = 0u64;
let mut sym = None;
let mut file = None;
let mut first = "";
for tok in rest.split_whitespace() {
if let Some(v) = tok.strip_prefix("dst=0x") { dst = u64::from_str_radix(v, 16).unwrap_or(0); }
else if let Some(v) = tok.strip_prefix("size=") { size = v.parse().unwrap_or(0); }
else if let Some(v) = tok.strip_prefix("sym=") { sym = Some(v.to_string()); }
else if let Some(v) = tok.strip_prefix("file=") { file = Some(v.to_string()); }
else if let Some(v) = tok.strip_prefix("first=") { first = v; }
}
if let Some(f) = file {
cache_base = dst;
cache_size = size;
cache_file = f;
}
if let Some(s) = sym {
// `first=` carries up to 32 bytes — full value for every constant here.
let bytes = hex_to_bytes(first);
let n = (size as usize).min(bytes.len());
let val = bytes[..n].to_vec();
if s == "d_dag" && val.len() >= 8 {
dag_base = u64::from_le_bytes(val[..8].try_into().unwrap());
}
// keep the last write per symbol (header/target get rewritten)
if let Some(e) = consts.iter_mut().find(|(k, _)| *k == s) { e.1 = val; }
else { consts.push((s, val)); }
}
} else if let Some(rest) = line.strip_prefix("[REC] ") {
let mut name = "";
let (mut g, mut b, mut sh, mut arg) = ("", "", 0u32, "");
for (i, tok) in rest.split_whitespace().enumerate() {
if i == 0 { name = tok; }
else if let Some(v) = tok.strip_prefix("g=") { g = v; }
else if let Some(v) = tok.strip_prefix("b=") { b = v; }
else if let Some(v) = tok.strip_prefix("sh=") { sh = v.parse().unwrap_or(0); }
else if let Some(v) = tok.strip_prefix("arg=") { arg = v; }
}
let l = Launch {
name: name.to_string(),
grid: triplet(g),
block: triplet(b),
shared: sh,
arg: hex_to_bytes(arg),
};
if name.starts_with("_Z6digitf") {
digitf.push(l);
} else if name.starts_with("_Z8equihash") && search.is_none() {
search = Some(l); // first equihash after the DAG = main-pool search kernel
}
}
}
let search = search.ok_or_else(|| anyhow!("no equihash (search) launch in recording"))?;
if digitf.is_empty() {
return Err(anyhow!("no digitf (DAG-build) launches in recording"));
}
if cache_file.is_empty() {
return Err(anyhow!("recording has no light-cache sidecar (file=…) line"));
}
if dag_base == 0 {
return Err(anyhow!("recording has no d_dag constant write"));
}
let results_base = if search.arg.len() >= 16 { field_u64(&search.arg, 8) } else { 0 };
Ok(Recording { allocs, consts, cache_base, cache_size, cache_file, digitf, search, dag_base, results_base })
}
// ---- Search_results readback ----
//
// Layout recovered empirically (see `selftest`): the kernel keeps up to
// MAX_RESULTS match slots — `mix[i]` (32 B) at offset `i*32`, and the matched
// nonce as a u64 at `NONCE_BASE + i*8`. The mix array fills 0x00..0x100, so there
// are 8 slots. We zero the buffer before each launch, so an unused slot reads as
// nonce 0 / zero mix and is skipped; the CPU verifier is the real gate regardless.
const RESULTS_BYTES: usize = 1 << 20;
const MAX_RESULTS: usize = 8;
const NONCE_BASE: usize = 0x100;
#[derive(Clone, Debug, Default)]
pub struct Found {
pub nonce: u64,
pub mix: [u8; 32],
}
/// Convert a 256-bit big-endian boundary to miniZ's `d_target`: the top 64 bits
/// as a little-endian u64 (the kernel compares `be_top64(result) <= d_target`).
fn target8(target: &[u8; 32]) -> [u8; 8] {
u64::from_be_bytes(target[0..8].try_into().unwrap()).to_le_bytes()
}
pub struct SearchResult {
pub found: Vec<Found>,
}
pub struct EthashSolver {
ctx: CUcontext,
module: CUmodule,
bufs: Vec<CUdeviceptr>,
my_dag: CUdeviceptr,
my_cache: CUdeviceptr,
my_results: CUdeviceptr,
/// captured device ptr -> our device ptr (DAG / cache / results)
remap: HashMap<u64, u64>,
digitf: Vec<(CUfunction, (u32, u32, u32), (u32, u32, u32), u32, Vec<u8>)>,
search_fn: CUfunction,
search_block: (u32, u32, u32),
search_arg: Vec<u8>,
/// raw cache bytes (kept for CPU cross-check via verify::Light::from_raw)
cache_bytes: Vec<u8>,
full_size: usize,
}
unsafe impl Send for EthashSolver {}
impl EthashSolver {
/// Load the fatbin, build the DAG by replaying the captured trace. Uses the
/// bundled recording; the light-cache sidecar is read from the path the
/// recording names (override the recording text via `recording_override`).
pub fn new(device_index: usize) -> Result<Self> {
Self::with_recording(device_index, RECORDING)
}
pub fn with_recording(device_index: usize, recording: &str) -> Result<Self> {
let rec = parse_recording(recording)?;
let cache_bytes = std::fs::read(&rec.cache_file)
.with_context(|| format!("read ethash light-cache sidecar '{}'", rec.cache_file))?;
if cache_bytes.len() as u64 != rec.cache_size {
return Err(anyhow!("cache sidecar size {} != recorded {}", cache_bytes.len(), rec.cache_size));
}
// DAG buffer size = the alloc whose base == d_dag (padded). The dataset
// size the kernels actually index by is `d_dag_size` *128-byte* rows, so
// the hashimoto full_size (bytes) = d_dag_size * 128 (≠ the padded alloc).
let dag_size = rec.allocs.iter().find(|&&(b, _)| b == rec.dag_base).map(|&(_, s)| s)
.ok_or_else(|| anyhow!("d_dag base not found in alloc table"))?;
let dag_rows_128 = rec.consts.iter().find(|(k, _)| k == "d_dag_size")
.and_then(|(_, v)| v.get(..4)).map(|b| u32::from_le_bytes(b.try_into().unwrap()) as usize)
.ok_or_else(|| anyhow!("recording has no d_dag_size constant"))?;
let full_size = dag_rows_128 * 128;
unsafe {
check(cuInit(0), "cuInit")?;
let mut dev: CUdevice = 0;
check(cuDeviceGet(&mut dev, device_index as c_int), "cuDeviceGet")?;
let mut ctx: CUcontext = ptr::null_mut();
check(cuCtxCreate_v2(&mut ctx, 0, dev), "cuCtxCreate")?;
check(cuCtxSetCurrent(ctx), "cuCtxSetCurrent")?;
let mut module: CUmodule = ptr::null_mut();
check(cuModuleLoadData(&mut module, FATBIN.as_ptr() as *const c_void), "cuModuleLoadData (ethash)")?;
let mut bufs = Vec::new();
let alloc = |sz: usize, bufs: &mut Vec<CUdeviceptr>| -> Result<CUdeviceptr> {
let mut p: CUdeviceptr = 0;
check(cuMemAlloc_v2(&mut p, sz), "cuMemAlloc")?;
check(cuMemsetD8_v2(p, 0, sz), "cuMemsetD8")?;
bufs.push(p);
Ok(p)
};
let my_dag = alloc(dag_size as usize, &mut bufs)?;
let my_cache = alloc(cache_bytes.len(), &mut bufs)?;
let my_results = alloc(RESULTS_BYTES, &mut bufs)?;
// Upload the captured light cache.
check(cuMemcpyHtoD_v2(my_cache, cache_bytes.as_ptr() as *const c_void, cache_bytes.len()), "cuMemcpyHtoD(cache)")?;
let mut remap = HashMap::new();
remap.insert(rec.dag_base, my_dag);
remap.insert(rec.cache_base, my_cache);
if rec.results_base != 0 { remap.insert(rec.results_base, my_results); }
// Write the constants (rebasing d_dag to our DAG buffer).
for (sym, bytes) in &rec.consts {
if sym == "d_header" || sym == "d_target" {
continue; // set per-search
}
let mut v = bytes.clone();
if sym == "d_dag" && v.len() >= 8 {
v[..8].copy_from_slice(&my_dag.to_le_bytes());
}
set_global(module, sym, &v)?;
}
// Resolve + rebase the digitf launches, then replay them to build the DAG.
let mut digitf = Vec::with_capacity(rec.digitf.len());
for l in &rec.digitf {
let f = get_function(module, &l.name)?;
let arg = rebase(&l.arg, &remap);
digitf.push((f, l.grid, l.block, l.shared, arg));
}
let search_fn = get_function(module, &rec.search.name)?;
let search_arg = rebase(&rec.search.arg, &remap);
let solver = Self {
ctx, module, bufs, my_dag, my_cache, my_results, remap,
digitf, search_fn, search_block: rec.search.block, search_arg,
cache_bytes, full_size,
};
solver.build_dag()?;
Ok(solver)
}
}
/// Replay the 539 digitf launches to build the DAG (once per epoch).
fn build_dag(&self) -> Result<()> {
unsafe {
check(cuCtxSetCurrent(self.ctx), "cuCtxSetCurrent")?;
for (f, grid, block, shared, arg) in &self.digitf {
launch(*f, *grid, *block, *shared, arg)?;
}
check(cuCtxSynchronize(), "cuCtxSynchronize(dag)")?;
}
let _ = (self.my_dag, self.my_cache, &self.remap);
Ok(())
}
/// Run one nonce-batch search. `target8` is the 8-byte boundary miniZ compares
/// (`d_target`). `grid_x` threads-blocks (each block is `search_block` threads)
/// = `grid_x * block` nonces tested starting at `start_nonce`.
fn search_raw(&self, header: &[u8; 32], target8: &[u8; 8], start_nonce: u64, grid_x: u32) -> Result<Vec<u8>> {
unsafe {
check(cuCtxSetCurrent(self.ctx), "cuCtxSetCurrent")?;
set_global(self.module, "d_header", header)?;
set_global(self.module, "d_target", target8)?;
// zero a generous prefix so leftover data can't masquerade as results.
check(cuMemsetD8_v2(self.my_results, 0, 64 * 1024), "cuMemsetD8(results)")?;
let mut arg = self.search_arg.clone();
arg[0..8].copy_from_slice(&start_nonce.to_le_bytes()); // start_nonce
// arg[8..16] already rebased to my_results in new()
launch(self.search_fn, (grid_x, 1, 1), self.search_block, 0, &arg)?;
check(cuCtxSynchronize(), "cuCtxSynchronize(search)")?;
let mut out = vec![0u8; 64 * 1024];
check(cuMemcpyDtoH_v2(out.as_mut_ptr() as *mut c_void, self.my_results, out.len()), "cuMemcpyDtoH(results)")?;
Ok(out)
}
}
/// Decode a `Search_results` buffer: mix[i] @ i*32, nonce[i] (u64) @ 0x100+i*8.
fn decode(buf: &[u8]) -> Vec<Found> {
let mut found = Vec::new();
for i in 0..MAX_RESULTS {
let no = NONCE_BASE + i * 8;
if no + 8 > buf.len() { break; }
let nonce = u64::from_le_bytes(buf[no..no + 8].try_into().unwrap());
if nonce == 0 { continue; } // empty slot
let mut mix = [0u8; 32];
mix.copy_from_slice(&buf[i * 32..i * 32 + 32]);
found.push(Found { nonce, mix });
}
found
}
/// Public search: full 256-bit `target`, returns decoded matches.
pub fn search(&self, header: &[u8; 32], target: &[u8; 32], start_nonce: u64) -> Result<SearchResult> {
let buf = self.search_raw(header, &target8(target), start_nonce, 399360)?;
Ok(SearchResult { found: Self::decode(&buf) })
}
/// A CPU `Light` over the exact cache the GPU used — for cross-checking.
pub fn cpu_light(&self) -> verify::Light {
verify::Light::from_raw(&self.cache_bytes, self.full_size)
}
}
impl Drop for EthashSolver {
fn drop(&mut self) {
unsafe {
cuCtxSetCurrent(self.ctx);
for &b in &self.bufs {
cuMemFree_v2(b);
}
cuModuleUnload(self.module);
cuCtxDestroy_v2(self.ctx);
}
}
}
/// Rebase any 8-byte field that exactly equals a captured base pointer.
fn rebase(arg: &[u8], remap: &HashMap<u64, u64>) -> Vec<u8> {
let mut a = arg.to_vec();
let mut off = 0;
while off + 8 <= a.len() {
let v = u64::from_le_bytes(a[off..off + 8].try_into().unwrap());
if let Some(&nv) = remap.get(&v) {
a[off..off + 8].copy_from_slice(&nv.to_le_bytes());
}
off += 8;
}
a
}
fn get_function(m: CUmodule, name: &str) -> Result<CUfunction> {
let cname = CString::new(name).map_err(|_| anyhow!("kernel name NUL"))?;
let mut f: CUfunction = ptr::null_mut();
unsafe { check(cuModuleGetFunction(&mut f, m, cname.as_ptr()), "cuModuleGetFunction")? };
Ok(f)
}
/// Write `bytes` into a `__constant__` symbol resolved by name.
fn set_global(m: CUmodule, symbol: &str, bytes: &[u8]) -> Result<()> {
let cname = CString::new(symbol)?;
unsafe {
let mut dptr: CUdeviceptr = 0;
let mut sz: usize = 0;
check(cuModuleGetGlobal_v2(&mut dptr, &mut sz, m, cname.as_ptr()), "cuModuleGetGlobal")?;
check(cuMemcpyHtoD_v2(dptr, bytes.as_ptr() as *const c_void, bytes.len()), "cuMemcpyHtoD(const)")?;
}
Ok(())
}
/// Launch via the `extra`/BUFFER_POINTER path — identical to src/cuda.rs::launch.
unsafe fn launch(f: CUfunction, grid: (u32, u32, u32), block: (u32, u32, u32), shared: u32, arg: &[u8]) -> Result<()> {
let mut argsz = arg.len();
let mut extra: [*mut c_void; 5] = [
CU_LAUNCH_PARAM_BUFFER_POINTER as *mut c_void,
arg.as_ptr() as *mut c_void,
CU_LAUNCH_PARAM_BUFFER_SIZE as *mut c_void,
&mut argsz as *mut usize as *mut c_void,
CU_LAUNCH_PARAM_END as *mut c_void,
];
check(
cuLaunchKernel(f, grid.0, grid.1, grid.2, block.0, block.1, block.2, shared, ptr::null_mut(), ptr::null_mut(), extra.as_mut_ptr()),
"cuLaunchKernel",
)
}
/// End-to-end GPU self-test (no pool needed): build the DAG by replaying the
/// captured trace, choose a hard target on the CPU so one nonce in a batch is the
/// winner, run the GPU search, decode the `Search_results`, and confirm the GPU
/// returns that exact nonce with a mix that passes the full CPU verifier. Because
/// the CPU `Light` uses the same captured cache the GPU DAG was built from, a PASS
/// proves the GPU is computing real, correct Dagger-Hashimoto. Returns a report.
pub fn selftest(device: usize) -> Result<String> {
let mut r = String::new();
let solver = EthashSolver::with_recording(device, RECORDING)?;
let light = solver.cpu_light();
r.push_str(&format!(
"DAG built (replayed {} digitf launches): full_size={} bytes ({} 64B rows)\n",
solver.digitf.len(), solver.full_size, solver.full_size / 64
));
let header: [u8; 32] = *b"jackpotminer-ethash-selftest!!!\0";
// Evaluate a batch on the CPU; the lowest result becomes a hard target so the
// GPU should return exactly that nonce.
let n_probe = 512u64;
let base = 0x2000_0000u64;
let mut best = (u64::MAX, base, [0u8; 32], [0u8; 32]); // (be_top64, nonce, mix, res)
for i in 0..n_probe {
let (mix, res) = light.hashimoto(&header, base + i);
let top = u64::from_be_bytes(res[0..8].try_into().unwrap());
if top < best.0 { best = (top, base + i, mix, res); }
}
let (best_top, best_nonce, best_mix, best_res) = best;
let grid = (n_probe as u32).div_ceil(solver.search_block.0);
let buf = solver.search_raw(&header, &best_top.to_le_bytes(), base, grid)?;
let found = EthashSolver::decode(&buf);
r.push_str(&format!(
"GPU search ({} nonces, target=top64 {:#018x}): {} match(es); CPU winner={:#x}\n",
grid as u64 * solver.search_block.0 as u64, best_top, found.len(), best_nonce
));
// The GPU must return the CPU winner with the matching mix, and it must pass
// the full 256-bit CPU verifier (the real submit gate). `best_res` is the
// winner's own result, so `result <= target` holds for it.
let mut pass = false;
for f in &found {
let mix_ok = f.mix == best_mix;
let verified = verify::verify(&light, &header, f.nonce, &best_res, Some(&f.mix));
r.push_str(&format!(" nonce={:#x} mix_match={mix_ok} cpu_verify={verified}\n", f.nonce));
if f.nonce == best_nonce && mix_ok && verified { pass = true; }
}
r.push_str(if pass {
"\n[result] PASS \u{2713} — GPU built the DAG, found the nonce, and it CPU-verifies\n"
} else {
"\n[result] FAIL \u{2717}\n"
});
if !pass {
return Err(anyhow!("ethash GPU search self-test did not verify:\n{r}"));
}
Ok(r)
}
#[cfg(test)]
mod tests {
use super::*;
/// Requires a CUDA GPU + the captured cache sidecar; run explicitly:
/// `cargo test --features ethash ethash::tests::gpu_selftest -- --ignored --nocapture`
#[test]
#[ignore]
fn gpu_selftest() {
match selftest(0) {
Ok(report) => println!("{report}"),
Err(e) => panic!("ethash selftest failed: {e:?}"),
}
}
}
+121
View File
@@ -0,0 +1,121 @@
# `src/ethash/` — miniZ's Ethash solver (CUDA backend, in progress)
Adds the **Ethash family** (ethash · etchash · ubqhash · reth — same 15-kernel
solver) to the miner, alongside the Equihash 192,7 backend in `src/cuda.rs`.
Built from miniZ v2.5e3's extracted kernels
(`~/code/miniz-dump/solver_all/ethash/`).
> **Status: GPU search WORKING (validated end-to-end on an RTX 5080).**
> The DAG build + hashimoto search now run on the GPU by replaying a captured
> miniZ etchash trace (`recording.log`): `../ethash.rs` builds the DAG (539
> `digitf` launches), injects `d_header`/`d_target`, runs the `equihash` search
> kernel, and decodes `Search_results`. `ethash::selftest` proves it without a
> pool — it picks a hard target on the CPU, runs the GPU search, and confirms the
> GPU returns that nonce with a mix that passes the full CPU verifier (same
> captured cache). The CPU verifier (`verify.rs`) is pinned by a full **hashimoto
> KAT** vs go-ethereum, and the **stratum loop** (`stratum.rs`) wires search →
> verify → submit. `--algo ethash|etchash` is live in `main.rs`.
>
> Run the GPU self-test:
> ```sh
> CUDA_VISIBLE_DEVICES=0 cargo test --features ethash \
> ethash::tests::gpu_selftest -- --ignored --nocapture
> ```
> It needs the ≈67 MB light-cache sidecar the recording references
> (`pearl-dump/ethash.rec.htod00.bin`) — regenerate it with a fresh capture (see
> *How the trace was captured*). The bundled `recording.log` is pinned to one
> etchash epoch; re-capture to mine a newer epoch (see *Caveats*).
## Contents
| path | role |
|---|---|
| `ethash.fatbin` | **embeddable** — 8-arch solver (sm_50/60/61/70/75/80/86/120) |
| `cubins/ethash.sm_*.cubin` | reference — per-arch cubins |
| `sass/ethash.sm_{75,80,86,120}.sass` | reference — SASS (sm_50/60/61/70 are cubin-only on CUDA 13.3) |
| `functions.demangled.txt` | reference — kernel index |
| `../ethash.rs` | the backend (feature `ethash`, default-off) — recording parser, DAG-build + search replay, `Search_results` decode, `selftest`. |
| `recording.log` | **captured miniZ etchash launch trace** (allocs, constants, 539 `digitf` + the `equihash` launch with packed args). Drives the replay. |
| `verify.rs` | **CPU light verifier** — inline Keccak (KAT-tested) + mkcache + hashimoto_light + boundary check. `Light::from_raw` builds from the captured cache. Gates shares before submit. |
| `stratum.rs` | **Ethash stratum** (EthereumStratum/1.0.0) + difficulty→target + the mining loop (search → verify → submit). |
## How Ethash differs from Equihash (why it's a new subsystem)
Equihash 192,7 replays a **fixed kernel pass per header** — stateless, all inputs
in the kernel arg buffers. Ethash is **DAG + search**:
- `digitf<…>` — builds the **DAG** for the current epoch (multi-GB, regenerated
every ~30k blocks). Runs once per epoch, not per nonce.
- `equihash<…>` — the per-nonce **hashimoto search** kernel (the name is miniZ's;
it's Dagger-Hashimoto, not Equihash). Signature is `(unsigned long start_nonce,
Search_results*)` — so **the header and target are NOT kernel args**; miniZ
pushes them into `__constant__` memory via `cuModuleGetGlobal` + `cuMemcpyHtoD`.
How the replay handles this:
1. **Two cadences**`digitf` is replayed once at `new()` to build the DAG;
`equihash` runs per nonce batch in `search()`.
2. **Constant-memory injection** — the trace captures every `cuModuleGetGlobal`
symbol and the writes to them. The replay writes `d_dag` (rebased to our DAG
buffer), `d_dag_size`/`i_dag_size`/`d_maxmem`/`d_multi` verbatim, and per-search
`d_header` (32 B) + `d_target` (8 B = boundary top-64 bits, little-endian).
3. **`Search_results` readback** — recovered layout: `mix[i]` (32 B) at offset
`i*32`, matched nonce (u64) at `0x100 + i*8`, 8 slots. We zero the buffer before
each launch, decode non-empty slots, and CPU-verify each.
## Recovered ABI (from `recording.log`)
| kernel | grid / block | args (packed from kernelParams) |
|---|---|---|
| `digitf<1099511627778,256,2>` | 512 / 256, ×539 | `(u32 start, hash64* dag, u64 dag_rows128, hash64* cache, u32 cache_rows, …)` — only `start` varies (steps by 512·256) |
| `equihash<5806517278900176776,…>` | 399360 / 64 | `(u64 start_nonce, Search_results* out)` |
`full_size` (hashimoto, 64-B rows) = `d_dag_size` × 128; cache rows = `d_dag` light
buffer / 64. The DAG buffer base lives in the `d_dag` constant (rebased on replay).
## How the trace was captured
miniZ resolves the driver API by `dlopen("libcuda.so.1")` + `dlsym`, so a plain
`LD_PRELOAD` of a `cuLaunchKernel` shim is bypassed. Two preloads defeat this:
`pearl-dump/dlhook.so` redirects the libcuda `dlopen` to `pearl-dump/cuhook.so`
(linked against libcuda), so miniZ's `dlsym(handle, "cuXxx")` finds our wrappers
first and falls through to real libcuda for the rest. `cuhook.so` logs allocs,
`cuModuleGetGlobal` symbols, HtoD (tagging constant writes by symbol, dumping the
≈67 MB light cache to a sidecar), and — packing the `kernelParams` array by the
demangled signatures — every kernel's args.
```sh
cd pearl-dump && gcc -shared -fPIC -O2 -o cuhook.so cuhook.c -ldl -lcuda
gcc -shared -fPIC -O2 -o dlhook.so dlhook.c -ldl
H=$PWD; ZCL_TRACE=$H/ethash.rec CUHOOK_SO=$H/cuhook.so \
LD_PRELOAD="$H/dlhook.so:$H/cuhook.so" CUDA_VISIBLE_DEVICES=0 \
miniZ --par etchash --url 0x<addr>.w@etc.2miners.com:1010 --pass x --nocolour
cp ethash.rec ../src/ethash/recording.log # the sidecar stays in pearl-dump/
```
The whole loop is end-to-end: GPU `search()``verify::verify` (rejects anything
that doesn't meet the full 256-bit target) → `submit`.
## Caveats
- **Epoch-pinned.** `recording.log` (and its cache sidecar) capture one etchash
epoch's DAG-build sequence; the replay mines that epoch. Re-capture to follow a
new epoch — the `digitf` loop isn't yet generalized to arbitrary `dag_size`.
- **Cache sidecar not committed** (67 MB). The recording names its path; regenerate
by re-capturing on the host.
- Same fatbin covers **etchash/ubqhash/reth**; embed those the same way for distinct
`--algo` targets.
## Kernels & arches
- Families: `digitf` (DAG build) · `equihash` (search). Many `equihash<…>`
instantiations = per-epoch/difficulty constant sets.
- Arches in the fatbin: sm_50/60/61/70/75/80/86/120 (SASS for 75/80/86/120).
- Same solver covers **etchash/ubqhash/reth** (per `RE_INDEX.md`); embed those
fatbins the same way if you want them as distinct `--algo` targets.
Regenerate the fatbin:
```sh
D=~/code/miniz-dump/solver_all/ethash/arches
fatbinary --create src/ethash/ethash.fatbin -64 \
$(for a in 50 60 61 70 75 80 86 120; do echo --image3 kind=elf,sm=$a,file=$D/ethash.sm_$a.cubin; done)
```
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
void digitf<1099511627778ul, 256u, 2u>(unsigned int, hash64_t*, unsigned long, hash64_t*, unsigned int, hash64_t*, unsigned int, int)
void equihash<11171057592165259242ul, 19060100871ul, 0ul, 1581690978610ul, 350u, 64u, 0u>(unsigned long, Search_results*)
void equihash<1156119478540188650ul, 19060100871ul, 0ul, 1238158546226ul, 45875550u, 64u, 0u>(unsigned long, Search_results*)
void equihash<13423733299476243336ul, 19060100871ul, 0ul, 1514112406532ul, 52429150u, 64u, 0u>(unsigned long, Search_results*)
void equihash<14590196273788145336ul, 19060100871ul, 0ul, 1544176108596ul, 52429150u, 64u, 0u>(unsigned long, Search_results*)
void equihash<18078733364950818538ul, 19059052295ul, 0ul, 1582831837746ul, 350u, 32u, 0u>(unsigned long, Search_results*)
void equihash<4323707188578864008ul, 19060100871ul, 0ul, 4880294298930ul, 300u, 64u, 0u>(unsigned long, Search_results*)
void equihash<5806499686714125400ul, 19060100871ul, 0ul, 4880223711522ul, 300u, 64u, 0u>(unsigned long, Search_results*)
void equihash<5806517278900176776ul, 19060100871ul, 0ul, 4880223711538ul, 300u, 64u, 0u>(unsigned long, Search_results*)
void equihash<5947736340452537176ul, 912413298439ul, 0ul, 4884518704162ul, 300u, 64u, 13u>(unsigned long, Search_results*)
void equihash<5948598445146122120ul, 912413298439ul, 0ul, 4884585812274ul, 300u, 64u, 13u>(unsigned long, Search_results*)
void equihash<5966612843662731144ul, 912413298439ul, 0ul, 4884585828658ul, 300u, 64u, 13u>(unsigned long, Search_results*)
void equihash<7689212128876921322ul, 19060100871ul, 0ul, 1581689959218ul, 350u, 64u, 0u>(unsigned long, Search_results*)
void equihash<7694296270645768986ul, 19060100871ul, 0ul, 1581689946402ul, 350u, 64u, 0u>(unsigned long, Search_results*)
void equihash<7706962644602759706ul, 19060100871ul, 0ul, 1581689942562ul, 350u, 64u, 0u>(unsigned long, Search_results*)
+754
View File
@@ -0,0 +1,754 @@
[alloc] 16397631488 bytes @ 0x7f29e0000000
[global] name=d_header dptr=0x10010800200 size=0
[global] name=d_target dptr=0x10010800300 size=0
[global] name=d_multi dptr=0x10010800180 size=0
[htod] dst=0x10010800180 size=4 sym=d_multi first=01000000
[alloc] 70647232 bytes @ 0x10010e00000
[alloc] 4521459584 bytes @ 0x7f2a60000000
[htod] dst=0x10010e00000 size=70647232 file=/home/access/code/jackpotminer/pearl-dump/ethash.rec.htod00.bin first=18b49e5f151d047ba17b702b89408be83021c5aba64e4d5a496cf623fa5e57f1
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0000000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0100000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0200000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000360300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000380300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00003e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000400300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000420300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000440300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000460300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000480300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00004e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000500300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000520300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000540300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000560300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000580300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00005e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000600300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000620300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000640300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000660300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000680300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00006e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000700300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000720300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000740300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000760300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000780300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00007e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000800300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000820300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000840300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000860300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000880300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00008e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000900300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000920300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000940300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000960300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000980300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009a0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009c0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00009e0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000a80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000aa0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ac0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ae0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000b80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ba0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000bc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000be0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000c80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ca0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000cc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ce0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000d80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000da0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000dc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000de0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000e80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ea0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ec0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000ee0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f00300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f20300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f40300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f60300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000f80300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fa0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fc0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000fe0300000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000000400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000020400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000040400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000060400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000080400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000a0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000c0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00000e0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000100400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000120400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000140400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000160400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000180400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001a0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001c0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00001e0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000200400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000220400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000240400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000260400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000280400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002a0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002c0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=00002e0400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000300400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000320400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[REC] _Z6digitfILm1099511627778ELj256ELj2EEvjP8hash64_tmS1_jS1_ji g=512,1,1 b=256,1,1 sh=0 sz=56 arg=0000340400000000000000602a7f0000ffff1a02000000000000e01000010000f7d71000000000000000000000000000feff350400000000 (packed-from-kernelParams)
[global] name=d_dag dptr=0x10010800190 size=8
[htod] dst=0x10010800190 size=8 sym=d_dag first=000000602a7f0000
[global] name=i_dag_size dptr=0x1001080018c size=4
[htod] dst=0x1001080018c size=4 sym=i_dag_size first=79000000
[global] name=d_dag_size dptr=0x10010800184 size=4
[htod] dst=0x10010800184 size=4 sym=d_dag_size first=ffff1a02
[global] name=h_dag dptr=0x10010800198 size=8
[htod] dst=0x10010800198 size=8 sym=h_dag first=0000000000000000
[global] name=d_maxmem dptr=0x10010800188 size=4
[htod] dst=0x10010800188 size=4 sym=d_maxmem first=ffff1a02
[htod] dst=0x10010800200 size=32 (async) sym=d_header first=4b5cc07df9bf092b5135ee3efceb305a2c25e0063fb32b8a75f6efff0821eb7c
[htod] dst=0x10010800300 size=8 (async) sym=d_target first=ffffff7f00000000
[htod] dst=0x10010800200 size=32 (async) sym=d_header first=4b5cc07df9bf092b5135ee3efceb305a2c25e0063fb32b8a75f6efff0821eb7c
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=008cc9c26f2dbd6b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=0056c6ea05a66b920000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00142d9e7b335b700000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=009e27c127d730460000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00960eb5b26557b80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=009bb9bcacbfc5db0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=0015134cfc8d3b540000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=007d21b1f805c4e20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=003cba0fe139cb910000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00bc718ed81613580000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00d3000bdc6c35040000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=006f17c0e2f4ce880000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00ee7c031958f3920000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00ccdc37cb70b8ca0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=00ca1e835e228b8e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=002d2be27b5b18700000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=399360,1,1 b=64,1,1 sh=0 sz=16 arg=0065dc6267156ce80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=249990,1,1 b=64,1,1 sh=0 sz=16 arg=00e095c9bac7b07b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244494,1,1 b=64,1,1 sh=0 sz=16 arg=00732cb471af18760000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244494,1,1 b=64,1,1 sh=0 sz=16 arg=00c49ff363f041270000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244683,1,1 b=64,1,1 sh=0 sz=16 arg=00fede16b6ba8e7a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=244861,1,1 b=64,1,1 sh=0 sz=16 arg=002973a67bb86f800000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245034,1,1 b=64,1,1 sh=0 sz=16 arg=00bf3e9351c303050000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245192,1,1 b=64,1,1 sh=0 sz=16 arg=0090c1f930b3e4b10000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245344,1,1 b=64,1,1 sh=0 sz=16 arg=00215d41dd5bf0890000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245483,1,1 b=64,1,1 sh=0 sz=16 arg=000aad74dec71cd10000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245618,1,1 b=64,1,1 sh=0 sz=16 arg=00217a2346a0b2eb0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245742,1,1 b=64,1,1 sh=0 sz=16 arg=00edcc828a0333130000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245861,1,1 b=64,1,1 sh=0 sz=16 arg=00258e68af8777b30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=245970,1,1 b=64,1,1 sh=0 sz=16 arg=008996f2556b02a20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246077,1,1 b=64,1,1 sh=0 sz=16 arg=007241152bdb08dc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246177,1,1 b=64,1,1 sh=0 sz=16 arg=0034d10f483596e20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246274,1,1 b=64,1,1 sh=0 sz=16 arg=00bbadf9f3637c500000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246364,1,1 b=64,1,1 sh=0 sz=16 arg=00eb57b99f863bf50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246451,1,1 b=64,1,1 sh=0 sz=16 arg=004d488b8a38132d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246535,1,1 b=64,1,1 sh=0 sz=16 arg=00899bf65d79ad5e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246612,1,1 b=64,1,1 sh=0 sz=16 arg=001a01f941ae45830000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246688,1,1 b=64,1,1 sh=0 sz=16 arg=00d1262980d010c80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246762,1,1 b=64,1,1 sh=0 sz=16 arg=00b2c1782cf05baa0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246827,1,1 b=64,1,1 sh=0 sz=16 arg=00e080d052d817d30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246894,1,1 b=64,1,1 sh=0 sz=16 arg=00a7880a5572450f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f46dc45573ff200000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000eced8ac71f6a80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=006b006a3dca862a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0016c681dc71d5370000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00264bf7b871fbae0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c2442c15cf5f950000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c63754f842a2e40000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005bbbfdbbd0f1310000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c00ddcef04872a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0060c6dfca3827c20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c8fcabe144d6ae0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c5453d0bdf149a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a0b3a2855ac5120000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b78428d76fc7760000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0064c7c834fa175f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008f5066c39584f00000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=003d578a917e7f2d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c1bfb2e4f50a840000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008beb88cfaf33590000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00256689260bcd550000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e507d74ce5cd480000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00664ab883bf34b50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f031f5c606f4070000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008b49431d26b2af0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e70ae9e47b117c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0042cf28607b6cef0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806517278900176776ELm19060100871ELm0ELm4880223711538ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005c3ecdf0cc25fc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a6e4a20df600e10000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f811e4bf4dc19a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008c2269290faa790000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ad326fbf3428e20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00335655d58e6b5a0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000fb316c624018f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ce1dd9728e505d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00030a637e9688790000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a4ea4ee00b47790000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=002d8eae9210a9b20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0009910566a307bf0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008dfd6ad446e47c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=003f657e1e529dff0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b1accabb2db8a20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f621c7979138ed0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00a077eedae868fe0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0050812c3a7efb890000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005b4ccc19a464680000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00dc32d53ef44a9f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7694296270645768986ELm19060100871ELm0ELm1581689946402ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0083c31d1fa65f020000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00af6422dcaf9a9b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f4627d3265f6bf0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00fde1488b5bc9910000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004139e5656127680000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b2d50a69e43ec90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00856af14fc506a60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0035a46dd7e5095c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00475c9d16cc8ad90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004d5dfb1e49a4720000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001ce3c1fc054e370000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ac0033bc6d554f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=006ef6b62150f4ce0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007ac17b00b4394b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000ccdcbf7ca94f50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=002c9175fcb8570b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00adb08ac8de90780000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00705c9db586c60d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004501e0c4863ffb0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0074deacc9a177980000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7706962644602759706ELm19060100871ELm0ELm1581689942562ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0052bef2eb43a0070000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007c947a4f04c0030000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00250debc9fc5a8e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000d748f46d351e30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005aa5e77f67acfb0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0041ec215861db760000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00f843d318be96b70000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007555b22c94827f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0011a2d854874b780000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00855f45d6385fc20000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0000b34d1cad75160000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=009e564c1d629e260000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0057f5dbe4ec6c0c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=009128ddc500a6ad0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=005f320b0dcdd1c60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001ca5d7a7ebe64c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c2c0d60c50bdd60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d1ff80924845aa0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0040498dfc2059610000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=008fb5732442d6810000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm11171057592165259242ELm19060100871ELm0ELm1581690978610ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0093be98baba813f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00110a08c416f2a00000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=0031b966fa795b0d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=009aaf337e5a1c9f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00aac7bf185a7f890000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=0014274dcca432350000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00170bc53ef1dcca0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=005069bbe0791c3b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00acb5ad4878b1480000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00e7864d886008ce0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00c68d5efbed3b310000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=000c9f03a7e6554b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=007f56f22557b40f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00201aea2fdd74f30000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00198253bebfd6200000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=0013e68a37ba8c2d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00247ade23838bf60000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00e943cabce1a0c70000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=003f3c9bad58cb480000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=00084ccde415d2ff0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm18078733364950818538ELm19059052295ELm0ELm1582831837746ELj350ELj32ELj0EEvmP14Search_results g=493914,1,1 b=32,1,1 sh=0 sz=16 arg=008c4f486bdf111e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00b9b0d80f376fb50000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007f4c1c2bbc02320000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001f220551498e5f0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007035e4313dc5130000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00175fe3bd2360a90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00840c180eb709dc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ebed20bb100b570000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=004d2d18fce4960b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=009c9861b3a0136c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00da49389f805a780000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e4c4876bdd29e80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0039ea25fe7d8e1d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0038072a5c4124e90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0011d3811bf882ad0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0076a4d3035ad26e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00971ef6197f303d0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0069b6ebf473f4f90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d7b91164c30be40000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=006d5fb644456a180000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm7689212128876921322ELm19060100871ELm0ELm1581689959218ELj350ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00af17a003d5b68b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=000fa6519fbe64490000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=007659e85ca24c540000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00af775f733e0b0e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ec977ae34b876e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001d3b495d72659b0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0089518bd27a72a40000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00e64e21ca29b7440000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d2a757241ac7e90000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=001b4dc1710be33e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c741b0010dc41e0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00ff2cd914cb2e6c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00bdddc141618ef60000a01000010000 (packed-from-kernelParams)
[htod] dst=0x10010800200 size=32 (async) sym=d_header first=8f67a6447b1dca8873dc97f3ff4cedc073cf7f328ca00556ab677f828c3ace71
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00cef2e19d00c9590000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=002251e782a817bc0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00d18c014aeb188c0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0004427127b633ec0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00233940d53945530000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00c002d1fee680930000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0017a9d24c35b6e80000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5948598445146122120ELm912413298439ELm0ELm4884585812274ELj300ELj64ELj13EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00db091a1fea0f530000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00de5226ec709edf0000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00499f28d03596470000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=0067d6bdb4cf78340000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00abb1d4d7477d860000a01000010000 (packed-from-kernelParams)
[REC] _Z8equihashILm5806499686714125400ELm19060100871ELm0ELm4880223711522ELj300ELj64ELj0EEvmP14Search_results g=246957,1,1 b=64,1,1 sh=0 sz=16 arg=00cc0f3795e4416c0000a01000010000 (packed-from-kernelParams)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+206
View File
@@ -0,0 +1,206 @@
//! Ethash stratum client + mining loop.
//!
//! Ethash uses a different stratum dialect than the Zcash/Equihash `StratumClient`
//! in `src/stratum.rs`. This implements the common **EthereumStratum/1.0.0**
//! (NiceHash) shape — `mining.subscribe` / `mining.set_difficulty` /
//! `mining.notify [jobId, seedhash, headerhash, cleanJobs]` / `mining.submit
//! [user, jobId, nonce]`. The older getwork/ethproxy variant differs slightly;
//! `TODO(pool)` marks the framing to confirm against a live pool.
//!
//! Loop: job → GPU search (WIP, see ../ethash.rs) → **CPU verify** (`super::verify`)
//! → submit verified shares only.
use std::io::{BufRead, BufReader, Write};
use std::net::TcpStream;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use anyhow::{anyhow, Context, Result};
use serde_json::{json, Value};
use super::verify::{self, epoch_from_seedhash};
use super::EthashSolver;
/// One Ethash job.
#[derive(Clone)]
pub struct Job {
pub id: String,
pub seedhash: [u8; 32],
pub header_hash: [u8; 32],
pub target: [u8; 32],
pub epoch: u64,
}
pub struct EthashStratum {
stream: TcpStream,
reader: BufReader<TcpStream>,
next_id: u64,
/// Current difficulty → target boundary (set by mining.set_difficulty).
target: [u8; 32],
extranonce: String,
}
impl EthashStratum {
pub fn connect(host: &str, port: u16, user: &str, pass: &str) -> Result<Self> {
let stream = TcpStream::connect((host, port)).with_context(|| format!("connect {host}:{port}"))?;
let reader = BufReader::new(stream.try_clone()?);
let mut s = Self { stream, reader, next_id: 1, target: [0xff; 32], extranonce: String::new() };
// TODO(pool): some pools want ["miner/ver", "EthereumStratum/1.0.0"].
s.call("mining.subscribe", json!(["jackpotminer-ethash/0.1", "EthereumStratum/1.0.0"]))?;
s.call("mining.authorize", json!([user, pass]))?;
Ok(s)
}
fn send(&mut self, v: &Value) -> Result<()> {
let mut line = serde_json::to_string(v)?;
line.push('\n');
self.stream.write_all(line.as_bytes())?;
Ok(())
}
fn call(&mut self, method: &str, params: Value) -> Result<u64> {
let id = self.next_id;
self.next_id += 1;
self.send(&json!({ "id": id, "method": method, "params": params }))?;
Ok(id)
}
fn recv(&mut self) -> Result<Value> {
let mut line = String::new();
if self.reader.read_line(&mut line)? == 0 {
return Err(anyhow!("pool closed the connection"));
}
Ok(serde_json::from_str(line.trim())?)
}
/// Block until the next job, applying difficulty/extranonce updates en route.
pub fn next_job(&mut self) -> Result<Job> {
loop {
let msg = self.recv()?;
match msg.get("method").and_then(Value::as_str).unwrap_or("") {
"mining.set_difficulty" => {
if let Some(d) = msg["params"].get(0).and_then(Value::as_f64) {
self.target = target_from_difficulty(d.max(1.0) as u64);
}
}
"mining.set_extranonce" => {
if let Some(x) = msg["params"].get(0).and_then(Value::as_str) {
self.extranonce = x.to_string();
}
}
"mining.notify" => {
// params: [jobId, seedhash, headerhash, cleanJobs] TODO(pool): order varies.
let p = &msg["params"];
let id = p.get(0).and_then(Value::as_str).unwrap_or("").to_string();
let seedhash = hex32(p.get(1));
let header_hash = hex32(p.get(2));
let epoch = epoch_from_seedhash(&seedhash)
.ok_or_else(|| anyhow!("unknown seedhash (epoch scan failed)"))?;
return Ok(Job { id, seedhash, header_hash, target: self.target, epoch });
}
_ => {}
}
}
}
/// Submit a verified nonce. NiceHash: nonce hex is extranonce-prefixed.
/// TODO(pool): some pools also want the mix hash as a 4th param.
pub fn submit(&mut self, user: &str, job_id: &str, nonce: u64) -> Result<()> {
let nonce_hex = format!("0x{}{:016x}", self.extranonce, nonce);
self.call("mining.submit", json!([user, job_id, nonce_hex]))?;
Ok(())
}
}
fn hex32(v: Option<&Value>) -> [u8; 32] {
let s = v.and_then(Value::as_str).unwrap_or("").trim_start_matches("0x");
let mut o = [0u8; 32];
for i in 0..32.min(s.len() / 2) {
o[i] = u8::from_str_radix(&s[2 * i..2 * i + 2], 16).unwrap_or(0);
}
o
}
/// Ethash boundary = floor(2^256 / difficulty), big-endian 32 bytes.
pub fn target_from_difficulty(diff: u64) -> [u8; 32] {
if diff <= 1 {
return [0xff; 32];
}
let d = diff as u128;
let mut q = [0u8; 32];
let mut rem: u128 = 0;
// Dividend = 1 followed by 256 zero bits (257 bits); keep the low 256 quotient bits.
for bitpos in (0..=256usize).rev() {
rem = (rem << 1) | if bitpos == 256 { 1 } else { 0 };
if rem >= d {
rem -= d;
if bitpos < 256 {
let from_msb = 255 - bitpos;
q[from_msb / 8] |= 1 << (7 - (from_msb % 8));
}
}
}
q
}
/// The Ethash mining loop (single device). Mirrors `pearl_main::run`. The GPU
/// search is still WIP (see ../ethash.rs `TODO(capture)`); the verify+submit
/// path is real, so once `search` returns candidates this is end-to-end.
pub fn run(
host: &str,
port: u16,
user: &str,
pass: &str,
device: usize,
recording_path: &str,
running: Arc<AtomicBool>,
) -> Result<()> {
let _ = recording_path; // the recording is bundled; DAG is built in new()
let solver = EthashSolver::new(device).context("init Ethash solver")?;
// The GPU replay built the DAG from the captured (epoch-pinned) recording, so
// it verifies against that exact epoch. Cross-check on the CPU with the same
// light cache the GPU used — independent of the coin's epoch convention.
let light = solver.cpu_light();
let mut pool = EthashStratum::connect(host, port, user, pass)?;
log::info!("ethash: mining on device {device}");
let mut start_nonce: u64 = 0;
while running.load(Ordering::Relaxed) {
let job = pool.next_job()?;
match solver.search(&job.header_hash, &job.target, start_nonce) {
Ok(res) => {
for f in &res.found {
// CPU verify (same cache as the GPU): never submit a bad share.
if verify::verify(&light, &job.header_hash, f.nonce, &job.target, Some(&f.mix)) {
pool.submit(user, &job.id, f.nonce)?;
log::info!("ethash: submitted nonce {:#x} for job {}", f.nonce, job.id);
} else {
log::debug!("ethash: GPU nonce {:#x} failed CPU verify — dropped", f.nonce);
}
}
}
Err(e) => log::debug!("ethash: search error: {e}"),
}
start_nonce = start_nonce.wrapping_add(25_559_040); // 399360 * 64 nonces per batch
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn difficulty_target_basic() {
// diff 1 -> max boundary; larger diff -> smaller boundary.
assert_eq!(target_from_difficulty(1), [0xff; 32]);
let t2 = target_from_difficulty(2);
// 2^256/2 = 2^255 -> 0x80 00 .. 00
assert_eq!(t2[0], 0x80);
assert!(t2[1..].iter().all(|&b| b == 0));
// monotonic: higher difficulty => numerically smaller target
let a = target_from_difficulty(1000);
let b = target_from_difficulty(2000);
assert!(b < a); // lexicographic on big-endian == numeric
}
}
+432
View File
@@ -0,0 +1,432 @@
//! CPU Ethash light verifier — recompute a candidate share on the CPU and accept
//! it only if it genuinely meets target, so the (reverse-engineered) GPU replay
//! can never submit a bad share. Mirrors the role of `equihash::is_valid_solution`.
//!
//! Unlike pearlhash, Ethash is a public spec, so this is a *correct* light-client
//! implementation (no DAG needed — dataset items are derived from the cache on the
//! fly), not a stub. The full pipeline (mkcache → dataset_item → hashimoto → result)
//! is pinned by `hashimoto_geth_kat` below against go-ethereum's canonical
//! `TestHashimoto` vector, and the Keccak core has its own KATs.
//!
//! Spec: <https://eth.wiki/concepts/ethash/ethash> (Dagger-Hashimoto).
// ---------- Keccak-f[1600] (original Keccak padding 0x01, as Ethash uses) ----------
const RC: [u64; 24] = [
0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008,
];
const RHO: [u32; 24] = [
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44,
];
const PI: [usize; 24] = [
10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1,
];
fn keccakf(a: &mut [u64; 25]) {
for round in 0..24 {
// theta
let mut c = [0u64; 5];
for x in 0..5 {
c[x] = a[x] ^ a[x + 5] ^ a[x + 10] ^ a[x + 15] ^ a[x + 20];
}
for x in 0..5 {
let d = c[(x + 4) % 5] ^ c[(x + 1) % 5].rotate_left(1);
for y in 0..5 {
a[x + 5 * y] ^= d;
}
}
// rho + pi
let mut last = a[1];
for i in 0..24 {
let j = PI[i];
let tmp = a[j];
a[j] = last.rotate_left(RHO[i]);
last = tmp;
}
// chi
for y in 0..5 {
let t: [u64; 5] = [a[5 * y], a[5 * y + 1], a[5 * y + 2], a[5 * y + 3], a[5 * y + 4]];
for x in 0..5 {
a[x + 5 * y] = t[x] ^ ((!t[(x + 1) % 5]) & t[(x + 2) % 5]);
}
}
// iota
a[0] ^= RC[round];
}
}
/// Generic Keccak sponge with original-Keccak padding (delimiter 0x01).
fn keccak(rate: usize, input: &[u8], out: &mut [u8]) {
debug_assert!(rate % 8 == 0 && out.len() <= rate);
let mut st = [0u64; 25];
let absorb = |st: &mut [u64; 25], block: &[u8]| {
for i in 0..rate / 8 {
st[i] ^= u64::from_le_bytes(block[i * 8..i * 8 + 8].try_into().unwrap());
}
};
let mut off = 0;
while input.len() - off >= rate {
absorb(&mut st, &input[off..off + rate]);
keccakf(&mut st);
off += rate;
}
let rem = &input[off..];
let mut block = vec![0u8; rate];
block[..rem.len()].copy_from_slice(rem);
block[rem.len()] ^= 0x01;
block[rate - 1] ^= 0x80;
absorb(&mut st, &block);
keccakf(&mut st);
let mut bytes = [0u8; 200];
for i in 0..25 {
bytes[i * 8..i * 8 + 8].copy_from_slice(&st[i].to_le_bytes());
}
out.copy_from_slice(&bytes[..out.len()]);
}
fn keccak256(input: &[u8]) -> [u8; 32] {
let mut o = [0u8; 32];
keccak(136, input, &mut o);
o
}
fn keccak512(input: &[u8]) -> [u8; 64] {
let mut o = [0u8; 64];
keccak(72, input, &mut o);
o
}
// ---------- Ethash parameters ----------
const HASH_BYTES: usize = 64;
const MIX_BYTES: usize = 128;
const EPOCH_LENGTH: u64 = 30_000;
const CACHE_BYTES_INIT: usize = 1 << 24;
const CACHE_BYTES_GROWTH: usize = 1 << 17;
const DATASET_BYTES_INIT: usize = 1 << 30;
const DATASET_BYTES_GROWTH: usize = 1 << 23;
const DATASET_PARENTS: u32 = 256;
const CACHE_ROUNDS: usize = 3;
const ACCESSES: usize = 64;
const FNV_PRIME: u32 = 0x0100_0193;
#[inline]
fn fnv(a: u32, b: u32) -> u32 {
a.wrapping_mul(FNV_PRIME) ^ b
}
fn is_prime(n: usize) -> bool {
if n < 2 {
return false;
}
if n % 2 == 0 {
return n == 2;
}
let mut i = 3usize;
while i * i <= n {
if n % i == 0 {
return false;
}
i += 2;
}
true
}
pub fn epoch(block_number: u64) -> u64 {
block_number / EPOCH_LENGTH
}
/// Seed hash for an epoch (Keccak-256 chained from zero, `epoch` times).
pub fn seedhash(epoch: u64) -> [u8; 32] {
let mut s = [0u8; 32];
for _ in 0..epoch {
s = keccak256(&s);
}
s
}
/// Recover the epoch from a pool-supplied seedhash (bounded scan).
pub fn epoch_from_seedhash(seed: &[u8; 32]) -> Option<u64> {
let mut s = [0u8; 32];
for e in 0..(1u64 << 20) {
if &s == seed {
return Some(e);
}
s = keccak256(&s);
}
None
}
fn cache_size(epoch: u64) -> usize {
let mut sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * epoch as usize - HASH_BYTES;
while !is_prime(sz / HASH_BYTES) {
sz -= 2 * HASH_BYTES;
}
sz
}
fn full_size(epoch: u64) -> usize {
let mut sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * epoch as usize - MIX_BYTES;
while !is_prime(sz / MIX_BYTES) {
sz -= 2 * MIX_BYTES;
}
sz
}
#[inline]
fn words(row: &[u8; 64]) -> [u32; 16] {
let mut w = [0u32; 16];
for i in 0..16 {
w[i] = u32::from_le_bytes(row[i * 4..i * 4 + 4].try_into().unwrap());
}
w
}
#[inline]
fn bytes(w: &[u32; 16]) -> [u8; 64] {
let mut b = [0u8; 64];
for i in 0..16 {
b[i * 4..i * 4 + 4].copy_from_slice(&w[i].to_le_bytes());
}
b
}
/// Light cache for one epoch (`mkcache`). Held so verification of many shares in
/// an epoch pays generation once.
pub struct Light {
pub epoch: u64,
full_size: usize,
cache: Vec<[u8; 64]>,
}
/// `mkcache` — build the `n`-row light cache from a 32-byte seed (Keccak-512
/// seed chain + `CACHE_ROUNDS` of RandMemoHash). Shared by `Light::new` and the
/// known-answer tests so both exercise the exact same generator.
fn mkcache(n: usize, seed: &[u8; 32]) -> Vec<[u8; 64]> {
let mut cache: Vec<[u8; 64]> = Vec::with_capacity(n);
cache.push(keccak512(seed));
for i in 1..n {
cache.push(keccak512(&cache[i - 1]));
}
// CACHE_ROUNDS of RandMemoHash.
for _ in 0..CACHE_ROUNDS {
for i in 0..n {
let v = u32::from_le_bytes(cache[i][0..4].try_into().unwrap()) as usize % n;
let mut x = [0u8; 64];
for k in 0..64 {
x[k] = cache[(i + n - 1) % n][k] ^ cache[v][k];
}
cache[i] = keccak512(&x);
}
}
cache
}
impl Light {
pub fn new(epoch: u64) -> Self {
let n = cache_size(epoch) / HASH_BYTES;
let cache = mkcache(n, &seedhash(epoch));
Self { epoch, full_size: full_size(epoch), cache }
}
/// Build a `Light` directly from raw cache bytes + the full dataset size, with
/// no epoch math. Used to cross-check the GPU replay (`src/ethash.rs`): the
/// exact light cache miniZ uploaded is captured, so CPU hashimoto here uses the
/// *same* cache the kernels did — making verification independent of the
/// coin's epoch-length convention (ethash vs ECIP-1099 etchash).
pub fn from_raw(cache_bytes: &[u8], full_size: usize) -> Self {
assert!(cache_bytes.len() % HASH_BYTES == 0, "cache not a multiple of 64");
let cache = cache_bytes
.chunks_exact(HASH_BYTES)
.map(|c| {
let mut r = [0u8; 64];
r.copy_from_slice(c);
r
})
.collect();
Self { epoch: 0, full_size, cache }
}
/// `calc_dataset_item` — derive dataset row `i` from the cache.
fn dataset_item(&self, i: u32) -> [u32; 16] {
let n = self.cache.len() as u32;
let mut mix = words(&self.cache[(i % n) as usize]);
mix[0] ^= i;
mix = words(&keccak512(&bytes(&mix)));
for j in 0..DATASET_PARENTS {
let parent = fnv(i ^ j, mix[(j % 16) as usize]) % n;
let p = words(&self.cache[parent as usize]);
for k in 0..16 {
mix[k] = fnv(mix[k], p[k]);
}
}
words(&keccak512(&bytes(&mix)))
}
/// `hashimoto_light` — returns (mix_hash[32], result[32]) for a header+nonce.
pub fn hashimoto(&self, header_hash: &[u8; 32], nonce: u64) -> ([u8; 32], [u8; 32]) {
let n = (self.full_size / HASH_BYTES) as u32; // dataset rows
let mut seed_in = [0u8; 40];
seed_in[..32].copy_from_slice(header_hash);
seed_in[32..].copy_from_slice(&nonce.to_le_bytes());
let s = keccak512(&seed_in);
let sw = words(&s);
let mut mix = [0u32; 32]; // MIX_BYTES/4
mix[..16].copy_from_slice(&sw);
mix[16..].copy_from_slice(&sw);
let mixhashes = (MIX_BYTES / HASH_BYTES) as u32; // 2
for i in 0..ACCESSES as u32 {
let p = fnv(i ^ sw[0], mix[(i as usize) % 32]) % (n / mixhashes) * mixhashes;
let mut newdata = [0u32; 32];
for j in 0..mixhashes {
let item = self.dataset_item(p + j);
newdata[(j * 16) as usize..(j * 16 + 16) as usize].copy_from_slice(&item);
}
for k in 0..32 {
mix[k] = fnv(mix[k], newdata[k]);
}
}
// compress mix (32 -> 8 words)
let mut cmix = [0u32; 8];
for i in (0..32).step_by(4) {
cmix[i / 4] = fnv(fnv(fnv(mix[i], mix[i + 1]), mix[i + 2]), mix[i + 3]);
}
let mut mix_hash = [0u8; 32];
for i in 0..8 {
mix_hash[i * 4..i * 4 + 4].copy_from_slice(&cmix[i].to_le_bytes());
}
let mut final_in = [0u8; 96];
final_in[..64].copy_from_slice(&s);
final_in[64..].copy_from_slice(&mix_hash);
let result = keccak256(&final_in);
(mix_hash, result)
}
}
/// Big-endian 256-bit compare: `result <= target` (the Ethash boundary check).
fn le_or_eq_be(result: &[u8; 32], target: &[u8; 32]) -> bool {
for i in 0..32 {
if result[i] != target[i] {
return result[i] < target[i];
}
}
true
}
/// Verify a candidate share. `light` must be for the job's epoch. Returns true
/// only if the recomputed result meets `target`; if `mix_hash` is provided
/// (from the GPU/submit), it must also match — catching a bad mix.
pub fn verify(
light: &Light,
header_hash: &[u8; 32],
nonce: u64,
target: &[u8; 32],
mix_hash: Option<&[u8; 32]>,
) -> bool {
let (mix, result) = light.hashimoto(header_hash, nonce);
if let Some(expected) = mix_hash {
if &mix != expected {
return false;
}
}
le_or_eq_be(&result, target)
}
#[cfg(test)]
mod tests {
use super::*;
fn hex32(s: &str) -> [u8; 32] {
let mut o = [0u8; 32];
for i in 0..32 {
o[i] = u8::from_str_radix(&s[2 * i..2 * i + 2], 16).unwrap();
}
o
}
/// KAT: Keccak-256("") — the canonical Ethereum empty-string hash. Validates
/// the whole Keccak core (permutation, padding, rate).
#[test]
fn keccak256_empty_kat() {
assert_eq!(
keccak256(b""),
hex32("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")
);
}
/// KAT: Keccak-256("abc").
#[test]
fn keccak256_abc_kat() {
assert_eq!(
keccak256(b"abc"),
hex32("4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
);
}
#[test]
fn fnv_matches_spec() {
// fnv(a,b) = a*FNV_PRIME ^ b, mod 2^32
assert_eq!(fnv(1, 0), FNV_PRIME);
assert_eq!(fnv(0, 7), 7);
}
#[test]
fn seedhash_epoch_roundtrip() {
let s = seedhash(3);
assert_eq!(epoch_from_seedhash(&s), Some(3));
assert_eq!(seedhash(0), [0u8; 32]);
}
/// Cache sizes are prime in HASH_BYTES units and shrink-search is stable.
#[test]
fn cache_size_is_prime_units() {
for e in [0u64, 1, 10] {
assert!(is_prime(cache_size(e) / HASH_BYTES));
assert!(is_prime(full_size(e) / MIX_BYTES));
}
}
/// Full-pipeline KAT for `hashimoto` (mkcache → dataset_item → mix → result),
/// using go-ethereum's canonical `TestHashimoto` vector
/// (`consensus/ethash/algorithm_test.go`): epoch-0 seed (32 zero bytes), a
/// 1024-byte / 16-row cache, dataset size 32*1024 bytes, header hash
/// `c9149cc0…`, nonce 0. This pins the *entire* light-verify path against a
/// trusted external implementation, not just the Keccak core.
#[test]
fn hashimoto_geth_kat() {
// 16-row cache from the epoch-0 seed (all zeros), and a 32768-byte
// dataset — the same tiny sizes geth's TestHashimoto uses.
let light = Light { epoch: 0, full_size: 32 * 1024, cache: mkcache(16, &[0u8; 32]) };
let header = hex32("c9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f");
let (mix, result) = light.hashimoto(&header, 0);
assert_eq!(
mix,
hex32("e4073cffaef931d37117cefd9afd27ea0f1cad6a981dd2605c4a1ac97c519800"),
"mix digest mismatch vs geth TestHashimoto"
);
assert_eq!(
result,
hex32("d3539235ee2e6f8db665c0a72169f55b7f6c605712330b778ec3944f0eb5a557"),
"result hash mismatch vs geth TestHashimoto"
);
// verify() must accept when result <= target and reject just below it.
let mut target = result;
assert!(verify(&light, &header, 0, &target, Some(&mix)));
// A wrong mix is rejected even when the result meets target.
assert!(!verify(&light, &header, 0, &target, Some(&[0u8; 32])));
// Tightening target one ulp below the result rejects the share.
for b in target.iter_mut().rev() {
if *b > 0 { *b -= 1; break; } else { *b = 0xff; }
}
assert!(!verify(&light, &header, 0, &target, None));
}
}
+462
View File
@@ -0,0 +1,462 @@
//! OpenCL Equihash 192,7 solver.
//!
//! Runs the entire solve on the GPU: BLAKE2b generation, all seven collision
//! rounds over a bucketed hash table, and back-reference recovery of the leaf
//! indices. Only a handful of candidate solutions cross back to the host, which
//! canonicalises, verifies and de-duplicates them. Building with
//! `--no-default-features` drops OpenCL entirely and the miner uses the CPU
//! solver.
//!
//! Memory layout: `NR_ROWS` buckets keyed by the high `ROW_BITS` bits of the
//! current 24-bit collision block, `NR_SLOTS` entries per bucket. Each slot is
//! u32 words — one leading word (leaf index for table 0, packed back-reference
//! otherwise) followed by blocks `r..7`, one 24-bit block per word so the
//! kernels do coalesced word-aligned loads/XORs.
//!
//! Sizing: `ROW_BITS=21` gives mean bucket occupancy 16 with a cap of 32 — the
//! 2x headroom that keeps overflow rare enough to find solutions. With the
//! split back-reference / ping-pong-block layout that costs ~6 GB (down from
//! ~11 GB when all seven block tables were resident), so 8 GB cards work.
//! Halving the buckets to save more memory makes mean = cap (heavy overflow →
//! ~zero solutions, measured), so `ROW_BITS=21` is the floor; `pick_geom` keeps
//! it and warns when a card is too small. `ZCL_OPENCL_ROWBITS` forces a value
//! for experimentation only (below 21 typically finds no solutions).
use anyhow::{anyhow, Result};
use ocl::{Buffer, MemFlags, ProQue};
use crate::blake;
use crate::equihash;
use crate::params::{BLAKE_CALLS, HASH_OUTPUT, HEADER_LEN, SOLUTION_INDICES};
/// Entries per bucket. Mean occupancy is 2^25 / NR_ROWS; overflow is dropped.
/// Must be a power of two. Kept fixed across VRAM profiles so the kernels' local
/// memory use is unchanged — only the bucket count (`ROW_BITS`) is scaled. At
/// fixed memory a higher mean has lower relative variance, so fewer buckets
/// overflow and more solutions survive.
const NR_SLOTS: usize = 32;
/// Bits needed to index a slot (log2 of NR_SLOTS).
const SLOT_BITS: usize = NR_SLOTS.trailing_zeros() as usize;
/// Maximum candidate solutions captured per nonce.
const MAX_SOLS: usize = 16384;
/// Number of collision tables (rounds 0..6) — i.e. back-reference arrays.
const NUM_TABLES: usize = 7;
/// Blocks per slot in a block working buffer (table 0 carries all 8). The two
/// ping-pong buffers are sized for this maximum.
const MAXB: usize = 8;
/// Table geometry, chosen to fit the device's VRAM. Only the bucket count
/// (`row_bits`) varies; `NR_SLOTS` is fixed.
#[derive(Clone, Copy)]
struct Geom {
row_bits: u32,
nr_rows: usize,
}
impl Geom {
fn new(row_bits: u32) -> Self {
Self { row_bits, nr_rows: 1usize << row_bits }
}
/// Total device memory used: 7 back-reference arrays (1 u32/slot, kept for
/// recovery) + 2 block working buffers (MAXB u32/slot) + per-table counters.
fn bytes(&self) -> u64 {
let slots = (self.nr_rows * NR_SLOTS) as u64;
let backrefs = NUM_TABLES as u64 * slots * 4;
let blocks = 2 * slots * MAXB as u64 * 4;
let counts = NUM_TABLES as u64 * self.nr_rows as u64 * 4;
backrefs + blocks + counts
}
/// Size of the largest single buffer (a block working buffer) — must fit the
/// device's `CL_DEVICE_MAX_MEM_ALLOC_SIZE`.
fn largest_alloc(&self) -> u64 {
(self.nr_rows * NR_SLOTS * MAXB * 4) as u64
}
}
/// The only geometry with enough bucket headroom (2x: mean 16, cap 32) to find
/// solutions. Smaller tables don't yield, so this is the floor.
const VIABLE_ROW_BITS: u32 = 21;
/// Choose the table geometry. There's effectively one viable size (~6 GB with
/// the split layout); we detect the device's VRAM and warn clearly if it's too
/// small (rather than failing later with a cryptic allocation error).
/// `ZCL_OPENCL_ROWBITS` forces a value for experimentation — note that anything
/// below 21 typically finds *no* solutions, so it won't actually mine.
fn pick_geom(device: &ocl::Device) -> Geom {
use ocl::enums::{DeviceInfo, DeviceInfoResult};
if let Ok(v) = std::env::var("ZCL_OPENCL_ROWBITS") {
if let Ok(rb) = v.parse::<u32>() {
let g = Geom::new(rb.clamp(16, 24));
log::warn!(
"OpenCL: ROW_BITS={} forced via ZCL_OPENCL_ROWBITS (~{:.1} GB tables); values below {VIABLE_ROW_BITS} usually find no solutions",
g.row_bits,
g.bytes() as f64 / 1e9,
);
return g;
}
}
let g = Geom::new(VIABLE_ROW_BITS);
let q = |k| device.info(k).ok();
let global = match q(DeviceInfo::GlobalMemSize) {
Some(DeviceInfoResult::GlobalMemSize(b)) => b,
_ => 0,
};
let max_alloc = match q(DeviceInfo::MaxMemAllocSize) {
Some(DeviceInfoResult::MaxMemAllocSize(b)) => b,
_ => 0,
};
if global > 0 {
log::info!(
"OpenCL: {:.1} GB VRAM (max alloc {:.1} GB); 192,7 tables need ~{:.1} GB",
global as f64 / 1e9,
max_alloc as f64 / 1e9,
g.bytes() as f64 / 1e9,
);
let fits = (global as f64 * 0.85) as u64 >= g.bytes()
&& (max_alloc == 0 || max_alloc >= g.largest_alloc());
if !fits {
log::warn!(
"OpenCL: this GPU has too little usable VRAM for the 192,7 tables (~{:.1} GB needed) — allocation will likely fail. Use a card with more VRAM, or the CUDA backend (--backend cuda) which needs only ~3.7 GB.",
g.bytes() as f64 / 1e9,
);
}
}
g
}
const KERNEL_BODY: &str = include_str!("../kernels/equihash.cl");
/// Build the kernel source with the host-side constants prepended.
fn kernel_source(geom: &Geom) -> String {
format!(
"#define NR_ROWS {nr_rows}u\n\
#define NR_SLOTS {nr_slots}u\n\
#define ROW_BITS {row_bits}u\n\
#define SLOT_BITS {slot_bits}u\n\
#define SLOT_MASK {slot_mask}u\n\
#define CBL 24u\n\
#define MAXB {maxb}u\n\
#define MAX_SOLS {max_sols}u\n\
{body}",
nr_rows = geom.nr_rows,
nr_slots = NR_SLOTS,
row_bits = geom.row_bits,
slot_bits = SLOT_BITS,
slot_mask = NR_SLOTS - 1,
maxb = MAXB,
max_sols = MAX_SOLS,
body = KERNEL_BODY,
)
}
/// A persistent OpenCL solver bound to one device.
pub struct GpuSolver {
pq: ProQue,
header: Buffer<u8>,
/// Per-table back-reference arrays (1 u32/slot), kept resident for recovery.
backref: Vec<Buffer<u32>>,
/// Two ping-pong block working buffers (MAXB u32/slot) reused across rounds.
blk: [Buffer<u32>; 2],
counts: Buffer<u32>,
sols: Buffer<u32>,
solcnt: Buffer<u32>,
out: Buffer<u32>,
/// Bucket count chosen for this device (kernel global work size).
nr_rows: usize,
}
impl GpuSolver {
/// This device's product name (e.g. "NVIDIA GeForce RTX 5080"), if available.
pub fn device_name(&self) -> Option<String> {
self.pq.device().name().ok()
}
/// Initialise the solver and allocate all device buffers.
pub fn new(device_index: usize) -> Result<Self> {
let (platform, device) = pick_device(device_index)?;
let geom = pick_geom(&device);
// The device's platform must be set explicitly: ProQue otherwise builds
// the context against `Platform::default()` (the first platform), which
// fails clCreateContext with CL_INVALID_VALUE when the chosen device
// lives on a different platform (e.g. an AMD card alongside NVIDIA).
let pq = ProQue::builder()
.src(kernel_source(&geom))
.platform(platform)
.device(device)
.dims(geom.nr_rows)
.build()
.map_err(|e| anyhow!("OpenCL build failed: {e}"))?;
let header = Buffer::<u8>::builder()
.queue(pq.queue().clone())
.flags(MemFlags::new().read_only())
.len(HEADER_LEN)
.build()?;
// One back-reference array per table (1 word/slot), kept for recovery.
let mut backref = Vec::with_capacity(NUM_TABLES);
for _ in 0..NUM_TABLES {
backref.push(
Buffer::<u32>::builder()
.queue(pq.queue().clone())
.flags(MemFlags::new().read_write())
.len(geom.nr_rows * NR_SLOTS)
.build()?,
);
}
// Two ping-pong block working buffers (MAXB words/slot).
let mk_blk = || -> Result<Buffer<u32>> {
Ok(Buffer::<u32>::builder()
.queue(pq.queue().clone())
.flags(MemFlags::new().read_write())
.len(geom.nr_rows * NR_SLOTS * MAXB)
.build()?)
};
let blk = [mk_blk()?, mk_blk()?];
let counts = Buffer::<u32>::builder()
.queue(pq.queue().clone())
.flags(MemFlags::new().read_write())
.len(NUM_TABLES * geom.nr_rows)
.build()?;
let sols = Buffer::<u32>::builder()
.queue(pq.queue().clone())
.len(MAX_SOLS)
.build()?;
let solcnt = Buffer::<u32>::builder()
.queue(pq.queue().clone())
.len(1)
.build()?;
let out = Buffer::<u32>::builder()
.queue(pq.queue().clone())
.len(MAX_SOLS * SOLUTION_INDICES)
.build()?;
Ok(Self { pq, header, backref, blk, counts, sols, solcnt, out, nr_rows: geom.nr_rows })
}
/// Run gen + collision rounds + final + recovery on the GPU. Returns the
/// raw candidate count and the recovered leaf indices (`n * 128`, where
/// `n = min(raw, MAX_SOLS)`).
fn run_pipeline(&self, header: &[u8]) -> Result<(usize, Vec<u32>)> {
self.header.write(header).enq()?;
self.counts.cmd().fill(0u32, None).enq()?;
self.solcnt.cmd().fill(0u32, None).enq()?;
// Round 0: hash + bucket into backref[0] + block buffer blk[0].
let gen = self
.pq
.kernel_builder("gen")
.arg(&self.header)
.arg(&self.backref[0])
.arg(&self.blk[0])
.arg(&self.counts)
.build()?;
unsafe { gen.cmd().global_work_size(BLAKE_CALLS).enq()?; }
// Intermediate collision rounds 0..5. Table r's blocks live in blk[r%2];
// each round reads that and writes table r+1's backref + blk[(r+1)%2].
for r in 0..(NUM_TABLES - 1) as u32 {
let src_blk = &self.blk[(r % 2) as usize];
let dst_blk = &self.blk[((r + 1) % 2) as usize];
let k = self
.pq
.kernel_builder("round_collide")
.arg(src_blk)
.arg(&self.backref[r as usize + 1])
.arg(dst_blk)
.arg(&self.counts)
.arg(r)
.build()?;
unsafe { k.cmd().global_work_size(self.nr_rows).enq()?; }
}
// Final round: table 6's blocks are in blk[6 % 2].
let fin = self
.pq
.kernel_builder("final_round")
.arg(&self.blk[(NUM_TABLES - 1) % 2])
.arg(&self.counts)
.arg(&self.sols)
.arg(&self.solcnt)
.build()?;
unsafe { fin.cmd().global_work_size(self.nr_rows).enq()?; }
let mut sc = [0u32; 1];
self.solcnt.read(&mut sc[..]).enq()?;
let raw = sc[0] as usize;
let n = raw.min(MAX_SOLS);
if n == 0 {
return Ok((raw, Vec::new()));
}
// Recover leaf indices for each candidate (walks the back-ref arrays).
let mut rec = self.pq.kernel_builder("recover");
for b in &self.backref {
rec.arg(b);
}
let rec = rec.arg(&self.sols).arg(&self.out).build()?;
unsafe { rec.cmd().global_work_size(n).enq()?; }
let mut out = vec![0u32; n * SOLUTION_INDICES];
self.out.read(&mut out[..]).enq()?;
Ok((raw, out))
}
/// Solve the puzzle for `header` (140 bytes). Returns valid, canonical,
/// de-duplicated solutions as leaf-index lists.
pub fn solve(&self, header: &[u8]) -> Result<Vec<Vec<u32>>> {
assert_eq!(header.len(), HEADER_LEN);
let base = blake::base_state(header);
let (_raw, out) = self.run_pipeline(header)?;
Ok(equihash::filter_candidates(&base, &out))
}
/// Time each GPU stage individually (forcing a sync between them).
pub fn profile(&self, header: &[u8]) -> Result<()> {
use log::info;
use std::time::Instant;
let q = self.pq.queue();
let stage = |q: &ocl::Queue, label: &str, t: Instant| -> Result<()> {
q.finish().map_err(|e| anyhow!("{label} failed: {e}"))?;
info!(" {label:14} {:6.1} ms", t.elapsed().as_secs_f64() * 1000.0);
Ok(())
};
self.header.write(header).enq()?;
self.counts.cmd().fill(0u32, None).enq()?;
self.solcnt.cmd().fill(0u32, None).enq()?;
q.finish().ok();
let t = Instant::now();
let gen = self
.pq
.kernel_builder("gen")
.arg(&self.header)
.arg(&self.backref[0])
.arg(&self.blk[0])
.arg(&self.counts)
.build()?;
unsafe { gen.cmd().global_work_size(BLAKE_CALLS).enq()?; }
stage(q, "gen", t)?;
for r in 0..(NUM_TABLES - 1) as u32 {
let t = Instant::now();
let src_blk = &self.blk[(r % 2) as usize];
let dst_blk = &self.blk[((r + 1) % 2) as usize];
let k = self
.pq
.kernel_builder("round_collide")
.arg(src_blk)
.arg(&self.backref[r as usize + 1])
.arg(dst_blk)
.arg(&self.counts)
.arg(r)
.build()?;
unsafe { k.cmd().global_work_size(self.nr_rows).enq()?; }
stage(q, &format!("round {r}"), t)?;
}
let t = Instant::now();
let fin = self
.pq
.kernel_builder("final_round")
.arg(&self.blk[(NUM_TABLES - 1) % 2])
.arg(&self.counts)
.arg(&self.sols)
.arg(&self.solcnt)
.build()?;
unsafe { fin.cmd().global_work_size(self.nr_rows).enq()?; }
stage(q, "final", t)?;
Ok(())
}
/// Solve and also return the raw GPU candidate count (for diagnostics).
pub fn solve_with_stats(&self, header: &[u8]) -> Result<(usize, Vec<Vec<u32>>)> {
assert_eq!(header.len(), HEADER_LEN);
let base = blake::base_state(header);
let (raw, out) = self.run_pipeline(header)?;
Ok((raw, equihash::filter_candidates(&base, &out)))
}
/// Compute every first-round BLAKE2b output (one 48-byte digest per index).
/// Used by the self-test to compare the GPU kernel against the CPU.
pub fn hash_all(&self, header: &[u8]) -> Result<Vec<u8>> {
assert_eq!(header.len(), HEADER_LEN);
self.header.write(header).enq()?;
let out = Buffer::<u8>::builder()
.queue(self.pq.queue().clone())
.flags(MemFlags::new().write_only())
.len(BLAKE_CALLS * HASH_OUTPUT)
.build()?;
let kernel = self
.pq
.kernel_builder("equihash_hash")
.arg(&self.header)
.arg(&out)
.build()?;
unsafe { kernel.cmd().global_work_size(BLAKE_CALLS).enq()?; }
let mut buf = vec![0u8; BLAKE_CALLS * HASH_OUTPUT];
out.read(&mut buf).enq()?;
Ok(buf)
}
}
/// List `(platform, device)` names so the user can choose `--device`.
pub fn list_devices() -> Result<Vec<String>> {
use ocl::{Device, Platform};
let mut names = Vec::new();
let mut idx = 0;
for platform in Platform::list() {
let pname = platform.name().unwrap_or_else(|_| "?".into());
for device in Device::list_all(platform).unwrap_or_default() {
let dname = device.name().unwrap_or_else(|_| "?".into());
names.push(format!("[{idx}] {pname} / {dname}"));
idx += 1;
}
}
Ok(names)
}
/// The flat OpenCL device index of the first CPU-type device (e.g. PoCL), if any.
/// Lets CPU mining run through the OpenCL backend on the CPU. The index matches
/// [`list_devices`] / `--devices`.
pub fn cpu_device_index() -> Option<usize> {
use ocl::enums::{DeviceInfo, DeviceInfoResult};
use ocl::{Device, Platform};
let mut idx = 0;
for platform in Platform::list() {
for device in Device::list_all(platform).unwrap_or_default() {
let is_cpu = matches!(
device.info(DeviceInfo::Type).ok(),
Some(DeviceInfoResult::Type(t)) if t.contains(ocl::flags::DeviceType::CPU)
);
if is_cpu {
return Some(idx);
}
idx += 1;
}
}
None
}
/// Resolve a flat device index across all platforms, returning the device along
/// with the platform it belongs to (needed to build the context against the
/// right platform).
fn pick_device(index: usize) -> Result<(ocl::Platform, ocl::Device)> {
use ocl::{Device, Platform};
let mut idx = 0;
for platform in Platform::list() {
for device in Device::list_all(platform).unwrap_or_default() {
if idx == index {
return Ok((platform, device));
}
idx += 1;
}
}
Err(anyhow!("no OpenCL device with index {index}"))
}
+81
View File
@@ -0,0 +1,81 @@
//! GPU device probing for the config tool (`jackpotminer-config` only — this is
//! not compiled into the miner, so there is no duplicate FFI).
//!
//! With the `gpu`/`cuda` features the OpenCL/CUDA SDKs are linked in (build.rs
//! links `cuda`/`nvml`; the `ocl` crate links `OpenCL`), and the tool enumerates
//! devices directly — handy on Windows where you may not want to shell out to
//! the miner. Without those features the functions return empty lists and the
//! tool falls back to spawning `jackpotminer --devices-json`.
/// True when at least one GPU SDK is compiled in, so direct probing works.
pub const HAS_SDK: bool = cfg!(feature = "gpu") || cfg!(feature = "cuda");
/// OpenCL devices as `"[i] <platform> / <device>"` (empty without the SDK or on
/// any enumeration error).
#[cfg(feature = "gpu")]
pub fn opencl() -> Vec<String> {
use ocl::{Device, Platform};
let mut names = Vec::new();
let mut idx = 0;
for platform in Platform::list() {
let pname = platform.name().unwrap_or_else(|_| "?".into());
for device in Device::list_all(platform).unwrap_or_default() {
let dname = device.name().unwrap_or_else(|_| "?".into());
names.push(format!("[{idx}] {pname} / {dname}"));
idx += 1;
}
}
names
}
#[cfg(not(feature = "gpu"))]
pub fn opencl() -> Vec<String> {
Vec::new()
}
/// CUDA devices as `"[i] <name>"` via the driver API (empty without the SDK, no
/// driver, or any error). Uses a tiny self-contained FFI subset.
#[cfg(feature = "cuda")]
pub fn cuda() -> Vec<String> {
use std::ffi::CStr;
use std::os::raw::{c_char, c_int, c_uint};
// Linked via build.rs (`cuda`), matching src/cuda.rs's declarations.
extern "C" {
fn cuInit(flags: c_uint) -> c_int;
fn cuDeviceGetCount(count: *mut c_int) -> c_int;
fn cuDeviceGet(device: *mut c_int, ordinal: c_int) -> c_int;
fn cuDeviceGetName(name: *mut c_char, len: c_int, dev: c_int) -> c_int;
}
let mut out = Vec::new();
unsafe {
if cuInit(0) != 0 {
return out;
}
let mut n: c_int = 0;
if cuDeviceGetCount(&mut n) != 0 {
return out;
}
for i in 0..n {
let mut dev: c_int = 0;
let name = if cuDeviceGet(&mut dev, i) == 0 {
let mut buf = [0i8; 128];
if cuDeviceGetName(buf.as_mut_ptr() as *mut c_char, 128, dev) == 0 {
CStr::from_ptr(buf.as_ptr() as *const c_char).to_string_lossy().into_owned()
} else {
format!("CUDA device {i}")
}
} else {
format!("CUDA device {i}")
};
out.push(format!("[{i}] {name}"));
}
}
out
}
#[cfg(not(feature = "cuda"))]
pub fn cuda() -> Vec<String> {
Vec::new()
}
+229
View File
@@ -0,0 +1,229 @@
//! Platform-agnostic GPU tuning.
//!
//! [`GpuTuner`] is the per-card control surface (clocks, power, offsets, power
//! readout). The Linux backend is NVML ([`crate::nvml`]); a Windows NVAPI backend
//! can implement the same trait without touching the policy in [`apply`] or any
//! call site. [`open`] picks the backend for the running platform.
//!
//! All setters are best-effort and report a [`SetOutcome`] (most need elevated
//! privileges); the miner never fails because a knob couldn't be turned.
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::OnceLock;
use log::{debug, info, warn};
/// Tuning configuration from the CLI flags, set once at startup via [`configure`].
#[derive(Clone, Copy, Default)]
pub struct TuneConfig {
/// Master switch (false ⇒ touch nothing; from `--no-gpu-tune`).
pub enabled: bool,
pub power_limit_w: Option<u32>,
pub gpu_clock_mhz: Option<u32>,
pub mem_clock_mhz: Option<u32>,
pub gpu_offset_mhz: Option<i32>,
pub mem_offset_mhz: Option<i32>,
/// Sweep the core offset for the fastest stable solve rate.
pub auto_tune: bool,
/// Live dashboard controls are unlocked: keep clocks free to boost (not hard
/// locked) so the user's VF offsets actually take effect.
pub unlock_controls: bool,
}
static CONFIG: OnceLock<TuneConfig> = OnceLock::new();
/// Install the tuning configuration (call once, before any solver is built).
pub fn configure(cfg: TuneConfig) {
let _ = CONFIG.set(cfg);
}
fn config() -> TuneConfig {
CONFIG.get().copied().unwrap_or_default()
}
/// Per-device tuning overrides (from a config file's `[[gpu]]` tables). Any field
/// set here overrides the global [`TuneConfig`] for that device index.
#[derive(Clone, Copy, Default)]
pub struct DeviceTune {
pub power_limit_w: Option<u32>,
pub gpu_clock_mhz: Option<u32>,
pub mem_clock_mhz: Option<u32>,
pub gpu_offset_mhz: Option<i32>,
pub mem_offset_mhz: Option<i32>,
}
static DEVICE_CONFIG: OnceLock<Vec<(usize, DeviceTune)>> = OnceLock::new();
/// Install per-device tuning overrides (call once, before any solver is built).
pub fn configure_devices(overrides: Vec<(usize, DeviceTune)>) {
let _ = DEVICE_CONFIG.set(overrides);
}
/// The effective config for `device_index`: the global config with any matching
/// per-device override folded in.
fn device_config(device_index: usize) -> TuneConfig {
let mut cfg = config();
if let Some(d) = DEVICE_CONFIG
.get()
.and_then(|v| v.iter().find(|(i, _)| *i == device_index))
.map(|(_, d)| *d)
{
cfg.power_limit_w = d.power_limit_w.or(cfg.power_limit_w);
cfg.gpu_clock_mhz = d.gpu_clock_mhz.or(cfg.gpu_clock_mhz);
cfg.mem_clock_mhz = d.mem_clock_mhz.or(cfg.mem_clock_mhz);
cfg.gpu_offset_mhz = d.gpu_offset_mhz.or(cfg.gpu_offset_mhz);
cfg.mem_offset_mhz = d.mem_offset_mhz.or(cfg.mem_offset_mhz);
}
cfg
}
/// Whether auto-tuning is enabled (and tuning isn't disabled outright).
pub fn auto_tune_enabled() -> bool {
let c = config();
c.enabled && c.auto_tune
}
/// Result of a privileged set call, for logging and change tracking.
pub enum SetOutcome {
Applied,
Denied,
Unsupported,
Failed(String),
}
impl SetOutcome {
/// Did the change actually take effect?
pub fn applied(&self) -> bool {
matches!(self, SetOutcome::Applied)
}
}
/// Per-GPU control surface. One implementation per platform (NVML on Linux,
/// NVAPI on Windows). Setters clamp to the card's own limits.
pub trait GpuTuner: Send {
fn name(&self) -> String;
/// Current board power draw in watts, or `None` if unavailable.
fn watts(&self) -> Option<f64>;
/// Current GPU core temperature in °C, or `None` if unavailable.
fn temperature_c(&self) -> Option<u32>;
/// Currently enforced power limit in watts, or `None` if unavailable.
fn current_power_limit_w(&self) -> Option<u32>;
/// Current SM (core) clock in MHz, or `None` if unavailable.
fn core_clock_mhz(&self) -> Option<u32>;
/// Current memory clock in MHz, or `None` if unavailable.
fn mem_clock_mhz(&self) -> Option<u32>;
fn max_core_clock_mhz(&self) -> Option<u32>;
fn max_mem_clock_mhz(&self) -> Option<u32>;
fn power_limit_range_w(&self) -> Option<(u32, u32)>;
fn set_persistence(&self, on: bool) -> SetOutcome;
fn lock_core_clock_mhz(&self, mhz: u32) -> SetOutcome;
fn lock_mem_clock_mhz(&self, mhz: u32) -> SetOutcome;
fn set_power_limit_w(&self, watts: u32) -> SetOutcome;
fn set_core_offset_mhz(&self, mhz: i32) -> SetOutcome;
fn set_mem_offset_mhz(&self, mhz: i32) -> SetOutcome;
/// Restore default clocks / power / offsets.
fn reset(&self);
}
/// Open a control handle for the GPU at `pci_bus_id` (matches the physical card
/// regardless of CUDA-vs-driver index ordering). `None` if unavailable.
///
/// NVML is the backend on both Linux (`libnvidia-ml`) and Windows (`nvml.dll`);
/// the C API is identical, so the same [`crate::nvml`] code serves both.
pub fn open(pci_bus_id: &str) -> Option<Box<dyn GpuTuner>> {
#[cfg(any(unix, windows))]
{
crate::nvml::open(pci_bus_id)
}
#[cfg(not(any(unix, windows)))]
{
let _ = pci_bus_id;
None
}
}
static WARNED_PRIVS: AtomicBool = AtomicBool::new(false);
fn log_set(out: SetOutcome, name: &str, what: &str, denied: &mut bool) -> bool {
match out {
SetOutcome::Applied => {
info!("{name}: {what} ✓");
true
}
SetOutcome::Denied => {
*denied = true;
debug!("{name}: {what} — needs elevated privileges");
false
}
SetOutcome::Unsupported => {
debug!("{name}: {what} — not supported");
false
}
SetOutcome::Failed(e) => {
warn!("{name}: {what} failed ({e})");
false
}
}
}
/// Apply the configured tuning policy to one card. Returns true if anything
/// changed (so the caller restores defaults on exit).
///
/// With no flags it locks clocks + power to the card maximum (peak hashrate).
/// Any flag — including `--auto-tune` and `--unlock-controls` — switches to
/// manual mode: only requested knobs are applied, and clocks are left free to
/// boost so a clock offset (from auto-tune or the live dashboard controls) isn't
/// defeated by a hard lock. Auto-tune and unlocked controls still force power to
/// max for headroom.
pub fn apply(t: &dyn GpuTuner, device_index: usize) -> bool {
let cfg = device_config(device_index);
if !cfg.enabled {
return false;
}
let name = t.name();
let mut denied = false;
let mut changed = false;
// Keep the driver resident so clocks don't drop between solves (harmless to
// leave on, so not counted as a change to undo).
log_set(t.set_persistence(true), &name, "persistence mode", &mut denied);
let manual = cfg.auto_tune
|| cfg.unlock_controls
|| cfg.power_limit_w.is_some()
|| cfg.gpu_clock_mhz.is_some()
|| cfg.mem_clock_mhz.is_some()
|| cfg.gpu_offset_mhz.is_some()
|| cfg.mem_offset_mhz.is_some();
// Core / memory clock: lock to the requested value, or to max in default mode.
if let Some(mhz) = cfg.gpu_clock_mhz.or((!manual).then(|| t.max_core_clock_mhz()).flatten()) {
changed |= log_set(t.lock_core_clock_mhz(mhz), &name, &format!("lock SM clock @ {mhz} MHz"), &mut denied);
}
if let Some(mhz) = cfg.mem_clock_mhz.or((!manual).then(|| t.max_mem_clock_mhz()).flatten()) {
changed |= log_set(t.lock_mem_clock_mhz(mhz), &name, &format!("lock memory clock @ {mhz} MHz"), &mut denied);
}
// Power: requested cap, or max in default mode / for auto-tune headroom /
// when controls are unlocked (so freeing the clocks doesn't cost performance).
let want_max_power = !manual || cfg.auto_tune || cfg.unlock_controls;
if let Some(w) = cfg.power_limit_w.or(want_max_power.then(|| t.power_limit_range_w().map(|(_, mx)| mx)).flatten()) {
changed |= log_set(t.set_power_limit_w(w), &name, &format!("power limit @ {w} W"), &mut denied);
}
// Clock offsets. Auto-tune owns both the core and memory offsets (it sweeps
// them), so skip the static offsets in that case.
if !cfg.auto_tune {
if let Some(off) = cfg.gpu_offset_mhz {
changed |= log_set(t.set_core_offset_mhz(off), &name, &format!("core clock offset {off:+} MHz"), &mut denied);
}
if let Some(off) = cfg.mem_offset_mhz {
changed |= log_set(t.set_mem_offset_mhz(off), &name, &format!("memory clock offset {off:+} MHz"), &mut denied);
}
}
if denied && !WARNED_PRIVS.swap(true, Ordering::Relaxed) {
warn!("some GPU performance settings need elevated privileges — run the miner as root (Linux) or Administrator (Windows) for full effect (clocks/power stay at defaults otherwise)");
}
changed
}
+1107
View File
File diff suppressed because it is too large Load Diff
+845
View File
@@ -0,0 +1,845 @@
//! Mining loop: build headers from pool work, run the solver, check candidate
//! solutions against the share target, and submit winners.
use std::sync::atomic::{AtomicBool, AtomicU32, AtomicU64, Ordering};
use std::sync::{Arc, OnceLock};
use std::time::{Duration, Instant};
use anyhow::{anyhow, Result};
use log::{info, warn};
use sha2::{Digest, Sha256};
use crate::cpu_groups::{CpuGroups, CpuMining};
use crate::equihash;
use crate::params::{HEADER_LEN, SOLUTION_BYTES};
use crate::stratum::{StratumClient, Work};
/// Double SHA-256, as used for the Zcash/ZClassic block PoW hash.
fn sha256d(data: &[u8]) -> [u8; 32] {
let first = Sha256::digest(data);
let second = Sha256::digest(first);
let mut out = [0u8; 32];
out.copy_from_slice(&second);
out
}
/// Does this header hash meet the target? The block hash is the byte-reversed
/// SHA-256d digest, compared big-endian against the target.
fn meets_target(header_with_solution: &[u8], target: &[u8; 32]) -> bool {
let h = sha256d(header_with_solution);
// Reverse to big-endian for an ordinary lexicographic comparison.
let mut be = h;
be.reverse();
be <= *target
}
/// Compose the 140-byte header from the job prefix and a full 32-byte nonce.
fn build_header(work: &Work, nonce: &[u8; 32]) -> Vec<u8> {
let mut header = Vec::with_capacity(HEADER_LEN);
header.extend_from_slice(&work.prefix);
header.extend_from_slice(nonce);
debug_assert_eq!(header.len(), HEADER_LEN);
header
}
/// Serialise a solution with its Bitcoin compact-size length prefix (0xfd +
/// uint16 LE for 400 bytes).
fn encode_solution_field(solution: &[u8]) -> Vec<u8> {
debug_assert_eq!(solution.len(), SOLUTION_BYTES);
let mut out = Vec::with_capacity(3 + SOLUTION_BYTES);
out.push(0xfd);
out.extend_from_slice(&(SOLUTION_BYTES as u16).to_le_bytes());
out.extend_from_slice(solution);
out
}
/// Which solver runs the puzzle.
pub enum Backend {
/// CPU solver, with an optional per-group clamp for the fast (probabilistic)
/// mining path; `None` runs the exact solver.
Cpu(Option<usize>),
#[cfg(feature = "gpu")]
Gpu(crate::gpu::GpuSolver),
#[cfg(feature = "cuda")]
Cuda(crate::cuda::CudaSolver),
}
impl Backend {
pub fn name(&self) -> String {
match self {
Backend::Cpu(_) => "CPU".to_string(),
#[cfg(feature = "gpu")]
Backend::Gpu(_) => "GPU (OpenCL)".to_string(),
#[cfg(feature = "cuda")]
Backend::Cuda(_) => "GPU (CUDA)".to_string(),
}
}
/// Run the full solver for one header, returning valid solutions
/// (synchronous; used by the benchmark/self-test paths).
pub fn solve(&self, header: &[u8]) -> Result<Vec<Vec<u32>>> {
match self {
Backend::Cpu(clamp) => Ok(equihash::solve_with(header, *clamp)),
#[cfg(feature = "gpu")]
Backend::Gpu(solver) => solver.solve(header),
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.solve(header),
}
}
/// How many `enqueue` calls happen before that header's results come back.
/// 0 = synchronous (CPU/OpenCL); the CUDA backend pipelines one pass deep so
/// the GPU keeps working while the host verifies the previous pass.
pub fn pipeline_depth(&self) -> usize {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(_) => 1,
_ => 0,
}
}
/// Submit `header` for solving. Returns solutions for the header passed
/// `pipeline_depth()` calls ago (current header when depth is 0).
pub fn enqueue(&mut self, header: &[u8]) -> Result<Vec<Vec<u32>>> {
match self {
Backend::Cpu(clamp) => Ok(equihash::solve_with(header, *clamp)),
#[cfg(feature = "gpu")]
Backend::Gpu(solver) => solver.solve(header),
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.enqueue(header),
}
}
/// Flush the final in-flight pass(es) at shutdown (no-op when depth is 0).
pub fn drain(&mut self) -> Result<Vec<Vec<u32>>> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.drain(),
_ => Ok(Vec::new()),
}
}
/// The GPU's product name (e.g. "NVIDIA GeForce RTX 5080"), if the backend
/// can report it.
pub fn device_name(&self) -> Option<String> {
match self {
Backend::Cpu(_) => None,
#[cfg(feature = "gpu")]
Backend::Gpu(solver) => solver.device_name(),
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.device_name(),
}
}
/// Current board power draw in watts, if the backend can report it.
pub fn power_watts(&self) -> Option<f64> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.power_watts(),
_ => None,
}
}
/// Current GPU core temperature in °C, if the backend can report it.
pub fn temperature_c(&self) -> Option<u32> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.temperature_c(),
_ => None,
}
}
/// Currently enforced power limit in watts, if the backend can report it.
pub fn current_power_limit_w(&self) -> Option<u32> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.current_power_limit_w(),
_ => None,
}
}
/// This card's (min, max) settable power limit in watts, if reportable.
pub fn power_limit_range_w(&self) -> Option<(u32, u32)> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.power_limit_range_w(),
_ => None,
}
}
/// The core clock offset (MHz) `--auto-tune` settled on, if it ran.
pub fn tuned_core_offset(&self) -> Option<i32> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.tuned_core_offset(),
_ => None,
}
}
/// The memory clock offset (MHz) `--auto-tune` settled on, if it ran.
pub fn tuned_mem_offset(&self) -> Option<i32> {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.tuned_mem_offset(),
_ => None,
}
}
/// Current (SM core, memory) clock in MHz, each `None` if unavailable.
pub fn current_clocks_mhz(&self) -> (Option<u32>, Option<u32>) {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.current_clocks_mhz(),
_ => (None, None),
}
}
/// Apply live dashboard hardware controls (core/mem VF offsets in MHz, power
/// target in watts) to this backend's card. No-op for non-GPU backends.
#[allow(unused_variables)]
pub fn apply_hw_controls(&self, core_off: i32, mem_off: i32, power_w: u32) {
match self {
#[cfg(feature = "cuda")]
Backend::Cuda(solver) => solver.apply_hw_controls(core_off, mem_off, power_w),
_ => {}
}
}
}
/// Describes a solver to launch on its own thread. Construction happens inside
/// the worker thread so each device initialises its own GPU context.
#[derive(Clone, Copy)]
pub enum BackendSpec {
Cpu(Option<usize>),
#[cfg(feature = "gpu")]
Gpu(usize),
#[cfg(feature = "cuda")]
Cuda(usize),
}
impl BackendSpec {
pub fn build(&self) -> Result<Backend> {
match self {
BackendSpec::Cpu(clamp) => Ok(Backend::Cpu(*clamp)),
#[cfg(feature = "gpu")]
BackendSpec::Gpu(device) => Ok(Backend::Gpu(crate::gpu::GpuSolver::new(*device)?)),
#[cfg(feature = "cuda")]
BackendSpec::Cuda(device) => Ok(Backend::Cuda(crate::cuda::CudaSolver::new(*device)?)),
}
}
fn label(&self) -> String {
match self {
BackendSpec::Cpu(_) => "CPU".to_string(),
#[cfg(feature = "gpu")]
BackendSpec::Gpu(d) => format!("GPU {d} (OpenCL)"),
#[cfg(feature = "cuda")]
BackendSpec::Cuda(d) => format!("GPU {d} (CUDA)"),
}
}
}
/// Progress counters for one worker (card).
struct WorkerStats {
/// Valid solutions produced (the comparable "Sol/s" metric pools report).
solutions: AtomicU64,
shares: AtomicU64,
/// Most recent board power sample in milliwatts (0 = unknown).
power_mw: AtomicU32,
/// Most recent GPU core temperature in °C (0 = unknown).
temp_c: AtomicU32,
/// Most recent SM core / memory clocks in MHz (0 = unknown).
core_clock_mhz: AtomicU32,
mem_clock_mhz: AtomicU32,
/// The card's product name, published once the backend is built.
name: OnceLock<String>,
}
/// Per-worker progress counters reported periodically, plus each worker's label.
pub(crate) struct Stats {
workers: Vec<WorkerStats>,
labels: Vec<String>,
}
/// A point-in-time copy of one card's counters, for the TUI / reporter.
pub(crate) struct CardSnapshot {
/// Index + backend label, e.g. "GPU 0 (CUDA)".
pub label: String,
/// Product name, e.g. "NVIDIA GeForce RTX 5080" (once the backend is built).
pub name: Option<String>,
pub solutions: u64,
pub shares: u64,
pub power_mw: u32,
pub temp_c: u32,
pub core_clock_mhz: u32,
pub mem_clock_mhz: u32,
}
impl Stats {
/// Snapshot every card's current counters (cheap atomic loads).
pub(crate) fn cards(&self) -> Vec<CardSnapshot> {
self.workers
.iter()
.enumerate()
.map(|(i, w)| CardSnapshot {
label: self.labels[i].clone(),
name: w.name.get().cloned(),
solutions: w.solutions.load(Ordering::Relaxed),
shares: w.shares.load(Ordering::Relaxed),
power_mw: w.power_mw.load(Ordering::Relaxed),
temp_c: w.temp_c.load(Ordering::Relaxed),
core_clock_mhz: w.core_clock_mhz.load(Ordering::Relaxed),
mem_clock_mhz: w.mem_clock_mhz.load(Ordering::Relaxed),
})
.collect()
}
/// Construct an all-zero `Stats` with the given worker labels (tests only).
#[cfg(test)]
pub(crate) fn for_test(labels: Vec<String>) -> Self {
let workers = labels
.iter()
.map(|_| WorkerStats {
solutions: AtomicU64::new(0),
shares: AtomicU64::new(0),
power_mw: AtomicU32::new(0),
temp_c: AtomicU32::new(0),
core_clock_mhz: AtomicU32::new(0),
mem_clock_mhz: AtomicU32::new(0),
name: OnceLock::new(),
})
.collect();
Self { workers, labels }
}
}
/// Mine until interrupted. One worker thread per backend draws nonces from a
/// shared counter and submits shares through the shared pool client. If
/// `job_timeout` is set, a worker pauses when no new job has arrived within it
/// (stale work) and resumes when fresh work comes in.
#[allow(clippy::too_many_arguments)]
pub fn run(
client: Arc<StratumClient>,
specs: Vec<BackendSpec>,
running: Arc<AtomicBool>,
job_timeout: Option<Duration>,
tui: bool,
pool: String,
controls: Arc<crate::controls::Controls>,
cpu_mining: Arc<CpuMining>,
cpu_clamp: Option<usize>,
control_port: Option<u16>,
) -> Result<()> {
let nonce_counter = Arc::new(AtomicU64::new(0));
let labels: Vec<String> = specs.iter().map(|s| s.label()).collect();
let stats = Arc::new(Stats {
workers: (0..specs.len())
.map(|_| WorkerStats {
solutions: AtomicU64::new(0),
shares: AtomicU64::new(0),
power_mw: AtomicU32::new(0),
temp_c: AtomicU32::new(0),
core_clock_mhz: AtomicU32::new(0),
mem_clock_mhz: AtomicU32::new(0),
name: OnceLock::new(),
})
.collect(),
labels,
});
let mut handles = Vec::new();
for (id, spec) in specs.into_iter().enumerate() {
let client = client.clone();
let running = running.clone();
let nonce_counter = nonce_counter.clone();
let stats = stats.clone();
let controls = controls.clone();
handles.push(std::thread::spawn(move || {
if let Err(e) = worker(id, spec, client, running, nonce_counter, stats, job_timeout, controls) {
warn!("worker {id} ({}) stopped: {e}", spec.label());
}
}));
}
// One supervisor thread for CPU mining: it spawns a worker per CPU group and
// rebuilds them whenever the group size is changed from the dashboard. Each
// group worker idles until the user enables it.
{
let client = client.clone();
let running = running.clone();
let nonce_counter = nonce_counter.clone();
let cpu_mining = cpu_mining.clone();
handles.push(std::thread::spawn(move || {
cpu_mining_supervisor(cpu_mining, cpu_clamp, client, running, nonce_counter, job_timeout);
}));
}
// Optional local control server for the GUI config tool (live retrieve/adjust).
if let Some(port) = control_port {
let controls = controls.clone();
let cpu_mining = cpu_mining.clone();
let stats = stats.clone();
let running = running.clone();
handles.push(std::thread::spawn(move || {
crate::control::serve(port, controls, cpu_mining, stats, running);
}));
}
if tui {
// Foreground dashboard (replaces the periodic log reporter). Blocks until
// Ctrl-C clears `running`; workers then wind down and we join below.
crate::tui::run(&stats, &pool, &running, Instant::now(), &client, &controls, &cpu_mining);
} else {
// Reporter thread: per-card throughput (plus a total when multi-card).
let running = running.clone();
let stats = stats.clone();
handles.push(std::thread::spawn(move || {
let n = stats.workers.len();
let mut last = Instant::now();
let mut last_sol = vec![0u64; n];
while running.load(Ordering::Relaxed) {
std::thread::sleep(Duration::from_millis(500));
if last.elapsed() < Duration::from_secs(10) {
continue;
}
let dt = last.elapsed().as_secs_f64();
let mut total_sol = 0.0;
let mut total_shares = 0u64;
let mut total_w = 0.0;
for i in 0..n {
let sol = stats.workers[i].solutions.load(Ordering::Relaxed);
let shares = stats.workers[i].shares.load(Ordering::Relaxed);
let watts = stats.workers[i].power_mw.load(Ordering::Relaxed) as f64 / 1000.0;
let sol_s = (sol - last_sol[i]) as f64 / dt;
// Append power + efficiency only when the card reports power.
let power = if watts > 0.0 {
total_w += watts;
format!(", {watts:.0} W, {:.2} Sol/W", sol_s / watts)
} else {
String::new()
};
let temp = match stats.workers[i].temp_c.load(Ordering::Relaxed) {
0 => String::new(),
t => format!(", {t}°C"),
};
let dev = stats.workers[i].name.get().map(|n| format!("{n}")).unwrap_or_default();
info!("{}{dev}: {sol_s:.1} Sol/s ({shares} shares{power}{temp})", stats.labels[i]);
last_sol[i] = sol;
total_sol += sol_s;
total_shares += shares;
}
if n > 1 {
let power = if total_w > 0.0 {
format!(", {total_w:.0} W, {:.2} Sol/W", total_sol / total_w)
} else {
String::new()
};
info!("total: {total_sol:.1} Sol/s ({total_shares} shares{power})");
}
last = Instant::now();
}
}));
}
for h in handles {
let _ = h.join();
}
Ok(())
}
/// The context needed to check and submit one in-flight pass's results: the job
/// it was built for and the nonce that produced it. Kept in a queue because GPU
/// backends return results lagged by `pipeline_depth` passes.
struct Pending {
header: Vec<u8>,
nonce: [u8; 32],
nonce1_len: usize,
job_id: String,
time_hex: String,
target: [u8; 32],
}
/// Per-device mining loop. Keeps the pipeline `depth` passes deep so a GPU stays
/// busy while the host verifies the previous pass's results.
fn worker(
id: usize,
spec: BackendSpec,
client: Arc<StratumClient>,
running: Arc<AtomicBool>,
nonce_counter: Arc<AtomicU64>,
stats: Arc<Stats>,
job_timeout: Option<Duration>,
controls: Arc<crate::controls::Controls>,
) -> Result<()> {
let mut backend = spec.build()?;
let depth = backend.pipeline_depth();
// Publish the card's product name for the dashboard/reporter.
if let Some(name) = backend.device_name() {
let _ = stats.workers[id].name.set(name);
}
// This worker drives its own device's control block.
let dev_ctrl = controls.device(id);
// Reflect the core/memory offsets --auto-tune locked in (already applied to
// the card) in the dashboard panel.
if let Some(core) = backend.tuned_core_offset() {
dev_ctrl.set_core_display(core);
dev_ctrl.set_mem_display(backend.tuned_mem_offset().unwrap_or(0));
}
// Seed the TUI's TDP control + clamp range from the card, and only start
// applying dashboard controls once the user actually changes one.
if let Some(cur) = backend.current_power_limit_w() {
let (min, max) = backend.power_limit_range_w().unwrap_or((0, u32::MAX));
dev_ctrl.init_power(cur, min, max);
}
let mut last_ctrl_seq = dev_ctrl.seq();
let dev = stats.workers[id].name.get().map(|n| format!("{n}")).unwrap_or_default();
info!("worker {id}: {} backend ready ({}{dev})", backend.name(), spec.label());
let work_handle = client.work();
// Wait for the first job.
let mut current = loop {
if !running.load(Ordering::Relaxed) {
return Ok(());
}
if let Some(w) = work_handle.get() {
break w;
}
std::thread::sleep(Duration::from_millis(200));
};
// Outstanding passes whose results haven't come back yet (FIFO).
let mut inflight: std::collections::VecDeque<Pending> = std::collections::VecDeque::new();
let mut pass = 0u64;
let mut last_job = Instant::now();
let mut paused = false;
let mut disabled_pause = false;
while running.load(Ordering::Relaxed) {
if work_handle.epoch() != current.epoch {
if let Some(w) = work_handle.get() {
current = w;
}
last_job = Instant::now();
if paused {
info!("worker {id}: new job received, resuming");
paused = false;
}
}
// Dashboard enable/disable for this device (Backspace in the TUI). A
// disabled device drains its pipeline and idles, clearing its readouts,
// until it is re-enabled.
if !dev_ctrl.enabled() {
if !disabled_pause {
info!("worker {id}: disabled from dashboard, idling");
drain_pipeline(id, &mut backend, &mut inflight, &client, &stats)?;
stats.workers[id].power_mw.store(0, Ordering::Relaxed);
stats.workers[id].temp_c.store(0, Ordering::Relaxed);
stats.workers[id].core_clock_mhz.store(0, Ordering::Relaxed);
stats.workers[id].mem_clock_mhz.store(0, Ordering::Relaxed);
disabled_pause = true;
}
std::thread::sleep(Duration::from_millis(200));
continue;
}
if disabled_pause {
info!("worker {id}: re-enabled from dashboard, resuming");
disabled_pause = false;
last_job = Instant::now(); // don't trip the stale guard on resume
}
// Stale-work guard: if no fresh job has arrived within `job_timeout`,
// stop solving (drain the pipeline, idle) until new work comes in.
if let Some(timeout) = job_timeout {
if last_job.elapsed() >= timeout {
if !paused {
warn!("worker {id}: no new job in {}s — pausing (work likely stale)", timeout.as_secs());
drain_pipeline(id, &mut backend, &mut inflight, &client, &stats)?;
stats.workers[id].power_mw.store(0, Ordering::Relaxed);
stats.workers[id].temp_c.store(0, Ordering::Relaxed);
stats.workers[id].core_clock_mhz.store(0, Ordering::Relaxed);
stats.workers[id].mem_clock_mhz.store(0, Ordering::Relaxed);
paused = true;
}
std::thread::sleep(Duration::from_millis(200));
continue;
}
}
// Apply any hardware-control changes made for this device from the
// dashboard (only when the user unlocked live controls).
let seq = dev_ctrl.seq();
if controls.unlocked() && seq != last_ctrl_seq {
backend.apply_hw_controls(dev_ctrl.core_off(), dev_ctrl.mem_off(), dev_ctrl.power_w());
last_ctrl_seq = seq;
}
// Sample board power + temperature occasionally (cheap NVML calls, off
// the GPU path).
pass = pass.wrapping_add(1);
if pass % 16 == 0 {
if let Some(w) = backend.power_watts() {
stats.workers[id].power_mw.store((w * 1000.0) as u32, Ordering::Relaxed);
}
if let Some(t) = backend.temperature_c() {
stats.workers[id].temp_c.store(t, Ordering::Relaxed);
}
let (core_mhz, mem_mhz) = backend.current_clocks_mhz();
if let Some(c) = core_mhz {
stats.workers[id].core_clock_mhz.store(c, Ordering::Relaxed);
}
if let Some(m) = mem_mhz {
stats.workers[id].mem_clock_mhz.store(m, Ordering::Relaxed);
}
}
// Each pass explores a unique nonce drawn from the shared counter.
let counter = nonce_counter.fetch_add(1, Ordering::Relaxed);
let nonce = build_nonce(&current.nonce1, counter)?;
let header = build_header(&current, &nonce);
// Returns the results of the pass `depth` calls ago (current when depth 0).
let solutions = backend.enqueue(&header)?;
inflight.push_back(Pending {
header,
nonce,
nonce1_len: current.nonce1.len(),
job_id: current.job_id.clone(),
time_hex: current.time_hex.clone(),
target: current.target,
});
// Once the pipeline is primed, each enqueue completes the oldest pass.
if inflight.len() > depth {
let ctx = inflight.pop_front().unwrap();
process_results(id, &client, &ctx, &solutions, &stats);
}
}
drain_pipeline(id, &mut backend, &mut inflight, &client, &stats)?;
Ok(())
}
/// Supervise CPU mining: spawn one worker per group for the current group size,
/// and whenever the dashboard cycles the size, stop those workers (`gen_running`),
/// rebuild the grouping, and respawn. Runs until `running` is cleared.
fn cpu_mining_supervisor(
cpu_mining: Arc<CpuMining>,
clamp: Option<usize>,
client: Arc<StratumClient>,
running: Arc<AtomicBool>,
nonce_counter: Arc<AtomicU64>,
job_timeout: Option<Duration>,
) {
let mut size = cpu_mining.group_size();
let mut groups = cpu_mining.groups();
while running.load(Ordering::Relaxed) {
// Spawn this generation's group workers.
let gen_running = Arc::new(AtomicBool::new(true));
let mut handles = Vec::new();
for idx in 0..groups.len() {
let groups = groups.clone();
let client = client.clone();
let running = running.clone();
let gen_running = gen_running.clone();
let nonce_counter = nonce_counter.clone();
handles.push(std::thread::spawn(move || {
if let Err(e) = cpu_group_worker(idx, groups, clamp, client, running, gen_running, nonce_counter, job_timeout) {
warn!("cpu group {idx} stopped: {e}");
}
}));
}
// Run until the dashboard changes the group size (or we're shutting down).
while running.load(Ordering::Relaxed) && cpu_mining.group_size() == size {
std::thread::sleep(Duration::from_millis(150));
}
// Wind down this generation (each worker exits after its current solve).
gen_running.store(false, Ordering::Relaxed);
for h in handles {
let _ = h.join();
}
if !running.load(Ordering::Relaxed) {
break;
}
// Size changed: rebuild the grouping (preserving enabled cores) and loop.
size = cpu_mining.group_size();
groups = cpu_mining.rebuild();
info!("CPU mining regrouped to {size} core(s) per row ({} row(s))", groups.len());
}
}
/// Mining loop for one CPU core group. Idles while the group is disabled or while
/// `gen_running` is cleared (a regroup); otherwise runs a clamped CPU solve on
/// the group's own rayon pool (sized to its core count) for each shared nonce and
/// submits any winners. Synchronous (no pipeline), drawing from the same nonce
/// counter / pool client as the backend workers so it adds throughput without
/// duplicating work.
#[allow(clippy::too_many_arguments)]
fn cpu_group_worker(
idx: usize,
cpu_groups: Arc<CpuGroups>,
clamp: Option<usize>,
client: Arc<StratumClient>,
running: Arc<AtomicBool>,
gen_running: Arc<AtomicBool>,
nonce_counter: Arc<AtomicU64>,
job_timeout: Option<Duration>,
) -> Result<()> {
let group = cpu_groups.group(idx);
let cores: Vec<usize> = group.cores().to_vec();
let nthreads = cores.len();
// A dedicated pool so this group's solves use exactly its cores and stay
// independent of the global pool (and of the other groups). Each worker
// thread is pinned (CPU affinity) to one of the group's logical cores, so
// `--cpu-cores` actually controls *which* cores run.
let core_ids = core_affinity::get_core_ids().unwrap_or_default();
let pin = cores.clone();
let pool = rayon::ThreadPoolBuilder::new()
.num_threads(nthreads)
.thread_name(move |t| format!("cpu-g{idx}-{t}"))
.start_handler(move |t| {
if let Some(&core) = pin.get(t) {
if let Some(id) = core_ids.get(core) {
core_affinity::set_for_current(*id);
}
}
})
.build()
.map_err(|e| anyhow!("cpu group {idx}: failed to build thread pool: {e}"))?;
let work_handle = client.work();
// Wait for the first job (or shutdown / regroup).
let mut current = loop {
if !running.load(Ordering::Relaxed) || !gen_running.load(Ordering::Relaxed) {
return Ok(());
}
if let Some(w) = work_handle.get() {
break w;
}
std::thread::sleep(Duration::from_millis(200));
};
let mut last_job = Instant::now();
while running.load(Ordering::Relaxed) && gen_running.load(Ordering::Relaxed) {
if work_handle.epoch() != current.epoch {
if let Some(w) = work_handle.get() {
current = w;
}
last_job = Instant::now();
}
// Idle when disabled, or when work has gone stale (same guard the backend
// workers use). Sleep briefly so toggling/fresh work is picked up quickly.
let stale = job_timeout.map_or(false, |t| last_job.elapsed() >= t);
if !group.enabled() || stale {
std::thread::sleep(Duration::from_millis(150));
continue;
}
let counter = nonce_counter.fetch_add(1, Ordering::Relaxed);
let nonce = build_nonce(&current.nonce1, counter)?;
let header = build_header(&current, &nonce);
let solutions = pool.install(|| equihash::solve_with(&header, clamp));
let ctx = Pending {
header,
nonce,
nonce1_len: current.nonce1.len(),
job_id: current.job_id.clone(),
time_hex: current.time_hex.clone(),
target: current.target,
};
submit_solutions(
&group.label(),
&client,
&ctx,
&solutions,
group.solutions_atomic(),
group.shares_atomic(),
);
}
Ok(())
}
/// Flush every in-flight pass, checking/submitting its results against the job
/// it was built for. Used at shutdown and when pausing on stale work.
fn drain_pipeline(
id: usize,
backend: &mut Backend,
inflight: &mut std::collections::VecDeque<Pending>,
client: &StratumClient,
stats: &Stats,
) -> Result<()> {
while let Some(ctx) = inflight.pop_front() {
let solutions = backend.drain()?;
process_results(id, client, &ctx, &solutions, stats);
}
Ok(())
}
/// Check one pass's solutions against its share target and submit winners.
fn process_results(
id: usize,
client: &StratumClient,
ctx: &Pending,
solutions: &[Vec<u32>],
stats: &Stats,
) {
submit_solutions(
&stats.labels[id],
client,
ctx,
solutions,
&stats.workers[id].solutions,
&stats.workers[id].shares,
);
}
/// Count `solutions` toward `sol_counter`, then submit any that clear the share
/// target, bumping `share_counter` per accepted share. Shared by the GPU workers
/// (via [`process_results`]) and the CPU-group workers. `who` labels log lines.
fn submit_solutions(
who: &str,
client: &StratumClient,
ctx: &Pending,
solutions: &[Vec<u32>],
sol_counter: &AtomicU64,
share_counter: &AtomicU64,
) {
sol_counter.fetch_add(solutions.len() as u64, Ordering::Relaxed);
for sol in solutions {
let packed = equihash::indices_to_solution(sol);
let mut full = ctx.header.clone();
full.extend_from_slice(&encode_solution_field(&packed));
if meets_target(&full, &ctx.target) {
let nonce2 = &ctx.nonce[ctx.nonce1_len..];
match client.submit(who, &ctx.job_id, &ctx.time_hex, nonce2, &encode_solution_field(&packed)) {
Ok(()) => {
share_counter.fetch_add(1, Ordering::Relaxed);
}
Err(e) => warn!("{who}: submit failed: {e}"),
}
}
}
}
/// Build a 32-byte nonce: the pool's nonce1 prefix followed by a worker nonce2
/// tail whose first 8 bytes hold the little-endian counter.
fn build_nonce(nonce1: &[u8], counter: u64) -> Result<[u8; 32]> {
if nonce1.len() > 32 {
return Err(anyhow!("nonce1 is {} bytes, exceeds 32", nonce1.len()));
}
let mut nonce = [0u8; 32];
nonce[..nonce1.len()].copy_from_slice(nonce1);
let tail = &mut nonce[nonce1.len()..];
let n = tail.len().min(8);
tail[..n].copy_from_slice(&counter.to_le_bytes()[..n]);
Ok(nonce)
}
+98
View File
@@ -0,0 +1,98 @@
# `src/miniz/` — miniZ's Equihash 192,7 solver (the blob this miner replays)
This directory holds miniZ's reverse-engineered CUDA solver and the recorded
launch traces the CUDA backend (`src/cuda.rs`) replays. The `.fatbin` + `.log`
files are **used at build time** (`include_bytes!`/`include_str!`); the `sass/`,
`cubins/`, and `functions.*` files are a **reference dump** for understanding and
maintaining the replay — they are not compiled in.
## Contents
| path | role |
|---|---|
| `equihash192_7.fatbin` | **embedded** — miniZ's solver, **7 arches** (sm_50/60/70/75/80/86/120); loaded via `cuModuleLoadData` |
| `configs/*.log` | **embedded** — driver-boundary launch recordings, one per bucket geometry |
| `configs/{manifest.json,README.md}` | recording provenance |
| `cubins/equihash192_7.<n>.<arch>.cubin` | reference — the 7 cubins extracted from the fatbin |
| `sass/all_<arch>.sass` | reference — full SASS per arch (sm_75/80/86/120; sm_50/60/70 are cubin-only) |
| `functions.{mangled,demangled}.txt` | reference — kernel symbol index |
### Architecture coverage
The fatbin was rebuilt (`fatbinary --image3 …`) from miniZ v2.5e3's per-arch
cubins (`~/code/miniz-dump/solver_all/equihash_192_7/arches/`) to widen GPU
support. The sm_80/86/120 cubins are **byte-identical** to the original embedded
fatbin, so the recorded replay is unchanged on those; the rest are additive.
| arch | kernels in cubin | replay |
|---|---|---|
| sm_50, sm_60 | 128 | full (all bucket configs) |
| sm_70, sm_75 | 18 | **reduced** — only a config whose kernels are present will replay |
| sm_80, sm_86, sm_120 | 57 | full — what the recordings were captured against |
CUDA 13.3 can only disassemble sm_75/80/86/120 (Volta/Pascal/Maxwell are
deprecated in the toolkit), so `sass/` covers those four; sm_50/60/70 ship as
cubins only but still load at runtime on their GPUs.
Regenerate the reference files:
```sh
cd src/miniz
mkdir -p cubins sass
( cd cubins && cuobjdump ../equihash192_7.fatbin --extract-elf all )
for a in sm_75 sm_80 sm_86 sm_120; do cuobjdump -sass -arch $a equihash192_7.fatbin > sass/all_$a.sass; done
grep -h "Function :" sass/all_*.sass | sed 's/^[[:space:]]*Function :[[:space:]]*//' | sort -u > functions.mangled.txt
c++filt < functions.mangled.txt > functions.demangled.txt
# rebuild the multi-arch fatbin from the dump's per-arch cubins:
D=~/code/miniz-dump/solver_all/equihash_192_7/arches
fatbinary --create equihash192_7.fatbin -64 \
$(for a in 50 60 70 75 80 86 120; do echo --image3 kind=elf,sm=$a,file=$D/equihash_192_7.sm_$a.cubin; done)
```
## Algorithm & kernel pipeline
Equihash 192,7 (k=7): BLAKE2b expansion → Wagner shared-memory collision chaining
over 7 rounds → SHA-256 finalisation. The fatbin has **no PTX** (SASS only) and is
JIT-arch-selected by the driver at load.
`src/cuda.rs` replays one full pass in this fixed order (the 10 kernel families):
```
cleanup → digit_f → digit_1 → digit_2 → digit_3 → digit_4w → digit_5w → digit_6w
→ digit_l → sort_and_compress
```
| kernel | role | notes |
|---|---|---|
| `cleanup<64u>` | zero/reset table counters | regs≈6, no smem |
| `digit_f<…>` | BLAKE2b seed expansion → first table | **injection point** (see below) |
| `digit_1…digit_3` | early Wagner collide rounds | shared-mem `ATOMS.EXCH` chaining |
| `digit_4w/5w/6w` | wide later rounds (`w` = wide bucket) | |
| `digit_l<7u,…>` | last round → solution indices | writes the **counter + container** read back |
| `sort_and_compress` | canonicalise + SHA-256 | takes a 112-byte `SHA256_CTX` by value |
### Per-header injection (matches `cuda.rs::launch_pass`)
Only `digit_f` varies per header. The backend overwrites, in `digit_f`'s packed
arg buffer:
- `arg[0..64]` = the 64-byte BLAKE2b(192,7) midstate (`compress(header[0..128])`),
- `arg[96..100]` = header tail bytes `[136..140]`.
`digit_f`'s first two params are `ulonglong4, ulonglong4` (the 64-byte midstate),
so the first **64 bytes are by-value** and must not be pointer-rebased — this is
`cuda.rs::byval_prefix` (`digit_f` ⇒ 64, `sort_and_compress` ⇒ 112). Everything
else in every arg buffer is device pointers, rebased into our own arena at init.
### Bucket geometries (the 7 instantiations per digit)
Each `digit_*` ships **7 template instantiations** — one per bucket geometry
(table width × slots, e.g. `2048×16960`, `10000×…`, `12288×…`). They are the same
algorithm with different memory layout / occupancy constants. The repo bundles
**3** as recordings (`configs/`); `select_config` in `src/cuda.rs` picks the
highest-`table_capacity` one that fits free VRAM. The demangled signatures encode
each geometry — e.g. `digit_f<…,12288u,3392u,…>` vs `digit_f<…,2048u,16960u,…>`.
The solution readback is `digit_l` arg `[8..16]` = counter*, `[16..24]` = container*.
See `src/cuda.rs` for the full replay/rebase logic and
`../../pearl-dump/` for the same dump methodology applied to alpha-miner.
+65
View File
@@ -0,0 +1,65 @@
# miniZ Equihash 192,7 — per-config recordings (for multi-config integration)
`recording.log` (in the project root) is **unchanged** — it is the single
12288-bucket config. This folder holds one **canonical recording per distinct
solver config**, plus `manifest.json`, so a parent project can do miniZ-style
runtime config selection.
## Configs (3 reachable on sm_120; the fatbin has 7 total — the other 4 are
sm_80/sm_86 tunings, not selectable on Blackwell)
| config_id | buckets × slots | table capacity | headroom¹ | min VRAM² | recording |
|---|---|---|---|---|---|
| 11489098945649464158 | 2048 × 16960 | 34.7M | 1.035 | ~3.2 GB | config_2048x16960.log |
| 8970502565599698964 | 10000 × 4032 | 40.3M | 1.202 | ~3.5 GB | config_10000x32.log |
| 10872974046970623180 | 12288 × 3392 | 41.7M | 1.242 | ~4.5 GB | config_12288x32.log |
¹ capacity ÷ 2²⁵ entries; higher = fewer dropped collisions = higher solution yield.
² smallest reported-free VRAM that selected this config (from a cuMemGetInfo sweep).
**Selection rule (what miniZ does):** pick the config with the highest
`table_capacity` whose `min_vram` fits the GPU's free VRAM. Raw pipeline speed is
~identical across configs (~14 ms/pass); the choice is a memory↔yield tradeoff.
## Recording format (line-based, easy to parse)
```
[alloc] <size> bytes @ 0x<base> # every cuMemAlloc (device VA + size)
[REC] <mangled_kernel> g=gx,gy,gz b=bx,by,bz sh=<bytes> sz=<n> arg=<hex> # every cuLaunchKernel
```
One pipeline pass = the launches from the first `cleanup` through the next
`sort_and_compress` (10 kernels): `cleanup → digit_f → digit_1 → digit_2 →
digit_3 → digit_4w → digit_5w → digit_6w → digit_l → sort_and_compress`.
`arg` is the full packed kernel-argument buffer (passed by miniZ via
`cuLaunchKernel`'s `extra` / `CU_LAUNCH_PARAM_BUFFER_POINTER`).
## How to run a config (already implemented in `../src/replay.rs`)
1. Parse the recording (allocs + the 10-kernel pass).
2. Allocate a device buffer for **each alloc the pass references** (sum is small:
3.23.7 GB for the small configs; the 12288 config uses one ~16 GB arena but
only the low ~7 GB is touched).
3. For every launch, **rebase each 8-byte device pointer** in `arg` to its owning
buffer: `mine = my_base + (ptr orig_base)`. (Skip the by-value prefix:
64 B for `digit_f` = BLAKE2b midstate, 112 B for `sort_and_compress`.)
4. For kernels with `sh>0`, call
`cuFuncSetAttribute(MAX_DYNAMIC_SHARED_SIZE_BYTES, sh)` before launch.
5. Launch each kernel (same grid/block/shared) via `extra`/BUFFER_POINTER.
## Solving an arbitrary header (any config)
Inject into `digit_f`'s arg buffer:
- `arg[0..64]` = BLAKE2b midstate = `compress(header[0..128])`
(person = `"ZcashPoW" || LE32(192) || LE32(7)`, digest 48).
- `arg[96..100]` = `header[136..140]` (the 4 varying nonce tail bytes;
nonce[20..27] are constant 0 in miniZ's layout).
Then read 128 consecutive `u32` from `digit_l`'s container (3rd pointer arg) — that
is a canonical solution. Verify: `hash(i)=BLAKE2b(header‖LE32(i/2))[(i%2)*24..]`,
XOR of all 128 = 0 over 192 bits + all 7 Wagner levels. See `../src/{blake2b,verify}.rs`.
## manifest.json
Machine-readable: per config — `config_id`, `bucket_count`, `slots_per_bucket`,
`table_capacity`, `headroom`, `min_vram_gb`, `ref_buffers`, `ref_footprint_bytes`,
and `stages[]` (each: `kernel`, full mangled `name`, `grid`, `block`, `shmem`,
`argsize`). Load it to drive launches without re-parsing the `.log`.
+457
View File
@@ -0,0 +1,457 @@
[proxy] loaded (full load/link hooks)
[memcap] reporting free=3758096384
[alloc] 3758096384 bytes @ 0x7fcd40000000
[alloc] 3699355664 bytes @ 0x7fcb20000000
[alloc] 344064 bytes @ 0x7fcbfc800000
[alloc] 1572864 bytes @ 0x7fcbfc854000
[alloc] 32 bytes @ 0x7fcbfc9d4000
[alloc] 112 bytes @ 0x7fcbfc9d4200
[proxy] cuModuleLoadFatBinary
[proxy] DUMPED /tmp/cudaproxy/000_fatbin_5879504B.fatbin (5879504 bytes)
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[args via extra/BUFFER_POINTER]
argbuf: 00 00 80 fc cb 7f 00 00 00 54 00 00
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=8aa2b897c6b12772f1dc36758a6dedc23e4ddbb62358aab2f1794dfeaac92b8e1fc3ec2791bec2d1d6adb8c9c6e10707d8c8a3aa92b8f1fbc9e4364ce5ebb6210000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f000086418ca3
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[args via extra/BUFFER_POINTER]
blake2b_midstate0(32B): 8a a2 b8 97 c6 b1 27 72 f1 dc 36 75 8a 6d ed c2 3e 4d db b6 23 58 aa b2 f1 79 4d fe aa c9 2b 8e
blake2b_midstate1(32B): 1f c3 ec 27 91 be c2 d1 d6 ad b8 c9 c6 e1 07 07 d8 c8 a3 aa 92 b8 f1 fb c9 e4 36 4c e5 eb b6 21
bufptr0 = 0x7fcb32a00000
bufptr1 = 0x7fcb7f878000
bufptr2 = 0x7fcbb9352000
bufptr3 = 0x7fcbfc800000
trailing_uint = 2743878022 (argbuf_size=100)
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[args via extra/BUFFER_POINTER]
argbuf: 00 00 a0 32 cb 7f 00 00 00 c0 13 59 cb 7f 00 00 00 80 87 7f cb 7f 00 00 00 40 fb a5 cb 7f 00 00 00 20 35 b9 cb 7f 00 00 00 00 80 fc cb 7f 00 00 00 c0 80 fc cb 7f 00 00
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[args via extra/BUFFER_POINTER]
argbuf: 00 c0 13 59 cb 7f 00 00 00 00 a0 32 cb 7f 00 00 00 40 fb a5 cb 7f 00 00 00 20 35 b9 cb 7f 00 00 00 c0 80 fc cb 7f 00 00 00 80 81 fc cb 7f 00 00
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[args via extra/BUFFER_POINTER]
argbuf: 00 00 a0 32 cb 7f 00 00 00 c0 13 59 cb 7f 00 00 00 f0 47 cc cb 7f 00 00 00 80 81 fc cb 7f 00 00 00 40 82 fc cb 7f 00 00
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[args via extra/BUFFER_POINTER]
argbuf: 00 c0 13 59 cb 7f 00 00 00 00 a0 32 cb 7f 00 00 00 00 a0 32 cb 7f 00 00 00 40 82 fc cb 7f 00 00 00 00 83 fc cb 7f 00 00
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[args via extra/BUFFER_POINTER]
argbuf: 00 00 a0 32 cb 7f 00 00 00 b0 6f d5 cb 7f 00 00 00 b0 7f fc cb 7f 00 00 04 b0 7f fc cb 7f 00 00 00 00 83 fc cb 7f 00 00 00 c0 83 fc cb 7f 00 00
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[args via extra/BUFFER_POINTER]
argbuf: 00 b0 6f d5 cb 7f 00 00 00 00 00 20 cb 7f 00 00 00 c0 83 fc cb 7f 00 00 00 80 84 fc cb 7f 00 00
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[args via extra/BUFFER_POINTER]
ptr0 = 0x7fcb20000000
ptr1 = 0x7fcbfc848000
ptr2 = 0x7fcbfc854000
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e80033251e3e714e290bd2665a84c27cdf1494dbb0c000000000000000004000000000000f181fe591880b8d1c5c1fd50c016cfbfbb71c8c935c01beae1151f0cf424d476004085fccb7f0000000080100001000000000000c0ff3f0086418ca3
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[args via extra/BUFFER_POINTER]
argbuf: 00 00 00 00 00 00 00 00 00 00 00 00 e0 2a 1a 10 eb d9 65 b6 dd 68 89 88 4c 57 30 c3 35 c0 8b 07 a2 0a eb 0f 99 b8 1e 6a 97 a4 0f 1e 80 03 32 51 e3 e7 14 e2 90 bd 26 65 a8 4c 27 cd f1 49 4d bb 0c 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f0000029684b9
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f00029684b9
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00009c6f862e
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f009c6f862e
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f0000d5787112
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f00d5787112
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00004ca4eb92
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f004ca4eb92
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f0000213e5b67
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f00213e5b67
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f0000dfd809aa
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f00dfd809aa
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f0000a95fc39d
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f00a95fc39d
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00001a13fb38
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f001a13fb38
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f000026ac1daf
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f0026ac1daf
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00009c5f423b
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f009c5f423b
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00008162dbcf
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f008162dbcf
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00006802e39e
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f006802e39e
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f00009a7e57d0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f009a7e57d0
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f000090e1c770
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f0090e1c770
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000080fccb7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=26ae54e2be5f8051caf311d0d66d64d1cab0f3c21c312c407576d3c6d33b552d188dd226676871438eba598c892d0a67157a346d0aae012b3f0c4f9f30bd3e160000a032cb7f00000080877fcb7f0000002035b9cb7f0000000080fccb7f0000a19d9217
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=10000,1,1 b=1024,1,1 sh=56432 sz=56 arg=0000a032cb7f000000c01359cb7f00000080877fcb7f00000040fba5cb7f0000002035b9cb7f0000000080fccb7f000000c080fccb7f0000
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=10000,1,1 b=1024,1,1 sh=56336 sz=48 arg=00c01359cb7f00000000a032cb7f00000040fba5cb7f0000002035b9cb7f000000c080fccb7f0000008081fccb7f0000
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[REC] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_ g=10000,1,1 b=1024,1,1 sh=56432 sz=40 arg=0000a032cb7f000000c01359cb7f000000f047cccb7f0000008081fccb7f0000004082fccb7f0000
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[REC] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=10000,1,1 b=1024,1,1 sh=29380 sz=40 arg=00c01359cb7f00000000a032cb7f00000000a032cb7f0000004082fccb7f0000000083fccb7f0000
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[REC] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=10000,1,1 b=1024,1,1 sh=28216 sz=48 arg=0000a032cb7f000000b06fd5cb7f000000b07ffccb7f000004b07ffccb7f0000000083fccb7f000000c083fccb7f0000
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[REC] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_ g=10000,1,1 b=1024,1,1 sh=101360 sz=32 arg=00b06fd5cb7f000000000020cb7f000000c083fccb7f0000008084fccb7f0000
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=8192,1,1 b=1024,1,1 sh=101376 sz=24 arg=00000020cb7f0000008084fccb7f0000004085fccb7f0000
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f99b81e6a97a40f1e8003325165768b945e328ba70b2d2bacb09795930c000000000000000004000000000000e3031c0fd60fcbce9e30e94662cb38a7d53cf337aa2dce3b108b7a88ebafb6b7004085fccb7f0000000080100001000000000000c0ff3f00a19d9217
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj1 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj1 grid=10000,1,1 block=1024,1,1 shmem=56336
[launch] _Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11 grid=10000,1,1 block=1024,1,1 shmem=56432
[launch] _Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=29380
[launch] _Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj grid=10000,1,1 block=1024,1,1 shmem=28216
[launch] _Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj1 grid=10000,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554 grid=8192,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[alloc] 3489296400 bytes @ 0x7fcb20000000
[alloc] 344064 bytes @ 0x7fcbfce00000
[alloc] 1572864 bytes @ 0x7fcbfce54000
[alloc] 32 bytes @ 0x7fcbfcfd4000
[alloc] 112 bytes @ 0x7fcbfcfd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3231658000 bytes @ 0x7fcb20000000
[alloc] 344064 bytes @ 0x7fcbfce00000
[alloc] 1572864 bytes @ 0x7fcbfce54000
[alloc] 32 bytes @ 0x7fcbfcfd4000
[alloc] 112 bytes @ 0x7fcbfcfd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3527709328 bytes @ 0x7fcb20000000
[alloc] 344064 bytes @ 0x7fcbfce00000
[alloc] 1572864 bytes @ 0x7fcbfce54000
[alloc] 32 bytes @ 0x7fcbfcfd4000
[alloc] 112 bytes @ 0x7fcbfcfd4200
[proxy] cuModuleLoadFatBinary
+538
View File
@@ -0,0 +1,538 @@
[proxy] loaded (full load/link hooks)
[alloc] 16397631488 bytes @ 0x7eff60000000
[alloc] 2863726592 bytes @ 0x7f0280000000
[proxy] loaded (full load/link hooks)
[alloc] 16397631488 bytes @ 0x7f0da0000000
[alloc] 16367616000 bytes @ 0x7f0da0000000
[alloc] 3808690192 bytes @ 0x7f0e40000000
[alloc] 3808690192 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0e23200000
[alloc] 1572864 bytes @ 0x7f0e23254000
[alloc] 32 bytes @ 0x7f0e233d4000
[alloc] 112 bytes @ 0x7f0e233d4200
[alloc] 344064 bytes @ 0x7f0e23400000
[alloc] 1572864 bytes @ 0x7f0e23454000
[alloc] 32 bytes @ 0x7f0e235d4000
[alloc] 112 bytes @ 0x7f0e235d4200
[proxy] cuModuleLoadFatBinary
[proxy] DUMPED /tmp/cudaproxy/000_fatbin_5879504B.fatbin (5879504 bytes)
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000040230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[args via extra/BUFFER_POINTER]
argbuf: 00 00 40 23 0e 7f 00 00 00 54 00 00
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=715826e04720637f4a74704ff1176c126b8cb84fbc2823bcca518dc535d46979f3cdc9c207d1b876cd1d5078f8d8068568bf7b8d86c4c99d976a73504993f96f0000b0530e7f0000000030a30e7f00000000d0de0e7f0000000040230e7f0000b6f4ee9e
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[args via extra/BUFFER_POINTER]
blake2b_midstate0(32B): 71 58 26 e0 47 20 63 7f 4a 74 70 4f f1 17 6c 12 6b 8c b8 4f bc 28 23 bc ca 51 8d c5 35 d4 69 79
blake2b_midstate1(32B): f3 cd c9 c2 07 d1 b8 76 cd 1d 50 78 f8 d8 06 85 68 bf 7b 8d 86 c4 c9 9d 97 6a 73 50 49 93 f9 6f
bufptr0 = 0x7f0e53b00000
bufptr1 = 0x7f0ea3300000
bufptr2 = 0x7f0eded00000
bufptr3 = 0x7f0e23400000
trailing_uint = 2666460342 (argbuf_size=100)
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530e7f00000000707b0e7f0000000030a30e7f00000000f0ca0e7f00000000d0de0e7f0000000040230e7f000000c040230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[args via extra/BUFFER_POINTER]
argbuf: 00 00 b0 53 0e 7f 00 00 00 00 70 7b 0e 7f 00 00 00 00 30 a3 0e 7f 00 00 00 00 f0 ca 0e 7f 00 00 00 00 d0 de 0e 7f 00 00 00 00 40 23 0e 7f 00 00 00 c0 40 23 0e 7f 00 00
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0e7f00000000b0530e7f00000000f0ca0e7f00000000d0de0e7f000000c040230e7f0000008041230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[args via extra/BUFFER_POINTER]
argbuf: 00 00 70 7b 0e 7f 00 00 00 00 b0 53 0e 7f 00 00 00 00 f0 ca 0e 7f 00 00 00 00 d0 de 0e 7f 00 00 00 c0 40 23 0e 7f 00 00 00 80 41 23 0e 7f 00 00
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530e7f00000000707b0e7f0000000070f10e7f0000008041230e7f0000004042230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[args via extra/BUFFER_POINTER]
argbuf: 00 00 b0 53 0e 7f 00 00 00 00 70 7b 0e 7f 00 00 00 00 70 f1 0e 7f 00 00 00 80 41 23 0e 7f 00 00 00 40 42 23 0e 7f 00 00
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0e7f00000000b0530e7f00000000b0530e7f0000004042230e7f0000000043230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[args via extra/BUFFER_POINTER]
argbuf: 00 00 70 7b 0e 7f 00 00 00 00 b0 53 0e 7f 00 00 00 00 b0 53 0e 7f 00 00 00 40 42 23 0e 7f 00 00 00 00 43 23 0e 7f 00 00
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530e7f0000000084fa0e7f0000000004230f7f0000040004230f7f0000000043230e7f000000c043230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[args via extra/BUFFER_POINTER]
argbuf: 00 00 b0 53 0e 7f 00 00 00 00 84 fa 0e 7f 00 00 00 00 04 23 0f 7f 00 00 04 00 04 23 0f 7f 00 00 00 00 43 23 0e 7f 00 00 00 c0 43 23 0e 7f 00 00
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0e7f0000000000400e7f000000c043230e7f0000008044230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[args via extra/BUFFER_POINTER]
argbuf: 00 00 84 fa 0e 7f 00 00 00 00 00 40 0e 7f 00 00 00 c0 43 23 0e 7f 00 00 00 80 44 23 0e 7f 00 00
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400e7f0000008044230e7f0000004045230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[args via extra/BUFFER_POINTER]
ptr0 = 0x7f0e40000000
ptr1 = 0x7f0e23448000
ptr2 = 0x7f0e23454000
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9092e435ae8cedea286eb064ced23de22e0c000000000000000004000000000000e37630ebd5ab9fab2fed954d74171cbf73073f84fe74521b362b10a917c1a2cd004045230e7f00000000604c0f7f000000000000c0ff3f00b6f4ee9e
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[args via extra/BUFFER_POINTER]
argbuf: 00 00 00 00 00 00 00 00 00 00 00 00 72 7f 67 1e 61 7f e9 f3 cd 7f de 79 53 b0 d6 a5 06 5f 22 00 63 18 ae 2f 32 98 1e 6a 37 cb 22 1e 80 03 2e 90 92 e4 35 ae 8c ed ea 28 6e b0 64 ce d2 3d e2 2e 0c 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00
[proxy] cuModuleLoadFatBinary
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=aecab9b956e3b5f6aa06e6d93578879146190e12cda73bd1ca8ce9b9be604ad6db8ea23366a1f394de52dadaefa0b6fc47e7eabe1c2d1da2fca22e09851d51f20000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000745afc3f
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9014f555e8c955a35a8fc445a0a1346e330c0000000000000000040000000000004474fbe5d5ebedfedbba477a942366a217c89f7b3df1d4f0029203d2a82b0db6004025230e7f0000000020230f7f000000000000c0ff3f00745afc3f
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f000018f99780
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f0018f99780
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000a9397cb0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00a9397cb0
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f000015db5cb1
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f0015db5cb1
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000f25ca665
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00f25ca665
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000a3c39ea9
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00a3c39ea9
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f00007f9e9300
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f007f9e9300
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000d0912aea
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00d0912aea
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000980ba47c
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00980ba47c
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f00008d204ecf
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f008d204ecf
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f00003138b733
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f003138b733
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000edca00d5
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00edca00d5
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000b426057a
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00b426057a
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000078239e2
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00078239e2
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=000020230e7f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=75657b353ba4d4b91fca5ff0f7114c7d443d7e794ec46a5bafc2f9fd06f3dec60a14523394959c41c7fb2268780ae0dd53f444469fb038488d4c84b5b283dc8e0000b0530d7f0000000030a30d7f00000000d0de0d7f0000000020230e7f0000243d0473
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_ g=12288,1,1 b=1024,1,1 sh=46336 sz=56 arg=0000b0530d7f00000000707b0d7f0000000030a30d7f00000000f0ca0d7f00000000d0de0d7f0000000020230e7f000000c020230e7f0000
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[REC] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_ g=12288,1,1 b=1024,1,1 sh=46240 sz=48 arg=0000707b0d7f00000000b0530d7f00000000f0ca0d7f00000000d0de0d7f000000c020230e7f0000008021230e7f0000
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[REC] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_ g=8192,1,1 b=1024,1,1 sh=68352 sz=40 arg=0000b0530d7f00000000707b0d7f0000000070f10d7f0000008021230e7f0000004022230e7f0000
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[REC] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_ g=8192,1,1 b=1024,1,1 sh=35588 sz=40 arg=0000707b0d7f00000000b0530d7f00000000b0530d7f0000004022230e7f0000000023230e7f0000
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[REC] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_ g=8192,1,1 b=1024,1,1 sh=34176 sz=48 arg=0000b0530d7f0000000084fa0d7f0000000004230e7f0000040004230e7f0000000023230e7f000000c023230e7f0000
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[REC] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_ g=12288,1,1 b=1024,1,1 sh=101360 sz=32 arg=000084fa0d7f0000000000400d7f000000c023230e7f0000008024230e7f0000
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[REC] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=12288,1,1 b=1024,1,1 sh=101376 sz=24 arg=000000400d7f0000008024230e7f0000004025230e7f0000
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000727f671e617fe9f3cd7fde7953b0d6a5065f22006318ae2f32981e6a37cb221e80032e9018a3e1a590cbcdff7c31cd4e6eaf7c820c000000000000000004000000000000edd9fdffded84d7dd9eb8baae61b4545cd2d7f63e455480301f6170459b8ebdf004025230e7f0000000020230f7f000000000000c0ff3f00243d0473
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5 grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj grid=12288,1,1 block=1024,1,1 shmem=46336
[launch] _Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj1 grid=12288,1,1 block=1024,1,1 shmem=46240
[launch] _Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11 grid=8192,1,1 block=1024,1,1 shmem=68352
[launch] _Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj grid=8192,1,1 block=1024,1,1 shmem=35588
[launch] _Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272EL grid=8192,1,1 block=1024,1,1 shmem=34176
[launch] _Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896EL grid=12288,1,1 block=1024,1,1 shmem=101360
[launch] _Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554 grid=12288,1,1 block=1024,1,1 shmem=101376
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[alloc] 3699355664 bytes @ 0x7f0e40000000
[alloc] 344064 bytes @ 0x7f0e23a00000
[alloc] 1572864 bytes @ 0x7f0e23a54000
[alloc] 32 bytes @ 0x7f0e23bd4000
[alloc] 112 bytes @ 0x7f0e23bd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3699355664 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0e1c800000
[alloc] 1572864 bytes @ 0x7f0e1c854000
[alloc] 32 bytes @ 0x7f0e1c9d4000
[alloc] 112 bytes @ 0x7f0e1c9d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3489296400 bytes @ 0x7f0e60000000
[alloc] 344064 bytes @ 0x7f0f30000000
[alloc] 1572864 bytes @ 0x7f0f30054000
[alloc] 32 bytes @ 0x7f0f301d4000
[alloc] 112 bytes @ 0x7f0f301d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3489296400 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0f30400000
[alloc] 1572864 bytes @ 0x7f0f30454000
[alloc] 32 bytes @ 0x7f0f305d4000
[alloc] 112 bytes @ 0x7f0f305d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3231658000 bytes @ 0x7f0e60000000
[alloc] 344064 bytes @ 0x7f0f20a00000
[alloc] 1572864 bytes @ 0x7f0f20a54000
[alloc] 32 bytes @ 0x7f0f20bd4000
[alloc] 112 bytes @ 0x7f0f20bd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3231658000 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0f30a00000
[alloc] 1572864 bytes @ 0x7f0f30a54000
[alloc] 32 bytes @ 0x7f0f30bd4000
[alloc] 112 bytes @ 0x7f0f30bd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3527709328 bytes @ 0x7f0c40000000
[alloc] 344064 bytes @ 0x7f0d12600000
[alloc] 1572864 bytes @ 0x7f0d12654000
[alloc] 32 bytes @ 0x7f0d127d4000
[alloc] 112 bytes @ 0x7f0d127d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3527709328 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0d12c00000
[alloc] 1572864 bytes @ 0x7f0d12c54000
[alloc] 32 bytes @ 0x7f0d12dd4000
[alloc] 112 bytes @ 0x7f0d12dd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3587478160 bytes @ 0x7f0e60000000
[alloc] 344064 bytes @ 0x7f0f35e00000
[alloc] 1572864 bytes @ 0x7f0f35e54000
[alloc] 32 bytes @ 0x7f0f35fd4000
[alloc] 112 bytes @ 0x7f0f35fd4200
[proxy] cuModuleLoadFatBinary
[alloc] 3587478160 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0f36200000
[alloc] 1572864 bytes @ 0x7f0f36254000
[alloc] 32 bytes @ 0x7f0f363d4000
[alloc] 112 bytes @ 0x7f0f363d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3507122192 bytes @ 0x7f0e60000000
[alloc] 344064 bytes @ 0x7f0f31200000
[alloc] 1572864 bytes @ 0x7f0f31254000
[alloc] 32 bytes @ 0x7f0f313d4000
[alloc] 112 bytes @ 0x7f0f313d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3507122192 bytes @ 0x7f0c40000000
[alloc] 344064 bytes @ 0x7f0f31600000
[alloc] 1572864 bytes @ 0x7f0f31654000
[alloc] 32 bytes @ 0x7f0f317d4000
[alloc] 112 bytes @ 0x7f0f317d4200
[proxy] cuModuleLoadFatBinary
[alloc] 3808690192 bytes @ 0x7f0d40000000
[alloc] 344064 bytes @ 0x7f0c23200000
[alloc] 1572864 bytes @ 0x7f0c23254000
[alloc] 32 bytes @ 0x7f0c233d4000
[alloc] 112 bytes @ 0x7f0c233d4200
[alloc] 3808690192 bytes @ 0x7f0b40000000
[alloc] 344064 bytes @ 0x7f0c23400000
[alloc] 1572864 bytes @ 0x7f0c23454000
[alloc] 32 bytes @ 0x7f0c235d4000
[alloc] 112 bytes @ 0x7f0c235d4200
[proxy] cuModuleLoadFatBinary
[proxy] cuModuleLoadFatBinary
[alloc] 3507122192 bytes @ 0x7f0b40000000
[alloc] 344064 bytes @ 0x7f0c11200000
[alloc] 1572864 bytes @ 0x7f0c11254000
[alloc] 32 bytes @ 0x7f0c113d4000
[alloc] 112 bytes @ 0x7f0c113d4200
[proxy] cuModuleLoadFatBinary
+439
View File
@@ -0,0 +1,439 @@
[proxy] loaded (full load/link hooks)
[memcap] reporting free=3435973837
[alloc] 3435973837 bytes @ 0x7f2a00000000
[alloc] 3231658000 bytes @ 0x7f27e0000000
[alloc] 344064 bytes @ 0x7f28a0a00000
[alloc] 1572864 bytes @ 0x7f28a0a54000
[alloc] 32 bytes @ 0x7f28a0bd4000
[alloc] 112 bytes @ 0x7f28a0bd4200
[proxy] cuModuleLoadFatBinary
[proxy] DUMPED /tmp/cudaproxy/000_fatbin_5879504B.fatbin (5879504 bytes)
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[args via extra/BUFFER_POINTER]
argbuf: 00 00 a0 a0 28 7f 00 00 00 54 00 00
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=0169ed05c580827fd4376c1e69dfcc4156320219ef56ef22e6d711de77291f093cd30da070e23e3ca5f40969f8aea215df93bb1e819876db271acc0d33841053000090f0277f000000201434287f00000030c665287f00000000a0a0287f000027f706ef
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[args via extra/BUFFER_POINTER]
blake2b_midstate0(32B): 01 69 ed 05 c5 80 82 7f d4 37 6c 1e 69 df cc 41 56 32 02 19 ef 56 ef 22 e6 d7 11 de 77 29 1f 09
blake2b_midstate1(32B): 3c d3 0d a0 70 e2 3e 3c a5 f4 09 69 f8 ae a2 15 df 93 bb 1e 81 98 76 db 27 1a cc 0d 33 84 10 53
bufptr0 = 0x7f27f0900000
bufptr1 = 0x7f2834142000
bufptr2 = 0x7f2865c63000
bufptr3 = 0x7f28a0a00000
trailing_uint = 4010211111 (argbuf_size=100)
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[args via extra/BUFFER_POINTER]
argbuf: 00 00 90 f0 27 7f 00 00 00 00 f0 12 28 7f 00 00 00 20 14 34 28 7f 00 00 00 20 34 55 28 7f 00 00 00 30 c6 65 28 7f 00 00 00 00 a0 a0 28 7f 00 00 00 c0 a0 a0 28 7f 00 00
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[args via extra/BUFFER_POINTER]
argbuf: 00 00 f0 12 28 7f 00 00 00 00 90 f0 27 7f 00 00 00 20 34 55 28 7f 00 00 00 30 c6 65 28 7f 00 00 00 c0 a0 a0 28 7f 00 00 00 80 a1 a0 28 7f 00 00
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[args via extra/BUFFER_POINTER]
argbuf: 00 00 90 f0 27 7f 00 00 00 00 f0 12 28 7f 00 00 00 30 56 76 28 7f 00 00 00 80 a1 a0 28 7f 00 00 00 40 a2 a0 28 7f 00 00
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[args via extra/BUFFER_POINTER]
argbuf: 00 00 f0 12 28 7f 00 00 00 00 90 f0 27 7f 00 00 00 00 90 f0 27 7f 00 00 00 40 a2 a0 28 7f 00 00 00 00 a3 a0 28 7f 00 00
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[args via extra/BUFFER_POINTER]
argbuf: 00 00 90 f0 27 7f 00 00 00 30 7f 7f 28 7f 00 00 00 30 9f a0 28 7f 00 00 04 30 9f a0 28 7f 00 00 00 00 a3 a0 28 7f 00 00 00 c0 a3 a0 28 7f 00 00
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[args via extra/BUFFER_POINTER]
argbuf: 00 30 7f 7f 28 7f 00 00 00 00 00 e0 27 7f 00 00 00 c0 a3 a0 28 7f 00 00 00 80 a4 a0 28 7f 00 00
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[args via extra/BUFFER_POINTER]
ptr0 = 0x7f27e0000000
ptr1 = 0x7f28a0a48000
ptr2 = 0x7f28a0a54000
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc789dce4275391a7dccbb293de98133970c000000000000000004000000000000027156f52429b81b2fd33f64ec19d5c85a9e705c1b2bac35d8a99b7e8c78c76e0040a5a0287f0000000080100001000000000000c0ff3f0027f706ef
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[args via extra/BUFFER_POINTER]
argbuf: 00 00 00 00 00 00 00 00 00 00 00 00 e0 2a 1a 10 eb d9 65 b6 dd 68 89 88 4c 57 30 c3 35 c0 8b 07 a2 0a eb 0f 44 ba 1e 6a 83 33 10 1e 80 03 30 cc 78 9d ce 42 75 39 1a 7d cc bb 29 3d e9 81 33 97 0c 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f0000960c09e6
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f00960c09e6
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f0000c095f61d
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f00c095f61d
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f00004d92e38d
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f004d92e38d
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f00004911bc70
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f004911bc70
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f0000247e2c9e
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f00247e2c9e
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f0000e3935dc4
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f00e3935dc4
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f000001149d3c
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f0001149d3c
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f000012b20605
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f0012b20605
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f00001602b132
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f001602b132
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f0000795648ad
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f00795648ad
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f0000522436b5
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f00522436b5
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f00005d3f54bb
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f005d3f54bb
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f000060ce5161
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f0060ce5161
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f000079a87e67
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f0079a87e67
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[REC] _Z7cleanupILj64EEvPvj g=336,1,1 b=64,1,1 sh=0 sz=12 arg=0000a0a0287f000000540000
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[REC] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj g=65536,1,1 b=256,1,1 sh=0 sz=100 arg=3c460e54a5660cd9c586bc91d8aa1c58570b32c15ed8351246033f33334973d743d6927945d1db569063a85bfbbd817776a94a831a524eb0fbb44f050e5b5058000090f0277f000000201434287f00000030c665287f00000000a0a0287f00009b11bd6c
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[REC] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_ g=10240,1,1 b=576,1,1 sh=57432 sz=56 arg=000090f0277f00000000f012287f000000201434287f000000203455287f00000030c665287f00000000a0a0287f000000c0a0a0287f0000
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[REC] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_ g=10896,1,1 b=640,1,1 sh=51872 sz=48 arg=0000f012287f0000000090f0277f000000203455287f00000030c665287f000000c0a0a0287f00000080a1a0287f0000
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[REC] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_ g=10240,1,1 b=704,1,1 sh=55152 sz=40 arg=000090f0277f00000000f012287f000000305676287f00000080a1a0287f00000040a2a0287f0000
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[REC] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_ g=6144,1,1 b=1024,1,1 sh=47052 sz=40 arg=0000f012287f0000000090f0277f0000000090f0277f00000040a2a0287f00000000a3a0287f0000
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[REC] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_ g=6400,1,1 b=1024,1,1 sh=43424 sz=48 arg=000090f0277f000000307f7f287f000000309fa0287f000004309fa0287f00000000a3a0287f000000c0a3a0287f0000
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[REC] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_ g=4096,1,1 b=1024,1,1 sh=65520 sz=32 arg=00307f7f287f0000000000e0277f000000c0a3a0287f00000080a4a0287f0000
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[REC] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192 g=4096,1,1 b=1024,1,1 sh=65536 sz=24 arg=000000e0277f00000080a4a0287f00000040a5a0287f0000
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[REC] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj g=5,1,1 b=32,2,1 sh=0 sz=140 arg=000000000000000000000000e02a1a10ebd965b6dd6889884c5730c335c08b07a20aeb0f44ba1e6a8333101e800330cc51755272a552df57219bb00453ebc4cb0c0000000000000000040000000000009c51ce237a32339d2f0c4ef69b5e9fe156fdfe53848e29dbbdbc79c8463c0c2e0040a5a0287f0000000080100001000000000000c0ff3f009b11bd6c
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
[launch] _Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uin grid=65536,1,1 block=256,1,1 shmem=0
[launch] _Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj1 grid=10240,1,1 block=576,1,1 shmem=57432
[launch] _Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj1 grid=10896,1,1 block=640,1,1 shmem=51872
[launch] _Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13 grid=10240,1,1 block=704,1,1 shmem=55152
[launch] _Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj grid=6144,1,1 block=1024,1,1 shmem=47052
[launch] _Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj grid=6400,1,1 block=1024,1,1 shmem=43424
[launch] _Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj grid=4096,1,1 block=1024,1,1 shmem=65520
[launch] _Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285 grid=4096,1,1 block=1024,1,1 shmem=65536
[launch] _Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj grid=5,1,1 block=32,2,1 shmem=0
[launch] _Z7cleanupILj64EEvPvj grid=336,1,1 block=64,1,1 shmem=0
+528
View File
@@ -0,0 +1,528 @@
{
"algo": "equihash_192_7",
"note": "miniZ kernels; pick highest table_capacity whose min_vram fits free VRAM",
"configs": [
{
"config_id": "11489098945649464158",
"recording": "configs/config_2048x16960.log",
"bucket_count": 2048,
"slots_per_bucket": 16960,
"table_capacity": 34734080,
"entries_needed": 33554432,
"headroom": 1.035,
"min_vram_gb": 3.2,
"ref_buffers": 3,
"ref_footprint_bytes": 3233574928,
"stages": [
{
"kernel": "cleanup",
"name": "_Z7cleanupILj64EEvPvj",
"grid": [
336,
1,
1
],
"block": [
64,
1,
1
],
"shmem": 0,
"argsize": 12
},
{
"kernel": "digit_f",
"name": "_Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj",
"grid": [
65536,
1,
1
],
"block": [
256,
1,
1
],
"shmem": 0,
"argsize": 100
},
{
"kernel": "digit_1",
"name": "_Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_",
"grid": [
10240,
1,
1
],
"block": [
576,
1,
1
],
"shmem": 57432,
"argsize": 56
},
{
"kernel": "digit_2",
"name": "_Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_",
"grid": [
10896,
1,
1
],
"block": [
640,
1,
1
],
"shmem": 51872,
"argsize": 48
},
{
"kernel": "digit_3",
"name": "_Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_",
"grid": [
10240,
1,
1
],
"block": [
704,
1,
1
],
"shmem": 55152,
"argsize": 40
},
{
"kernel": "digit_4w",
"name": "_Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_",
"grid": [
6144,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 47052,
"argsize": 40
},
{
"kernel": "digit_5w",
"name": "_Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_",
"grid": [
6400,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 43424,
"argsize": 48
},
{
"kernel": "digit_6w",
"name": "_Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_",
"grid": [
4096,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 65520,
"argsize": 32
},
{
"kernel": "digit_l",
"name": "_Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192",
"grid": [
4096,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 65536,
"argsize": 24
},
{
"kernel": "sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj",
"name": "_Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj",
"grid": [
5,
1,
1
],
"block": [
32,
2,
1
],
"shmem": 0,
"argsize": 140
}
]
},
{
"config_id": "8970502565599698964",
"recording": "configs/config_10000x32.log",
"bucket_count": 10000,
"slots_per_bucket": 4032,
"table_capacity": 40320000,
"entries_needed": 33554432,
"headroom": 1.202,
"min_vram_gb": 3.5,
"ref_buffers": 3,
"ref_footprint_bytes": 3701272592,
"stages": [
{
"kernel": "cleanup",
"name": "_Z7cleanupILj64EEvPvj",
"grid": [
336,
1,
1
],
"block": [
64,
1,
1
],
"shmem": 0,
"argsize": 12
},
{
"kernel": "digit_f",
"name": "_Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj",
"grid": [
65536,
1,
1
],
"block": [
256,
1,
1
],
"shmem": 0,
"argsize": 100
},
{
"kernel": "digit_1",
"name": "_Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_",
"grid": [
10000,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 56432,
"argsize": 56
},
{
"kernel": "digit_2",
"name": "_Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_",
"grid": [
10000,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 56336,
"argsize": 48
},
{
"kernel": "digit_3",
"name": "_Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_",
"grid": [
10000,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 56432,
"argsize": 40
},
{
"kernel": "digit_4w",
"name": "_Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_",
"grid": [
10000,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 29380,
"argsize": 40
},
{
"kernel": "digit_5w",
"name": "_Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_",
"grid": [
10000,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 28216,
"argsize": 48
},
{
"kernel": "digit_6w",
"name": "_Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_",
"grid": [
10000,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 101360,
"argsize": 32
},
{
"kernel": "digit_l",
"name": "_Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192",
"grid": [
8192,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 101376,
"argsize": 24
},
{
"kernel": "sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj",
"name": "_Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj",
"grid": [
5,
1,
1
],
"block": [
32,
2,
1
],
"shmem": 0,
"argsize": 140
}
]
},
{
"config_id": "10872974046970623180",
"recording": "configs/config_12288x32.log",
"bucket_count": 12288,
"slots_per_bucket": 3392,
"table_capacity": 41680896,
"entries_needed": 33554432,
"headroom": 1.242,
"min_vram_gb": 4.5,
"ref_buffers": 1,
"ref_footprint_bytes": 16397631488,
"stages": [
{
"kernel": "cleanup",
"name": "_Z7cleanupILj64EEvPvj",
"grid": [
336,
1,
1
],
"block": [
64,
1,
1
],
"shmem": 0,
"argsize": 12
},
{
"kernel": "digit_f",
"name": "_Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj",
"grid": [
65536,
1,
1
],
"block": [
256,
1,
1
],
"shmem": 0,
"argsize": 100
},
{
"kernel": "digit_1",
"name": "_Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_",
"grid": [
12288,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 46336,
"argsize": 56
},
{
"kernel": "digit_2",
"name": "_Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_",
"grid": [
12288,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 46240,
"argsize": 48
},
{
"kernel": "digit_3",
"name": "_Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_",
"grid": [
8192,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 68352,
"argsize": 40
},
{
"kernel": "digit_4w",
"name": "_Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_",
"grid": [
8192,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 35588,
"argsize": 40
},
{
"kernel": "digit_5w",
"name": "_Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_",
"grid": [
8192,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 34176,
"argsize": 48
},
{
"kernel": "digit_6w",
"name": "_Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_",
"grid": [
12288,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 101360,
"argsize": 32
},
{
"kernel": "digit_l",
"name": "_Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192",
"grid": [
12288,
1,
1
],
"block": [
1024,
1,
1
],
"shmem": 101376,
"argsize": 24
},
{
"kernel": "sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj",
"name": "_Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj",
"grid": [
5,
1,
1
],
"block": [
32,
2,
1
],
"shmem": 0,
"argsize": 140
}
]
}
]
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+57
View File
@@ -0,0 +1,57 @@
sort_and_compress(SHA256_CTX, ScontainerReal192*, Compress192*, unsigned long, unsigned int)
void cleanup<64u>(void*, unsigned int)
void digit_1<1u, 10872974046970623180ul, 2u, 3136u, 3136u, 1u, 2u, 1u, 12288u, 12u, 2896u, 11u, 1368u, 11u, 3392u, 3392u, 800u, 1024u, packer_flex<1u, 3392u, 14u>, 5524670120038ul, 6u, 262657u, uint4 [106][12288][32], uint4 [53][12288][64], uint4 [106][12288][32], unsigned long [53][12288][64], unsigned char [53][12288][64]>(uint4 (*) [106][12288][32], uint4 (*) [53][12288][64], uint4 (*) [106][12288][32], unsigned long (*) [53][12288][64], unsigned char (*) [53][12288][64], unsigned int*, unsigned int*)
void digit_1<1u, 11425559665866073792ul, 2u, 4560u, 4560u, 1u, 2u, 1u, 6912u, 12u, 4209u, 11u, 2020u, 12u, 4704u, 5568u, 800u, 1024u, packer_flex<1u, 4704u, 14u>, 5524670120032ul, 6u, 262657u, uint4 [147][8320][32], uint4 [87][6912][64], uint4 [147][8320][32], unsigned long [87][6912][64], unsigned char [1][8320][4704]>(uint4 (*) [147][8320][32], uint4 (*) [87][6912][64], uint4 (*) [147][8320][32], unsigned long (*) [87][6912][64], unsigned char (*) [1][8320][4704], unsigned int*, unsigned int*)
void digit_1<1u, 11489098945649464158ul, 1u, 3732u, 3732u, 5u, 2u, 2u, 1816u, 12u, 3447u, 13u, 1640u, 14u, 16960u, 19136u, 700u, 576u, packer_flex<1u, 16960u, 11u>, 27380416517ul, 7u, 262656u, uint4 [1][2048][16960], uint4 [1][1816][19136], uint4 [265][2048][64], unsigned long [299][1816][64], unsigned char [530][2048][32]>(uint4 (*) [1][2048][16960], uint4 (*) [1][1816][19136], uint4 (*) [265][2048][64], unsigned long (*) [299][1816][64], unsigned char (*) [530][2048][32], unsigned int*, unsigned int*)
void digit_1<1u, 17316820672638457952ul, 1u, 2908u, 2908u, 2u, 2u, 2u, 4552u, 12u, 2685u, 12u, 1264u, 12u, 5760u, 8192u, 700u, 1024u, packer_flex<1u, 5760u, 13u>, 5524670120038ul, 6u, 262657u, uint4 [180][6656][32], uint4 [128][4552][64], uint4 [180][6656][32], unsigned long [128][4552][64], unsigned char [90][6656][64]>(uint4 (*) [180][6656][32], uint4 (*) [128][4552][64], uint4 (*) [180][6656][32], unsigned long (*) [128][4552][64], unsigned char (*) [90][6656][64], unsigned int*, unsigned int*)
void digit_1<1u, 4827645474279941824ul, 2u, 4560u, 4560u, 1u, 2u, 1u, 6912u, 12u, 4209u, 11u, 2020u, 12u, 4704u, 5568u, 800u, 1024u, packer_flex<1u, 4704u, 14u>, 5524670120032ul, 6u, 262657u, uint4 [147][8320][32], uint4 [87][6912][64], uint4 [147][8320][32], unsigned long [87][6912][64], unsigned char [1][8320][4704]>(uint4 (*) [147][8320][32], uint4 (*) [87][6912][64], uint4 (*) [147][8320][32], unsigned long (*) [87][6912][64], unsigned char (*) [1][8320][4704], unsigned int*, unsigned int*)
void digit_1<1u, 7811271908661500000ul, 2u, 2908u, 2908u, 2u, 2u, 2u, 4552u, 12u, 2685u, 12u, 1264u, 12u, 5760u, 8192u, 800u, 1024u, packer_flex<1u, 5760u, 13u>, 5524670120038ul, 6u, 262657u, uint4 [180][6656][32], uint4 [128][4552][64], uint4 [180][6656][32], unsigned long [128][4552][64], unsigned char [90][6656][64]>(uint4 (*) [180][6656][32], uint4 (*) [128][4552][64], uint4 (*) [180][6656][32], unsigned long (*) [128][4552][64], unsigned char (*) [90][6656][64], unsigned int*, unsigned int*)
void digit_1<1u, 8970502565599698964ul, 2u, 3820u, 3820u, 1u, 2u, 1u, 10000u, 12u, 3527u, 11u, 1680u, 11u, 4032u, 4032u, 800u, 1024u, packer_flex<1u, 4032u, 14u>, 5524670120038ul, 6u, 262657u, uint4 [126][10000][32], uint4 [63][10000][64], uint4 [126][10000][32], unsigned long [63][10000][64], unsigned char [63][10000][64]>(uint4 (*) [126][10000][32], uint4 (*) [63][10000][64], uint4 (*) [126][10000][32], unsigned long (*) [63][10000][64], unsigned char (*) [63][10000][64], unsigned int*, unsigned int*)
void digit_2<2u, 10872974046970623180ul, 2u, 3130u, 3130u, 1u, 2u, 1u, 8192u, 12u, 2890u, 11u, 1368u, 11u, 3392u, 4768u, 800u, 1024u, packer_big<14u>, 369367188832ul, 6u, 131073u, uint4 [53][12288][64], uint4 [149][8192][32], unsigned long [53][12288][64], unsigned long [149][8192][32], packer_flex<1u, 3392u, 14u> >(uint4 (*) [53][12288][64], uint4 (*) [149][8192][32], unsigned long (*) [53][12288][64], unsigned long (*) [149][8192][32], unsigned int*, unsigned int*)
void digit_2<2u, 11425559665866073792ul, 2u, 5448u, 5448u, 1u, 2u, 1u, 6548u, 12u, 5031u, 12u, 2428u, 12u, 5568u, 5824u, 800u, 1024u, packer_big<13u>, 369367188832ul, 6u, 131073u, uint4 [87][6912][64], uint4 [182][6548][32], unsigned long [87][6912][64], unsigned long [182][6548][32], packer_flex<1u, 4704u, 14u> >(uint4 (*) [87][6912][64], uint4 (*) [182][6548][32], unsigned long (*) [87][6912][64], unsigned long (*) [182][6548][32], unsigned int*, unsigned int*)
void digit_2<2u, 11489098945649464158ul, 1u, 3510u, 3510u, 6u, 2u, 0u, 2048u, 12u, 3242u, 14u, 1540u, 13u, 19136u, 16960u, 700u, 640u, packer_big<11u>, 369367188992ul, 7u, 131073u, uint4 [1][1816][19136], uint4 [265][2048][64], unsigned long [299][1816][64], unsigned long [530][2048][32], packer_flex<1u, 16960u, 11u> >(uint4 (*) [1][1816][19136], uint4 (*) [265][2048][64], unsigned long (*) [299][1816][64], unsigned long (*) [530][2048][32], unsigned int*, unsigned int*)
void digit_2<2u, 17316820672638457952ul, 1u, 4172u, 4172u, 2u, 2u, 1u, 5040u, 12u, 3853u, 12u, 1844u, 12u, 8192u, 7424u, 700u, 768u, packer_big<13u>, 369367188832ul, 6u, 131072u, uint4 [128][4552][64], uint4 [232][5040][32], unsigned long [128][4552][64], unsigned long [232][5040][32], packer_flex<1u, 5760u, 13u> >(uint4 (*) [128][4552][64], uint4 (*) [232][5040][32], unsigned long (*) [128][4552][64], unsigned long (*) [232][5040][32], unsigned int*, unsigned int*)
void digit_2<2u, 4827645474279941824ul, 2u, 5448u, 5448u, 1u, 2u, 1u, 6548u, 12u, 5031u, 12u, 2428u, 12u, 5568u, 5824u, 800u, 1024u, packer_big<13u>, 369367188832ul, 6u, 131073u, uint4 [87][6912][64], uint4 [182][6548][32], unsigned long [87][6912][64], unsigned long [182][6548][32], packer_flex<1u, 4704u, 14u> >(uint4 (*) [87][6912][64], uint4 (*) [182][6548][32], unsigned long (*) [87][6912][64], unsigned long (*) [182][6548][32], unsigned int*, unsigned int*)
void digit_2<2u, 7811271908661500000ul, 2u, 4172u, 4172u, 2u, 2u, 1u, 5040u, 12u, 3853u, 12u, 1844u, 12u, 8192u, 7424u, 800u, 768u, packer_big<13u>, 369367188832ul, 6u, 131073u, uint4 [128][4552][64], uint4 [232][5040][32], unsigned long [128][4552][64], unsigned long [232][5040][32], packer_flex<1u, 5760u, 13u> >(uint4 (*) [128][4552][64], uint4 (*) [232][5040][32], unsigned long (*) [128][4552][64], unsigned long (*) [232][5040][32], unsigned int*, unsigned int*)
void digit_2<2u, 8970502565599698964ul, 2u, 3812u, 3812u, 1u, 2u, 1u, 10000u, 12u, 3521u, 11u, 1680u, 11u, 4032u, 4000u, 800u, 1024u, packer_big<14u>, 369367188832ul, 6u, 131073u, uint4 [63][10000][64], uint4 [125][10000][32], unsigned long [63][10000][64], unsigned long [125][10000][32], packer_flex<1u, 4032u, 14u> >(uint4 (*) [63][10000][64], uint4 (*) [125][10000][32], unsigned long (*) [63][10000][64], unsigned long (*) [125][10000][32], unsigned int*, unsigned int*)
void digit_3<3u, 10872974046970623180ul, 2u, 600u, 4648u, 1u, 2u, 2u, 8192u, 12u, 4272u, 11u, 2048u, 11u, 4768u, 4800u, 800u, 1024u, packer_big<13u>, 25856ul, 6u, 4u, uint4 [149][8192][32], uint4 [75][8192][64]>(uint4 (*) [149][8192][32], uint4 (*) [75][8192][64], unsigned int*, unsigned int*, unsigned int*)
void digit_3<3u, 11425559665866073792ul, 2u, 600u, 5768u, 1u, 2u, 3u, 7396u, 12u, 5309u, 12u, 2564u, 12u, 5824u, 5248u, 800u, 1024u, packer_big<13u>, 25856ul, 6u, 4u, uint4 [182][6548][32], uint4 [82][7396][64]>(uint4 (*) [182][6548][32], uint4 (*) [82][7396][64], unsigned int*, unsigned int*, unsigned int*)
void digit_3<3u, 11489098945649464158ul, 1u, 600u, 3752u, 5u, 2u, 2u, 3072u, 12u, 3447u, 13u, 1640u, 13u, 16960u, 11296u, 700u, 704u, packer_big<11u>, 1536ul, 7u, 4u, uint4 [265][2048][64], uint4 [1][3072][11296]>(uint4 (*) [265][2048][64], uint4 (*) [1][3072][11296], unsigned int*, unsigned int*, unsigned int*)
void digit_3<3u, 17316820672638457952ul, 1u, 600u, 3808u, 2u, 2u, 2u, 7396u, 12u, 3499u, 12u, 1668u, 12u, 7424u, 5248u, 700u, 768u, packer_big<13u>, 25856ul, 6u, 4u, uint4 [232][5040][32], uint4 [82][7396][64]>(uint4 (*) [232][5040][32], uint4 (*) [82][7396][64], unsigned int*, unsigned int*, unsigned int*)
void digit_3<3u, 4827645474279941824ul, 2u, 600u, 5768u, 1u, 2u, 3u, 7396u, 12u, 5309u, 12u, 2564u, 12u, 5824u, 5248u, 800u, 1024u, packer_big<13u>, 25856ul, 6u, 4u, uint4 [182][6548][32], uint4 [82][7396][64]>(uint4 (*) [182][6548][32], uint4 (*) [82][7396][64], unsigned int*, unsigned int*, unsigned int*)
void digit_3<3u, 7811271908661500000ul, 2u, 600u, 3808u, 2u, 2u, 2u, 7396u, 12u, 3499u, 12u, 1668u, 12u, 7424u, 5248u, 800u, 768u, packer_big<13u>, 25856ul, 6u, 4u, uint4 [232][5040][32], uint4 [82][7396][64]>(uint4 (*) [232][5040][32], uint4 (*) [82][7396][64], unsigned int*, unsigned int*, unsigned int*)
void digit_3<3u, 8970502565599698964ul, 2u, 600u, 3840u, 1u, 2u, 2u, 10000u, 12u, 3527u, 11u, 1680u, 11u, 4000u, 4032u, 800u, 1024u, packer_big<14u>, 25856ul, 6u, 4u, uint4 [125][10000][32], uint4 [63][10000][64]>(uint4 (*) [125][10000][32], uint4 (*) [63][10000][64], unsigned int*, unsigned int*, unsigned int*)
void digit_f<375350513112704ul, 1u, 13u, 6656u, 5760u, 1u, 5498900316166ul, uint4 [180][6656][32], uint4 [180][6656][32], unsigned char [90][6656][64]>(ulonglong4, ulonglong4, uint4 (*) [180][6656][32], uint4 (*) [180][6656][32], unsigned char (*) [90][6656][64], unsigned int*, unsigned int)
void digit_f<387376119562816ul, 1u, 11u, 2048u, 16960u, 1u, 1610612741ul, uint4 [1][2048][16960], uint4 [265][2048][64], unsigned char [530][2048][32]>(ulonglong4, ulonglong4, uint4 (*) [1][2048][16960], uint4 (*) [265][2048][64], unsigned char (*) [530][2048][32], unsigned int*, unsigned int)
void digit_f<656413282013792ul, 2u, 14u, 8320u, 4704u, 1u, 5498900316160ul, uint4 [147][8320][32], uint4 [147][8320][32], unsigned char [1][8320][4704]>(ulonglong4, ulonglong4, uint4 (*) [147][8320][32], uint4 (*) [147][8320][32], unsigned char (*) [1][8320][4704], unsigned int*, unsigned int)
void digit_f<656825489823360ul, 2u, 13u, 6656u, 5760u, 1u, 5498900316166ul, uint4 [180][6656][32], uint4 [180][6656][32], unsigned char [90][6656][64]>(ulonglong4, ulonglong4, uint4 (*) [180][6656][32], uint4 (*) [180][6656][32], unsigned char (*) [90][6656][64], unsigned int*, unsigned int)
void digit_f<656825708974016ul, 2u, 14u, 10000u, 4032u, 1u, 5498900316166ul, uint4 [126][10000][32], uint4 [126][10000][32], unsigned char [63][10000][64]>(ulonglong4, ulonglong4, uint4 (*) [126][10000][32], uint4 (*) [126][10000][32], unsigned char (*) [63][10000][64], unsigned int*, unsigned int)
void digit_f<656825858919744ul, 2u, 14u, 12288u, 3392u, 1u, 5498900316166ul, uint4 [106][12288][32], uint4 [106][12288][32], unsigned char [53][12288][64]>(ulonglong4, ulonglong4, uint4 (*) [106][12288][32], uint4 (*) [106][12288][32], unsigned char (*) [53][12288][64], unsigned int*, unsigned int)
void digit_l<7u, 10872974046970623180ul, 2u, 1u, 410488638104934ul, 722015745476416041ul, 554906418u, 8u, 64u, 800u, 1024u>(equi<410488638104934ul, 722015745476416041ul, 554906418u>*, unsigned int*, ScontainerReal192*)
void digit_l<7u, 11425559665866073792ul, 2u, 1u, 410488638104928ul, 361013056448084601ul, 554906418u, 8u, 64u, 800u, 1024u>(equi<410488638104928ul, 361013056448084601ul, 554906418u>*, unsigned int*, ScontainerReal192*)
void digit_l<7u, 11489098945649464158ul, 1u, 1u, 404991329830405ul, 360999379991910435ul, 285417986u, 8u, 64u, 700u, 1024u>(equi<404991329830405ul, 360999379991910435ul, 285417986u>*, unsigned int*, ScontainerReal192*)
void digit_l<7u, 17316820672638457952ul, 1u, 1u, 410488638104934ul, 360995876552959368ul, 286470658u, 8u, 64u, 700u, 1024u>(equi<410488638104934ul, 360995876552959368ul, 286470658u>*, unsigned int*, ScontainerReal192*)
void digit_l<7u, 4827645474279941824ul, 2u, 1u, 410488638104928ul, 8483336348271229561ul, 554906418u, 8u, 64u, 800u, 1024u>(equi<410488638104928ul, 8483336348271229561ul, 554906418u>*, unsigned int*, ScontainerReal192*)
void digit_l<7u, 7811271908661500000ul, 2u, 1u, 410488638104934ul, 8467475205819852168ul, 554906114u, 8u, 64u, 800u, 1024u>(equi<410488638104934ul, 8467475205819852168ul, 554906114u>*, unsigned int*, ScontainerReal192*)
void digit_l<7u, 8970502565599698964ul, 2u, 1u, 410488638104934ul, 8484746513593925631ul, 554906418u, 8u, 64u, 800u, 1024u>(equi<410488638104934ul, 8484746513593925631ul, 554906418u>*, unsigned int*, ScontainerReal192*)
void digit_4w<4u, 10872974046970623180ul, 2u, 4625u, 4625u, 1u, 3u, 2u, 8192u, 10u, 4272u, 11u, 2048u, 11u, 4800u, 4768u, 800u, 1024u, packer_flex<1u, 4800u, 13u>, 352256ul, 917510u, 0u, uint4 [75][8192][64], uint4 [149][8192][32]>(uint4 (*) [75][8192][64], uint4 (*) [149][8192][32], ushort4*, unsigned int*, unsigned int*)
void digit_4w<4u, 11425559665866073792ul, 2u, 5107u, 5107u, 1u, 3u, 2u, 6548u, 10u, 4717u, 12u, 2272u, 12u, 5248u, 5824u, 800u, 1024u, packer_flex<1u, 5248u, 13u>, 352256ul, 917510u, 0u, uint4 [82][7396][64], uint4 [182][6548][32]>(uint4 (*) [82][7396][64], uint4 (*) [182][6548][32], ushort4*, unsigned int*, unsigned int*)
void digit_4w<4u, 11489098945649464158ul, 1u, 6115u, 6115u, 2u, 0u, 3u, 3200u, 10u, 5648u, 13u, 2732u, 13u, 11296u, 11264u, 700u, 1024u, packer_flex<1u, 11296u, 12u>, 655360ul, 917511u, 0u, uint4 [1][3072][11296], uint4 [11][3200][1024]>(uint4 (*) [1][3072][11296], uint4 (*) [11][3200][1024], ushort4*, unsigned int*, unsigned int*)
void digit_4w<4u, 17316820672638457952ul, 1u, 5107u, 5107u, 1u, 0u, 1u, 6604u, 10u, 4717u, 12u, 2272u, 12u, 5248u, 5792u, 700u, 704u, packer_flex<1u, 5248u, 13u>, 352256ul, 917510u, 0u, uint4 [82][7396][64], uint4 [181][6604][32]>(uint4 (*) [82][7396][64], uint4 (*) [181][6604][32], ushort4*, unsigned int*, unsigned int*)
void digit_4w<4u, 4827645474279941824ul, 2u, 5107u, 5107u, 1u, 3u, 2u, 8192u, 10u, 4717u, 12u, 2272u, 11u, 5248u, 4768u, 800u, 1024u, packer_flex<1u, 5248u, 13u>, 352256ul, 917510u, 0u, uint4 [82][7396][64], uint4 [149][8192][32]>(uint4 (*) [82][7396][64], uint4 (*) [149][8192][32], ushort4*, unsigned int*, unsigned int*)
void digit_4w<4u, 7811271908661500000ul, 2u, 5107u, 5107u, 1u, 0u, 1u, 6604u, 10u, 4717u, 12u, 2272u, 12u, 5248u, 5792u, 800u, 704u, packer_flex<1u, 5248u, 13u>, 352256ul, 917510u, 0u, uint4 [82][7396][64], uint4 [181][6604][32]>(uint4 (*) [82][7396][64], uint4 (*) [181][6604][32], ushort4*, unsigned int*, unsigned int*)
void digit_4w<4u, 8970502565599698964ul, 2u, 3818u, 3818u, 1u, 3u, 2u, 10000u, 10u, 3527u, 11u, 1680u, 11u, 4032u, 4000u, 800u, 1024u, packer_flex<1u, 4032u, 14u>, 352256ul, 917510u, 0u, uint4 [63][10000][64], uint4 [125][10000][32]>(uint4 (*) [63][10000][64], uint4 (*) [125][10000][32], ushort4*, unsigned int*, unsigned int*)
void digit_5w<5u, 10872974046970623180ul, 2u, 1024u, 4625u, 1u, 3u, 2u, 12288u, 10u, 4272u, 11u, 2048u, 11u, 4768u, 3456u, 800u, 1024u, packer_flex<1u, 4768u, 13u>, 7667712ul, 917510u, 0u, uint4 [149][8192][32], uint4 [27][12288][128]>(uint4 (*) [149][8192][32], uint4 (*) [27][12288][128], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_5w<5u, 11425559665866073792ul, 2u, 1024u, 5748u, 1u, 3u, 2u, 4096u, 10u, 5309u, 12u, 2564u, 12u, 5824u, 9088u, 800u, 1024u, packer_flex<1u, 5824u, 13u>, 7667712ul, 917510u, 0u, uint4 [182][6548][32], uint4 [71][4096][128]>(uint4 (*) [182][6548][32], uint4 (*) [71][4096][128], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_5w<5u, 11489098945649464158ul, 1u, 1024u, 5876u, 2u, 2u, 1u, 4096u, 10u, 5428u, 13u, 2624u, 12u, 11264u, 8480u, 700u, 1024u, packer_flex<1u, 11264u, 12u>, 5898240ul, 917511u, 0u, uint4 [11][3200][1024], uint4 [265][4096][32]>(uint4 (*) [11][3200][1024], uint4 (*) [265][4096][32], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_5w<5u, 17316820672638457952ul, 1u, 1024u, 5700u, 1u, 2u, 0u, 4096u, 10u, 5265u, 12u, 2544u, 12u, 5792u, 9088u, 700u, 1024u, packer_flex<1u, 5792u, 13u>, 7667712ul, 917510u, 0u, uint4 [181][6604][32], uint4 [71][4096][128]>(uint4 (*) [181][6604][32], uint4 (*) [71][4096][128], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_5w<5u, 4827645474279941824ul, 2u, 1024u, 4625u, 1u, 3u, 2u, 8192u, 10u, 4272u, 11u, 2048u, 11u, 4768u, 4864u, 800u, 1024u, packer_flex<1u, 4768u, 13u>, 7667712ul, 917510u, 0u, uint4 [149][8192][32], uint4 [38][8192][128]>(uint4 (*) [149][8192][32], uint4 (*) [38][8192][128], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_5w<5u, 7811271908661500000ul, 2u, 1024u, 5700u, 1u, 2u, 0u, 4096u, 10u, 5265u, 12u, 2544u, 12u, 5792u, 9088u, 800u, 1024u, packer_flex<1u, 5792u, 13u>, 7667712ul, 917510u, 0u, uint4 [181][6604][32], uint4 [71][4096][128]>(uint4 (*) [181][6604][32], uint4 (*) [71][4096][128], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_5w<5u, 8970502565599698964ul, 2u, 1024u, 3818u, 1u, 3u, 2u, 10000u, 10u, 3527u, 11u, 1680u, 11u, 4000u, 4096u, 800u, 1024u, packer_flex<1u, 4000u, 14u>, 7667712ul, 917510u, 0u, uint4 [125][10000][32], uint4 [32][10000][128]>(uint4 (*) [125][10000][32], uint4 (*) [32][10000][128], unsigned int*, unsigned short*, unsigned int*, unsigned int*)
void digit_6w<6u, 10872974046970623180ul, 2u, 2048u, 2112u, 1u, 3u, 1u, 12288u, 10u, 2896u, 11u, 1368u, 11u, 3456u, 3360u, 800u, 1024u, packer_flex<1u, 3456u, 14u>, 91226112ul, 512u, 14u, uint4 [27][12288][128], uint2 [105][12288][32]>(uint4 (*) [27][12288][128], uint2 (*) [105][12288][32], unsigned int*, unsigned int*)
void digit_6w<6u, 11425559665866073792ul, 2u, 2048u, 8072u, 1u, 3u, 1u, 4096u, 10u, 8400u, 12u, 4096u, 12u, 9088u, 8992u, 800u, 1024u, packer_flex<1u, 9088u, 12u>, 91226112ul, 512u, 14u, uint4 [71][4096][128], uint2 [281][4096][32]>(uint4 (*) [71][4096][128], uint2 (*) [281][4096][32], unsigned int*, unsigned int*)
void digit_6w<6u, 11489098945649464158ul, 1u, 2048u, 8072u, 1u, 2u, 1u, 4096u, 10u, 8400u, 12u, 4096u, 12u, 8480u, 8480u, 700u, 1024u, packer_flex<1u, 8480u, 12u>, 72351744ul, 512u, 14u, uint4 [265][4096][32], uint2 [530][4096][16]>(uint4 (*) [265][4096][32], uint2 (*) [530][4096][16], unsigned int*, unsigned int*)
void digit_6w<6u, 17316820672638457952ul, 1u, 2048u, 8072u, 1u, 3u, 1u, 4096u, 10u, 8400u, 12u, 4096u, 12u, 9088u, 8992u, 700u, 1024u, packer_flex<1u, 9088u, 12u>, 91226112ul, 512u, 14u, uint4 [71][4096][128], uint2 [281][4096][32]>(uint4 (*) [71][4096][128], uint2 (*) [281][4096][32], unsigned int*, unsigned int*)
void digit_6w<6u, 4827645474279941824ul, 2u, 2048u, 3604u, 1u, 3u, 1u, 8192u, 10u, 4272u, 11u, 2048u, 11u, 4864u, 4768u, 800u, 1024u, packer_flex<1u, 4864u, 13u>, 91226112ul, 512u, 14u, uint4 [38][8192][128], uint2 [149][8192][32]>(uint4 (*) [38][8192][128], uint2 (*) [149][8192][32], unsigned int*, unsigned int*)
void digit_6w<6u, 7811271908661500000ul, 2u, 2048u, 8072u, 1u, 3u, 1u, 8192u, 10u, 8400u, 12u, 4096u, 11u, 9088u, 4768u, 800u, 1024u, packer_flex<1u, 9088u, 12u>, 91226112ul, 512u, 14u, uint4 [71][4096][128], uint2 [149][8192][32]>(uint4 (*) [71][4096][128], uint2 (*) [149][8192][32], unsigned int*, unsigned int*)
void digit_6w<6u, 8970502565599698964ul, 2u, 2048u, 2804u, 1u, 3u, 1u, 8192u, 10u, 3536u, 11u, 1680u, 11u, 4096u, 4768u, 800u, 1024u, packer_flex<1u, 4096u, 14u>, 91226112ul, 512u, 14u, uint4 [32][10000][128], uint2 [149][8192][32]>(uint4 (*) [32][10000][128], uint2 (*) [149][8192][32], unsigned int*, unsigned int*)
+57
View File
@@ -0,0 +1,57 @@
_Z17sort_and_compress10SHA256_CTXP17ScontainerReal192P11Compress192mj
_Z7cleanupILj64EEvPvj
_Z7digit_1ILj1ELm10872974046970623180ELj2ELj3136ELj3136ELj1ELj2ELj1ELj12288ELj12ELj2896ELj11ELj1368ELj11ELj3392ELj3392ELj800ELj1024E11packer_flexILj1ELj3392ELj14EELm5524670120038ELj6ELj262657EA106_A12288_A32_5uint4A53_A12288_A64_S2_S5_A53_A12288_A64_mA53_A12288_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_
_Z7digit_1ILj1ELm11425559665866073792ELj2ELj4560ELj4560ELj1ELj2ELj1ELj6912ELj12ELj4209ELj11ELj2020ELj12ELj4704ELj5568ELj800ELj1024E11packer_flexILj1ELj4704ELj14EELm5524670120032ELj6ELj262657EA147_A8320_A32_5uint4A87_A6912_A64_S2_S5_A87_A6912_A64_mA1_A8320_A4704_hEvPT21_PT22_PT23_PT24_PT25_PjSP_
_Z7digit_1ILj1ELm11489098945649464158ELj1ELj3732ELj3732ELj5ELj2ELj2ELj1816ELj12ELj3447ELj13ELj1640ELj14ELj16960ELj19136ELj700ELj576E11packer_flexILj1ELj16960ELj11EELm27380416517ELj7ELj262656EA1_A2048_A16960_5uint4A1_A1816_A19136_S2_A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_hEvPT21_PT22_PT23_PT24_PT25_PjSS_
_Z7digit_1ILj1ELm17316820672638457952ELj1ELj2908ELj2908ELj2ELj2ELj2ELj4552ELj12ELj2685ELj12ELj1264ELj12ELj5760ELj8192ELj700ELj1024E11packer_flexILj1ELj5760ELj13EELm5524670120038ELj6ELj262657EA180_A6656_A32_5uint4A128_A4552_A64_S2_S5_A128_A4552_A64_mA90_A6656_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_
_Z7digit_1ILj1ELm4827645474279941824ELj2ELj4560ELj4560ELj1ELj2ELj1ELj6912ELj12ELj4209ELj11ELj2020ELj12ELj4704ELj5568ELj800ELj1024E11packer_flexILj1ELj4704ELj14EELm5524670120032ELj6ELj262657EA147_A8320_A32_5uint4A87_A6912_A64_S2_S5_A87_A6912_A64_mA1_A8320_A4704_hEvPT21_PT22_PT23_PT24_PT25_PjSP_
_Z7digit_1ILj1ELm7811271908661500000ELj2ELj2908ELj2908ELj2ELj2ELj2ELj4552ELj12ELj2685ELj12ELj1264ELj12ELj5760ELj8192ELj800ELj1024E11packer_flexILj1ELj5760ELj13EELm5524670120038ELj6ELj262657EA180_A6656_A32_5uint4A128_A4552_A64_S2_S5_A128_A4552_A64_mA90_A6656_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_
_Z7digit_1ILj1ELm8970502565599698964ELj2ELj3820ELj3820ELj1ELj2ELj1ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4032ELj4032ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm5524670120038ELj6ELj262657EA126_A10000_A32_5uint4A63_A10000_A64_S2_S5_A63_A10000_A64_mA63_A10000_A64_hEvPT21_PT22_PT23_PT24_PT25_PjSP_
_Z7digit_2ILj2ELm10872974046970623180ELj2ELj3130ELj3130ELj1ELj2ELj1ELj8192ELj12ELj2890ELj11ELj1368ELj11ELj3392ELj4768ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA53_A12288_A64_5uint4A149_A8192_A32_S2_A53_A12288_A64_mA149_A8192_A32_m11packer_flexILj1ELj3392ELj14EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_2ILj2ELm11425559665866073792ELj2ELj5448ELj5448ELj1ELj2ELj1ELj6548ELj12ELj5031ELj12ELj2428ELj12ELj5568ELj5824ELj800ELj1024E10packer_bigILj13EELm369367188832ELj6ELj131073EA87_A6912_A64_5uint4A182_A6548_A32_S2_A87_A6912_A64_mA182_A6548_A32_m11packer_flexILj1ELj4704ELj14EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_2ILj2ELm11489098945649464158ELj1ELj3510ELj3510ELj6ELj2ELj0ELj2048ELj12ELj3242ELj14ELj1540ELj13ELj19136ELj16960ELj700ELj640E10packer_bigILj11EELm369367188992ELj7ELj131073EA1_A1816_A19136_5uint4A265_A2048_A64_S2_A299_A1816_A64_mA530_A2048_A32_m11packer_flexILj1ELj16960ELj11EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_2ILj2ELm17316820672638457952ELj1ELj4172ELj4172ELj2ELj2ELj1ELj5040ELj12ELj3853ELj12ELj1844ELj12ELj8192ELj7424ELj700ELj768E10packer_bigILj13EELm369367188832ELj6ELj131072EA128_A4552_A64_5uint4A232_A5040_A32_S2_A128_A4552_A64_mA232_A5040_A32_m11packer_flexILj1ELj5760ELj13EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_2ILj2ELm4827645474279941824ELj2ELj5448ELj5448ELj1ELj2ELj1ELj6548ELj12ELj5031ELj12ELj2428ELj12ELj5568ELj5824ELj800ELj1024E10packer_bigILj13EELm369367188832ELj6ELj131073EA87_A6912_A64_5uint4A182_A6548_A32_S2_A87_A6912_A64_mA182_A6548_A32_m11packer_flexILj1ELj4704ELj14EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_2ILj2ELm7811271908661500000ELj2ELj4172ELj4172ELj2ELj2ELj1ELj5040ELj12ELj3853ELj12ELj1844ELj12ELj8192ELj7424ELj800ELj768E10packer_bigILj13EELm369367188832ELj6ELj131073EA128_A4552_A64_5uint4A232_A5040_A32_S2_A128_A4552_A64_mA232_A5040_A32_m11packer_flexILj1ELj5760ELj13EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_2ILj2ELm8970502565599698964ELj2ELj3812ELj3812ELj1ELj2ELj1ELj10000ELj12ELj3521ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E10packer_bigILj14EELm369367188832ELj6ELj131073EA63_A10000_A64_5uint4A125_A10000_A32_S2_A63_A10000_A64_mA125_A10000_A32_m11packer_flexILj1ELj4032ELj14EEEvPT21_PT22_PT23_PT24_PjSP_
_Z7digit_3ILj3ELm10872974046970623180ELj2ELj600ELj4648ELj1ELj2ELj2ELj8192ELj12ELj4272ELj11ELj2048ELj11ELj4768ELj4800ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA149_A8192_A32_5uint4A75_A8192_A64_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_3ILj3ELm11425559665866073792ELj2ELj600ELj5768ELj1ELj2ELj3ELj7396ELj12ELj5309ELj12ELj2564ELj12ELj5824ELj5248ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA182_A6548_A32_5uint4A82_A7396_A64_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_3ILj3ELm11489098945649464158ELj1ELj600ELj3752ELj5ELj2ELj2ELj3072ELj12ELj3447ELj13ELj1640ELj13ELj16960ELj11296ELj700ELj704E10packer_bigILj11EELm1536ELj7ELj4EA265_A2048_A64_5uint4A1_A3072_A11296_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_3ILj3ELm17316820672638457952ELj1ELj600ELj3808ELj2ELj2ELj2ELj7396ELj12ELj3499ELj12ELj1668ELj12ELj7424ELj5248ELj700ELj768E10packer_bigILj13EELm25856ELj6ELj4EA232_A5040_A32_5uint4A82_A7396_A64_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_3ILj3ELm4827645474279941824ELj2ELj600ELj5768ELj1ELj2ELj3ELj7396ELj12ELj5309ELj12ELj2564ELj12ELj5824ELj5248ELj800ELj1024E10packer_bigILj13EELm25856ELj6ELj4EA182_A6548_A32_5uint4A82_A7396_A64_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_3ILj3ELm7811271908661500000ELj2ELj600ELj3808ELj2ELj2ELj2ELj7396ELj12ELj3499ELj12ELj1668ELj12ELj7424ELj5248ELj800ELj768E10packer_bigILj13EELm25856ELj6ELj4EA232_A5040_A32_5uint4A82_A7396_A64_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_3ILj3ELm8970502565599698964ELj2ELj600ELj3840ELj1ELj2ELj2ELj10000ELj12ELj3527ELj11ELj1680ELj11ELj4000ELj4032ELj800ELj1024E10packer_bigILj14EELm25856ELj6ELj4EA125_A10000_A32_5uint4A63_A10000_A64_S2_EvPT21_PT22_PjSD_SD_
_Z7digit_fILm375350513112704ELj1ELj13ELj6656ELj5760ELj1ELm5498900316166EA180_A6656_A32_5uint4S3_A90_A6656_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj
_Z7digit_fILm387376119562816ELj1ELj11ELj2048ELj16960ELj1ELm1610612741EA1_A2048_A16960_5uint4A265_A2048_A64_S0_A530_A2048_A32_hEv10ulonglong4SA_PT6_PT7_PT8_Pjj
_Z7digit_fILm656413282013792ELj2ELj14ELj8320ELj4704ELj1ELm5498900316160EA147_A8320_A32_5uint4S3_A1_A8320_A4704_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj
_Z7digit_fILm656825489823360ELj2ELj13ELj6656ELj5760ELj1ELm5498900316166EA180_A6656_A32_5uint4S3_A90_A6656_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj
_Z7digit_fILm656825708974016ELj2ELj14ELj10000ELj4032ELj1ELm5498900316166EA126_A10000_A32_5uint4S3_A63_A10000_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj
_Z7digit_fILm656825858919744ELj2ELj14ELj12288ELj3392ELj1ELm5498900316166EA106_A12288_A32_5uint4S3_A53_A12288_A64_hEv10ulonglong4S7_PT6_PT7_PT8_Pjj
_Z7digit_lILj7ELm10872974046970623180ELj2ELj1ELm410488638104934ELm722015745476416041ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z7digit_lILj7ELm11425559665866073792ELj2ELj1ELm410488638104928ELm361013056448084601ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z7digit_lILj7ELm11489098945649464158ELj1ELj1ELm404991329830405ELm360999379991910435ELj285417986ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z7digit_lILj7ELm17316820672638457952ELj1ELj1ELm410488638104934ELm360995876552959368ELj286470658ELj8ELj64ELj700ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z7digit_lILj7ELm4827645474279941824ELj2ELj1ELm410488638104928ELm8483336348271229561ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z7digit_lILj7ELm7811271908661500000ELj2ELj1ELm410488638104934ELm8467475205819852168ELj554906114ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z7digit_lILj7ELm8970502565599698964ELj2ELj1ELm410488638104934ELm8484746513593925631ELj554906418ELj8ELj64ELj800ELj1024EEvP4equiIXT3_EXT4_EXT5_EEPjP17ScontainerReal192
_Z8digit_4wILj4ELm10872974046970623180ELj2ELj4625ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4800ELj4768ELj800ELj1024E11packer_flexILj1ELj4800ELj13EELm352256ELj917510ELj0EA75_A8192_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_4wILj4ELm11425559665866073792ELj2ELj5107ELj5107ELj1ELj3ELj2ELj6548ELj10ELj4717ELj12ELj2272ELj12ELj5248ELj5824ELj800ELj1024E11packer_flexILj1ELj5248ELj13EELm352256ELj917510ELj0EA82_A7396_A64_5uint4A182_A6548_A32_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_4wILj4ELm11489098945649464158ELj1ELj6115ELj6115ELj2ELj0ELj3ELj3200ELj10ELj5648ELj13ELj2732ELj13ELj11296ELj11264ELj700ELj1024E11packer_flexILj1ELj11296ELj12EELm655360ELj917511ELj0EA1_A3072_A11296_5uint4A11_A3200_A1024_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_4wILj4ELm17316820672638457952ELj1ELj5107ELj5107ELj1ELj0ELj1ELj6604ELj10ELj4717ELj12ELj2272ELj12ELj5248ELj5792ELj700ELj704E11packer_flexILj1ELj5248ELj13EELm352256ELj917510ELj0EA82_A7396_A64_5uint4A181_A6604_A32_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_4wILj4ELm4827645474279941824ELj2ELj5107ELj5107ELj1ELj3ELj2ELj8192ELj10ELj4717ELj12ELj2272ELj11ELj5248ELj4768ELj800ELj1024E11packer_flexILj1ELj5248ELj13EELm352256ELj917510ELj0EA82_A7396_A64_5uint4A149_A8192_A32_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_4wILj4ELm7811271908661500000ELj2ELj5107ELj5107ELj1ELj0ELj1ELj6604ELj10ELj4717ELj12ELj2272ELj12ELj5248ELj5792ELj800ELj704E11packer_flexILj1ELj5248ELj13EELm352256ELj917510ELj0EA82_A7396_A64_5uint4A181_A6604_A32_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_4wILj4ELm8970502565599698964ELj2ELj3818ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4032ELj4000ELj800ELj1024E11packer_flexILj1ELj4032ELj14EELm352256ELj917510ELj0EA63_A10000_A64_5uint4A125_A10000_A32_S2_EvPT21_PT22_P7ushort4PjSF_
_Z8digit_5wILj5ELm10872974046970623180ELj2ELj1024ELj4625ELj1ELj3ELj2ELj12288ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj3456ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A27_A12288_A128_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_5wILj5ELm11425559665866073792ELj2ELj1024ELj5748ELj1ELj3ELj2ELj4096ELj10ELj5309ELj12ELj2564ELj12ELj5824ELj9088ELj800ELj1024E11packer_flexILj1ELj5824ELj13EELm7667712ELj917510ELj0EA182_A6548_A32_5uint4A71_A4096_A128_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_5wILj5ELm11489098945649464158ELj1ELj1024ELj5876ELj2ELj2ELj1ELj4096ELj10ELj5428ELj13ELj2624ELj12ELj11264ELj8480ELj700ELj1024E11packer_flexILj1ELj11264ELj12EELm5898240ELj917511ELj0EA11_A3200_A1024_5uint4A265_A4096_A32_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_5wILj5ELm17316820672638457952ELj1ELj1024ELj5700ELj1ELj2ELj0ELj4096ELj10ELj5265ELj12ELj2544ELj12ELj5792ELj9088ELj700ELj1024E11packer_flexILj1ELj5792ELj13EELm7667712ELj917510ELj0EA181_A6604_A32_5uint4A71_A4096_A128_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_5wILj5ELm4827645474279941824ELj2ELj1024ELj4625ELj1ELj3ELj2ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4768ELj4864ELj800ELj1024E11packer_flexILj1ELj4768ELj13EELm7667712ELj917510ELj0EA149_A8192_A32_5uint4A38_A8192_A128_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_5wILj5ELm7811271908661500000ELj2ELj1024ELj5700ELj1ELj2ELj0ELj4096ELj10ELj5265ELj12ELj2544ELj12ELj5792ELj9088ELj800ELj1024E11packer_flexILj1ELj5792ELj13EELm7667712ELj917510ELj0EA181_A6604_A32_5uint4A71_A4096_A128_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_5wILj5ELm8970502565599698964ELj2ELj1024ELj3818ELj1ELj3ELj2ELj10000ELj10ELj3527ELj11ELj1680ELj11ELj4000ELj4096ELj800ELj1024E11packer_flexILj1ELj4000ELj14EELm7667712ELj917510ELj0EA125_A10000_A32_5uint4A32_A10000_A128_S2_EvPT21_PT22_PjPtSD_SD_
_Z8digit_6wILj6ELm10872974046970623180ELj2ELj2048ELj2112ELj1ELj3ELj1ELj12288ELj10ELj2896ELj11ELj1368ELj11ELj3456ELj3360ELj800ELj1024E11packer_flexILj1ELj3456ELj14EELm91226112ELj512ELj14EA27_A12288_A128_5uint4A105_A12288_A32_5uint2EvPT21_PT22_PjSE_
_Z8digit_6wILj6ELm11425559665866073792ELj2ELj2048ELj8072ELj1ELj3ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj9088ELj8992ELj800ELj1024E11packer_flexILj1ELj9088ELj12EELm91226112ELj512ELj14EA71_A4096_A128_5uint4A281_A4096_A32_5uint2EvPT21_PT22_PjSE_
_Z8digit_6wILj6ELm11489098945649464158ELj1ELj2048ELj8072ELj1ELj2ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj8480ELj8480ELj700ELj1024E11packer_flexILj1ELj8480ELj12EELm72351744ELj512ELj14EA265_A4096_A32_5uint4A530_A4096_A16_5uint2EvPT21_PT22_PjSE_
_Z8digit_6wILj6ELm17316820672638457952ELj1ELj2048ELj8072ELj1ELj3ELj1ELj4096ELj10ELj8400ELj12ELj4096ELj12ELj9088ELj8992ELj700ELj1024E11packer_flexILj1ELj9088ELj12EELm91226112ELj512ELj14EA71_A4096_A128_5uint4A281_A4096_A32_5uint2EvPT21_PT22_PjSE_
_Z8digit_6wILj6ELm4827645474279941824ELj2ELj2048ELj3604ELj1ELj3ELj1ELj8192ELj10ELj4272ELj11ELj2048ELj11ELj4864ELj4768ELj800ELj1024E11packer_flexILj1ELj4864ELj13EELm91226112ELj512ELj14EA38_A8192_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_
_Z8digit_6wILj6ELm7811271908661500000ELj2ELj2048ELj8072ELj1ELj3ELj1ELj8192ELj10ELj8400ELj12ELj4096ELj11ELj9088ELj4768ELj800ELj1024E11packer_flexILj1ELj9088ELj12EELm91226112ELj512ELj14EA71_A4096_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_
_Z8digit_6wILj6ELm8970502565599698964ELj2ELj2048ELj2804ELj1ELj3ELj1ELj8192ELj10ELj3536ELj11ELj1680ELj11ELj4096ELj4768ELj800ELj1024E11packer_flexILj1ELj4096ELj14EELm91226112ELj512ELj14EA32_A10000_A128_5uint4A149_A8192_A32_5uint2EvPT21_PT22_PjSE_
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+272
View File
@@ -0,0 +1,272 @@
//! NVML backend for [`crate::gpu_tune::GpuTuner`] — the GPU control surface
//! (clocks, power, V/F offsets, readout). Cross-platform: `libnvidia-ml.so` on
//! Linux, `nvml.dll` on Windows; the C API is identical, so this one module
//! serves both (see `build.rs` for the per-target link name).
//!
//! The CUDA Driver API can't control clocks/power; that lives in NVML. Each
//! [`NvmlTuner`] wraps one device handle (resolved by PCI bus id, so it matches
//! the physical card regardless of CUDA-vs-NVML index ordering) and holds an NVML
//! init refcount for its lifetime. All setters are privileged: without elevated
//! rights (root / Administrator) they return `NO_PERMISSION` (and some are
//! `NOT_SUPPORTED`, e.g. persistence mode on laptop GPUs) — surfaced as
//! [`SetOutcome`] and only logged.
#![allow(non_camel_case_types)]
use std::ffi::{c_char, c_int, c_uint, c_void, CStr, CString};
use std::ptr;
use crate::gpu_tune::{GpuTuner, SetOutcome};
type nvmlReturn_t = c_int;
type nvmlDevice_t = *mut c_void;
const NVML_SUCCESS: nvmlReturn_t = 0;
const NVML_ERROR_NOT_SUPPORTED: nvmlReturn_t = 3;
const NVML_ERROR_NO_PERMISSION: nvmlReturn_t = 4;
const NVML_FEATURE_ENABLED: c_uint = 1;
const NVML_FEATURE_DISABLED: c_uint = 0;
// nvmlClockType_t
const NVML_CLOCK_SM: c_int = 1;
const NVML_CLOCK_MEM: c_int = 2;
// nvmlTemperatureSensors_t
const NVML_TEMPERATURE_GPU: c_int = 0;
extern "C" {
fn nvmlInit_v2() -> nvmlReturn_t;
fn nvmlShutdown() -> nvmlReturn_t;
fn nvmlDeviceGetName(device: nvmlDevice_t, name: *mut c_char, length: c_uint) -> nvmlReturn_t;
fn nvmlDeviceGetMaxClockInfo(device: nvmlDevice_t, clock_type: c_int, clock: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceGetClockInfo(device: nvmlDevice_t, clock_type: c_int, clock: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceSetPersistenceMode(device: nvmlDevice_t, mode: c_uint) -> nvmlReturn_t;
fn nvmlDeviceSetGpuLockedClocks(device: nvmlDevice_t, min_mhz: c_uint, max_mhz: c_uint) -> nvmlReturn_t;
fn nvmlDeviceSetMemoryLockedClocks(device: nvmlDevice_t, min_mhz: c_uint, max_mhz: c_uint) -> nvmlReturn_t;
fn nvmlDeviceGetPowerManagementLimitConstraints(device: nvmlDevice_t, min_mw: *mut c_uint, max_mw: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceGetPowerManagementDefaultLimit(device: nvmlDevice_t, default_mw: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceSetPowerManagementLimit(device: nvmlDevice_t, limit_mw: c_uint) -> nvmlReturn_t;
fn nvmlDeviceGetPowerManagementLimit(device: nvmlDevice_t, limit_mw: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceResetGpuLockedClocks(device: nvmlDevice_t) -> nvmlReturn_t;
fn nvmlDeviceResetMemoryLockedClocks(device: nvmlDevice_t) -> nvmlReturn_t;
fn nvmlDeviceGetHandleByPciBusId_v2(pci_bus_id: *const c_char, device: *mut nvmlDevice_t) -> nvmlReturn_t;
fn nvmlDeviceGetPowerUsage(device: nvmlDevice_t, milliwatts: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceGetTemperature(device: nvmlDevice_t, sensor: c_int, temp: *mut c_uint) -> nvmlReturn_t;
fn nvmlDeviceSetGpcClkVfOffset(device: nvmlDevice_t, offset: c_int) -> nvmlReturn_t;
fn nvmlDeviceSetMemClkVfOffset(device: nvmlDevice_t, offset: c_int) -> nvmlReturn_t;
fn nvmlDeviceGetGpcClkMinMaxVfOffset(device: nvmlDevice_t, min_off: *mut c_int, max_off: *mut c_int) -> nvmlReturn_t;
fn nvmlDeviceGetMemClkMinMaxVfOffset(device: nvmlDevice_t, min_off: *mut c_int, max_off: *mut c_int) -> nvmlReturn_t;
fn nvmlErrorString(result: nvmlReturn_t) -> *const c_char;
}
/// One NVML device handle. Holds an NVML init refcount until dropped.
pub struct NvmlTuner {
dev: nvmlDevice_t,
}
// NVML device handles are process-global and queries are thread-safe, so a tuner
// can travel to the worker thread that owns its solver.
unsafe impl Send for NvmlTuner {}
/// Open an NVML control handle for the GPU at `pci_bus_id` (e.g. "0000:01:00.0").
pub fn open(pci_bus_id: &str) -> Option<Box<dyn GpuTuner>> {
let cstr = CString::new(pci_bus_id).ok()?;
unsafe {
if nvmlInit_v2() != NVML_SUCCESS {
return None;
}
let mut dev: nvmlDevice_t = ptr::null_mut();
if nvmlDeviceGetHandleByPciBusId_v2(cstr.as_ptr(), &mut dev) != NVML_SUCCESS {
nvmlShutdown();
return None;
}
Some(Box::new(NvmlTuner { dev }))
}
}
/// Map an NVML return code to a [`SetOutcome`].
fn outcome(rc: nvmlReturn_t) -> SetOutcome {
match rc {
NVML_SUCCESS => SetOutcome::Applied,
NVML_ERROR_NO_PERMISSION => SetOutcome::Denied,
NVML_ERROR_NOT_SUPPORTED => SetOutcome::Unsupported,
other => SetOutcome::Failed(errstr(other)),
}
}
impl NvmlTuner {
fn max_clock(&self, kind: c_int) -> Option<u32> {
unsafe {
let mut c: c_uint = 0;
if nvmlDeviceGetMaxClockInfo(self.dev, kind, &mut c) == NVML_SUCCESS && c > 0 {
Some(c)
} else {
None
}
}
}
fn current_clock(&self, kind: c_int) -> Option<u32> {
unsafe {
let mut c: c_uint = 0;
if nvmlDeviceGetClockInfo(self.dev, kind, &mut c) == NVML_SUCCESS && c > 0 {
Some(c)
} else {
None
}
}
}
}
impl GpuTuner for NvmlTuner {
fn name(&self) -> String {
unsafe {
let mut buf = [0 as c_char; 96];
if nvmlDeviceGetName(self.dev, buf.as_mut_ptr(), buf.len() as c_uint) == NVML_SUCCESS {
CStr::from_ptr(buf.as_ptr()).to_string_lossy().into_owned()
} else {
"GPU".to_string()
}
}
}
fn watts(&self) -> Option<f64> {
unsafe {
let mut mw: c_uint = 0;
if nvmlDeviceGetPowerUsage(self.dev, &mut mw) == NVML_SUCCESS {
Some(mw as f64 / 1000.0)
} else {
None
}
}
}
fn temperature_c(&self) -> Option<u32> {
unsafe {
let mut t: c_uint = 0;
if nvmlDeviceGetTemperature(self.dev, NVML_TEMPERATURE_GPU, &mut t) == NVML_SUCCESS {
Some(t)
} else {
None
}
}
}
fn current_power_limit_w(&self) -> Option<u32> {
unsafe {
let mut mw: c_uint = 0;
if nvmlDeviceGetPowerManagementLimit(self.dev, &mut mw) == NVML_SUCCESS && mw > 0 {
Some(mw / 1000)
} else {
None
}
}
}
fn core_clock_mhz(&self) -> Option<u32> {
self.current_clock(NVML_CLOCK_SM)
}
fn mem_clock_mhz(&self) -> Option<u32> {
self.current_clock(NVML_CLOCK_MEM)
}
fn max_core_clock_mhz(&self) -> Option<u32> {
self.max_clock(NVML_CLOCK_SM)
}
fn max_mem_clock_mhz(&self) -> Option<u32> {
self.max_clock(NVML_CLOCK_MEM)
}
fn power_limit_range_w(&self) -> Option<(u32, u32)> {
unsafe {
let (mut lo, mut hi): (c_uint, c_uint) = (0, 0);
if nvmlDeviceGetPowerManagementLimitConstraints(self.dev, &mut lo, &mut hi) == NVML_SUCCESS && hi > 0 {
Some((lo / 1000, hi / 1000))
} else {
None
}
}
}
fn set_persistence(&self, on: bool) -> SetOutcome {
let mode = if on { NVML_FEATURE_ENABLED } else { NVML_FEATURE_DISABLED };
unsafe { outcome(nvmlDeviceSetPersistenceMode(self.dev, mode)) }
}
fn lock_core_clock_mhz(&self, mhz: u32) -> SetOutcome {
let c = self.max_core_clock_mhz().map_or(mhz, |mx| mhz.min(mx));
unsafe { outcome(nvmlDeviceSetGpuLockedClocks(self.dev, c, c)) }
}
fn lock_mem_clock_mhz(&self, mhz: u32) -> SetOutcome {
let c = self.max_mem_clock_mhz().map_or(mhz, |mx| mhz.min(mx));
unsafe { outcome(nvmlDeviceSetMemoryLockedClocks(self.dev, c, c)) }
}
fn set_power_limit_w(&self, watts: u32) -> SetOutcome {
let mw = match self.power_limit_range_w() {
Some((lo, hi)) => (watts * 1000).clamp(lo * 1000, hi * 1000),
None => watts * 1000,
};
unsafe { outcome(nvmlDeviceSetPowerManagementLimit(self.dev, mw)) }
}
fn set_core_offset_mhz(&self, mhz: i32) -> SetOutcome {
unsafe {
let (mut lo, mut hi): (c_int, c_int) = (0, 0);
let off = if nvmlDeviceGetGpcClkMinMaxVfOffset(self.dev, &mut lo, &mut hi) == NVML_SUCCESS {
mhz.clamp(lo, hi)
} else {
mhz
};
outcome(nvmlDeviceSetGpcClkVfOffset(self.dev, off))
}
}
fn set_mem_offset_mhz(&self, mhz: i32) -> SetOutcome {
unsafe {
let (mut lo, mut hi): (c_int, c_int) = (0, 0);
let off = if nvmlDeviceGetMemClkMinMaxVfOffset(self.dev, &mut lo, &mut hi) == NVML_SUCCESS {
mhz.clamp(lo, hi)
} else {
mhz
};
outcome(nvmlDeviceSetMemClkVfOffset(self.dev, off))
}
}
fn reset(&self) {
unsafe {
let mut restored = false;
restored |= nvmlDeviceResetGpuLockedClocks(self.dev) == NVML_SUCCESS;
restored |= nvmlDeviceResetMemoryLockedClocks(self.dev) == NVML_SUCCESS;
let mut def: c_uint = 0;
if nvmlDeviceGetPowerManagementDefaultLimit(self.dev, &mut def) == NVML_SUCCESS && def > 0 {
restored |= nvmlDeviceSetPowerManagementLimit(self.dev, def) == NVML_SUCCESS;
}
restored |= nvmlDeviceSetGpcClkVfOffset(self.dev, 0) == NVML_SUCCESS;
restored |= nvmlDeviceSetMemClkVfOffset(self.dev, 0) == NVML_SUCCESS;
if restored {
log::info!("{}: restored default clocks/power", self.name());
}
}
}
}
impl Drop for NvmlTuner {
fn drop(&mut self) {
unsafe { nvmlShutdown() };
}
}
fn errstr(rc: nvmlReturn_t) -> String {
unsafe {
let p = nvmlErrorString(rc);
if p.is_null() {
format!("NVML error {rc}")
} else {
CStr::from_ptr(p).to_string_lossy().into_owned()
}
}
}
+45
View File
@@ -0,0 +1,45 @@
//! Equihash parameters for the (n=192, k=7) variant used by ZClassic and
//! several other coins.
//!
//! The relationships below follow the Zcash Equihash specification. With
//! n = 192 and k = 7 the puzzle has eight 24-bit "collision blocks", solutions
//! contain 2^k = 128 indices and serialise to 400 bytes.
/// Equihash `n` parameter (hash length in bits).
pub const N: usize = 192;
/// Equihash `k` parameter (number of collision rounds + 1 blocks).
pub const K: usize = 7;
/// Bits that must collide in each round: n / (k + 1) = 24.
pub const COLLISION_BIT_LENGTH: usize = N / (K + 1);
/// Collision length rounded up to whole bytes: 3.
pub const COLLISION_BYTE_LENGTH: usize = (COLLISION_BIT_LENGTH + 7) / 8;
/// Byte length of the expanded, byte-padded hash used by the solver: 24.
pub const HASH_LENGTH: usize = (K + 1) * COLLISION_BYTE_LENGTH;
/// How many n-bit indices a single BLAKE2b output yields: 512 / n = 2.
pub const INDICES_PER_HASH_OUTPUT: usize = 512 / N;
/// BLAKE2b digest length in bytes: (512 / n) * (n / 8) = 48.
pub const HASH_OUTPUT: usize = INDICES_PER_HASH_OUTPUT * (N / 8);
/// Raw n-bit hash length in bytes: 24.
pub const HASH_BYTES: usize = N / 8;
/// Number of indices in a full solution: 2^k = 128.
pub const SOLUTION_INDICES: usize = 1 << K;
/// Serialised solution size in bytes: (collision_bit_length + 1) * 2^k / 8 = 400.
pub const SOLUTION_BYTES: usize = (COLLISION_BIT_LENGTH + 1) * SOLUTION_INDICES / 8;
/// Number of entries generated for the first round: 2^(collision_bit_length + 1).
pub const INIT_SIZE: usize = 1 << (COLLISION_BIT_LENGTH + 1);
/// Number of BLAKE2b invocations needed to fill the first round. (Used by the
/// OpenCL/CUDA gen kernels; the CPU solver derives it implicitly.)
#[allow(dead_code)]
pub const BLAKE_CALLS: usize = INIT_SIZE / INDICES_PER_HASH_OUTPUT;
/// Bytes of the block header that feed the Equihash hash (everything before the
/// variable-length solution): version + prevhash + merkleroot + reserved +
/// time + bits + nonce.
pub const HEADER_LEN: usize = 4 + 32 + 32 + 32 + 4 + 4 + 32;
// For 192,7 the collision length is byte-aligned, so the expanded solver hash
// equals the raw n-bit hash length. The solver relies on this.
const _: () = assert!(HASH_LENGTH == HASH_BYTES);
+17
View File
@@ -0,0 +1,17 @@
//! Pearl (PRL) "pearlhash" Proof-of-Useful-Work backend (feature `pearl`).
//!
//! Native CPU port of the official open-source reference
//! (github.com/pearl-research-labs/pearl, ISC), confirmed against the whitepaper
//! and the alpha-miner GPU SASS. See `pearl-dump/SPEC.md`. GPU acceleration and
//! the Pearl stratum client build on top of this core.
pub mod merkle;
pub mod pearlhash;
pub mod stratum;
/// GPU acceleration (NVRTC int8 GEMM+transcript kernel), feature `pearl-cuda`.
#[cfg(feature = "pearl-cuda")]
pub mod gpu;
/// Approach A: drive alpha-miner's extracted cubin directly, feature `pearl-cuda`.
#[cfg(feature = "pearl-cuda")]
pub mod alpha_kernel;
+403
View File
@@ -0,0 +1,403 @@
//! Approach A: drive alpha-miner's *extracted* CUDA kernels directly.
//!
//! alpha-miner's anti-analysis (dlmopen + /proc/self/maps pointer checks) lives in
//! its **host** code; the cubin itself is plain GPU code. So we `cuModuleLoadData`
//! the extracted `alpha-miner.35.sm_120.cubin` in *our* process and call its
//! kernels — no anti-analysis involved. `headless_mine_kernel` is the fused
//! production kernel (SASS shows IMMA GEMM + `ATOMS.XOR` transcript + the BLAKE3
//! IV + an atomic winner dump), so one launch does GEMM→transcript→jackpot→dump.
//!
//! The remaining RE (done experimentally with the validated CPU oracle in
//! `pearlhash`) is the *input contract*: the 23-param ABI is mapped (see
//! `pearl-dump/INTEGRATION.md §3`), but the grid mapping, the two seed buffers,
//! where the difficulty bound lives, the dump-entry layout, and whether operands
//! are pre-noised must be pinned by feeding known inputs and matching the dump to
//! the CPU jackpot. This module is the loader/launcher foundation for that.
use std::ffi::{c_char, c_int, c_uint, c_void, CStr, CString};
use std::ptr;
use anyhow::{anyhow, Result};
// Mangled names from pearl-dump/functions.mangled.txt (sm_120 / pearl_blackwell).
const MINE_LB0: &str = "_ZN15pearl_blackwell20headless_mine_kernelILb0ELb0EN4cute5tupleIJiiiEEENS2_IJNS1_1CILi128EEENS4_ILi256EEES5_EEEaNS2_IJiNS4_ILi1EEEEEENS1_14ComposedLayoutINS1_7SwizzleILi2ELi4ELi3EEENS4_ILi0EEENS1_6LayoutINS2_IJNS2_IJNS4_ILi16EEENS4_ILi8EEEEEENS2_IJS5_S8_EEENS2_IJS8_NS4_ILi2EEEEEEEEENS2_IJNS2_IJS5_NS4_ILi2048EEEEEENS2_IJS8_SD_EEENS2_IJSD_NS4_ILi16384EEEEEEEEEEEEENS1_9TiledCopyINS1_9Copy_AtomIJNS1_25SM80_CP_ASYNC_CACHEGLOBALIN7cutlass9uint128_tESY_EEaEEENSE_INS2_IJNS2_IJSG_NS4_ILi32EEEEEESF_EEENS2_IJNS2_IJNS4_ILi512EEES8_EEES11_EEEEENS2_IJS11_S5_EEEEENSV_IJNS1_17SM75_U32x4_LDSM_NEaEEEaS9_NSA_ISC_SD_NSE_INS2_IJNS2_IJSF_SF_EEESI_SK_EEENS2_IJSN_SO_NS2_IJSD_NS4_ILi32768EEEEEEEEEEEEES19_NSV_IJNS1_17SM75_U32x2_LDSM_NEaEEENS1_8TiledMMAINS1_8MMA_AtomIJNS1_26SM80_16x8x32_S32S8S8S32_TNEEEENSE_INS2_IJSJ_NS4_ILi4EEES8_EEENS2_IJS8_SJ_SD_EEEEENS2_IJS11_S11_S11_EEEEEEEvT1_T2_PKT3_T4_T5_T6_T7_PKT8_T9_T10_T11_T12_P16HostSignalHeaderP14HostSignalSyncPKjS2G_T13_iP29PearlHeadlessJackpotDumpEntryPiPjiS2L_";
const MINE_LB1: &str = "_ZN15pearl_blackwell20headless_mine_kernelILb1ELb0EN4cute5tupleIJiiiEEENS2_IJNS1_1CILi128EEENS4_ILi256EEES5_EEEaNS2_IJiNS4_ILi1EEEEEENS1_14ComposedLayoutINS1_7SwizzleILi2ELi4ELi3EEENS4_ILi0EEENS1_6LayoutINS2_IJNS2_IJNS4_ILi16EEENS4_ILi8EEEEEENS2_IJS5_S8_EEENS2_IJS8_NS4_ILi2EEEEEEEEENS2_IJNS2_IJS5_NS4_ILi2048EEEEEENS2_IJS8_SD_EEENS2_IJSD_NS4_ILi16384EEEEEEEEEEEEENS1_9TiledCopyINS1_9Copy_AtomIJNS1_25SM80_CP_ASYNC_CACHEGLOBALIN7cutlass9uint128_tESY_EEaEEENSE_INS2_IJNS2_IJSG_NS4_ILi32EEEEEESF_EEENS2_IJNS2_IJNS4_ILi512EEES8_EEES11_EEEEENS2_IJS11_S5_EEEEENSV_IJNS1_17SM75_U32x4_LDSM_NEaEEEaS9_NSA_ISC_SD_NSE_INS2_IJNS2_IJSF_SF_EEESI_SK_EEENS2_IJSN_SO_NS2_IJSD_NS4_ILi32768EEEEEEEEEEEEES19_NSV_IJNS1_17SM75_U32x2_LDSM_NEaEEENS1_8TiledMMAINS1_8MMA_AtomIJNS1_26SM80_16x8x32_S32S8S8S32_TNEEEENSE_INS2_IJSJ_NS4_ILi4EEES8_EEENS2_IJS8_SJ_SD_EEEEENS2_IJS11_S11_S11_EEEEEEEvT1_T2_PKT3_T4_T5_T6_T7_PKT8_T9_T10_T11_T12_P16HostSignalHeaderP14HostSignalSyncPKjS2G_T13_iP29PearlHeadlessJackpotDumpEntryPiPjiS2L_";
type CUresult = c_int;
type CUdevice = c_int;
type CUcontext = *mut c_void;
type CUmodule = *mut c_void;
type CUfunction = *mut c_void;
type CUdeviceptr = u64;
const CUDA_SUCCESS: CUresult = 0;
const CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: c_int = 8;
const CU_LAUNCH_PARAM_END: usize = 0x00;
const CU_LAUNCH_PARAM_BUFFER_POINTER: usize = 0x01;
const CU_LAUNCH_PARAM_BUFFER_SIZE: usize = 0x02;
extern "C" {
fn cuInit(f: c_uint) -> CUresult;
fn cuDeviceGet(d: *mut CUdevice, o: c_int) -> CUresult;
fn cuCtxCreate_v2(c: *mut CUcontext, f: c_uint, d: CUdevice) -> CUresult;
fn cuCtxDestroy_v2(c: CUcontext) -> CUresult;
fn cuModuleLoadData(m: *mut CUmodule, image: *const c_void) -> CUresult;
fn cuModuleUnload(m: CUmodule) -> CUresult;
fn cuModuleGetFunction(f: *mut CUfunction, m: CUmodule, name: *const c_char) -> CUresult;
fn cuFuncSetAttribute(f: CUfunction, a: c_int, v: c_int) -> CUresult;
fn cuMemAlloc_v2(p: *mut CUdeviceptr, n: usize) -> CUresult;
fn cuMemFree_v2(p: CUdeviceptr) -> CUresult;
fn cuMemsetD8_v2(p: CUdeviceptr, uc: c_uint, n: usize) -> CUresult;
fn cuMemcpyHtoD_v2(dst: CUdeviceptr, src: *const c_void, n: usize) -> CUresult;
fn cuMemcpyDtoH_v2(dst: *mut c_void, src: CUdeviceptr, n: usize) -> CUresult;
fn cuLaunchKernel(f: CUfunction, gx: c_uint, gy: c_uint, gz: c_uint, bx: c_uint, by: c_uint, bz: c_uint, sh: c_uint, st: *mut c_void, params: *mut *mut c_void, extra: *mut *mut c_void) -> CUresult;
fn cuCtxSynchronize() -> CUresult;
fn cuGetErrorName(e: CUresult, s: *mut *const c_char) -> CUresult;
}
fn cu(r: CUresult, what: &str) -> Result<()> {
if r == CUDA_SUCCESS {
return Ok(());
}
let name = unsafe {
let mut p: *const c_char = ptr::null();
if cuGetErrorName(r, &mut p) == CUDA_SUCCESS && !p.is_null() {
CStr::from_ptr(p).to_string_lossy().into_owned()
} else {
format!("CUresult {r}")
}
};
Err(anyhow!("{what}: {name}"))
}
fn func(module: CUmodule, mangled: &str) -> Result<CUfunction> {
let cname = CString::new(mangled)?;
let mut f: CUfunction = ptr::null_mut();
cu(unsafe { cuModuleGetFunction(&mut f, module, cname.as_ptr()) }, "cuModuleGetFunction")?;
Ok(f)
}
/// alpha-miner's loaded kernels (in our process).
pub struct AlphaKernels {
ctx: CUcontext,
module: CUmodule,
/// `headless_mine_kernel<false,false,...>` (no jackpot dump).
pub mine_lb0: CUfunction,
/// `headless_mine_kernel<true,false,...>` (jackpot-dump enabled).
pub mine_lb1: CUfunction,
}
unsafe impl Send for AlphaKernels {}
impl AlphaKernels {
/// Load the extracted cubin (raw bytes) and resolve the mine kernels.
pub fn load(cubin: &[u8], device_index: usize) -> Result<Self> {
unsafe {
cu(cuInit(0), "cuInit")?;
let mut dev: CUdevice = 0;
cu(cuDeviceGet(&mut dev, device_index as c_int), "cuDeviceGet")?;
let mut ctx: CUcontext = ptr::null_mut();
cu(cuCtxCreate_v2(&mut ctx, 0, dev), "cuCtxCreate")?;
let mut module: CUmodule = ptr::null_mut();
cu(
cuModuleLoadData(&mut module, cubin.as_ptr() as *const c_void),
"cuModuleLoadData (alpha-miner cubin; arch must match GPU)",
)?;
let mine_lb0 = func(module, MINE_LB0)?;
let mine_lb1 = func(module, MINE_LB1)?;
Ok(Self { ctx, module, mine_lb0, mine_lb1 })
}
}
}
/// What the kernel wrote after an exploratory launch.
pub struct ExploreReport {
pub launched: bool,
pub dump_count: u32,
pub dump_head: Vec<u8>,
pub header_head: Vec<u8>,
/// (name, first 64 bytes) for every output buffer, to localize what changed.
pub buffers: Vec<(&'static str, Vec<u8>)>,
}
impl AlphaKernels {
/// Exploratory launch of `headless_mine_kernel<true,..>` on a tiny shape, to
/// reverse the input contract by inspecting what it writes. Sets the run-gate,
/// permissive header (0xFF), known operands; reads back the dump counter +
/// dump/header heads. The 23-param packed buffer follows INTEGRATION.md §3.
pub fn explore(&self, m: i32, n: i32, k: i32, _rank: i32, grid: (u32, u32, u32), smem: u32) -> Result<ExploreReport> {
unsafe {
let alloc = |bytes: usize, fill: u8| -> Result<CUdeviceptr> {
let mut p: CUdeviceptr = 0;
cu(cuMemAlloc_v2(&mut p, bytes.max(16)), "cuMemAlloc")?;
cu(cuMemsetD8_v2(p, fill as c_uint, bytes.max(16)), "cuMemset")?;
Ok(p)
};
// Over-allocate every buffer (8 MiB) so the CUTLASS kernel's vectorized
// cp.async / swizzled tile reads can't run off the end — isolates an
// out-of-bounds read (sizing) from a genuinely wrong pointer.
let big = 8usize << 20;
// PEARL_A / PEARL_B set a uniform int8 fill for A / B (default 1), to test
// whether the GEMM-derived dump fields scale with operand magnitude.
let af = std::env::var("PEARL_A").ok().and_then(|s| s.parse().ok()).unwrap_or(1u8);
let bf = std::env::var("PEARL_B").ok().and_then(|s| s.parse().ok()).unwrap_or(1u8);
let a = alloc(big, af)?; // A' int8
let b = alloc(big, bf)?; // B'ᵀ int8
// Optionally fill A/B with a VARIED int8 pattern (small magnitudes so the
// int32 GEMM stays bounded) so the transcript M is non-trivial — this
// pins the transcript field's exact offset in the dump entry. PEARL_VARIED=1.
// PEARL_VARIED: fill A and B with full-range pseudo-random int8 (two
// different LCGs) so the GEMM accumulators are effectively random and the
// per-tile XOR can't cancel — this is what real pearl operands (random
// from the commitment) look like. If M becomes non-zero, operands genuinely
// drive the transcript.
if std::env::var("PEARL_VARIED").map(|v| v == "1").unwrap_or(false) {
let mut sa: u32 = 0x1234_5678;
let mut sb: u32 = 0x9E37_79B1;
let mut pa = vec![0u8; big];
let mut pb = vec![0u8; big];
for i in 0..big {
sa = sa.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
sb = sb.wrapping_mul(1_103_515_245).wrapping_add(12_345);
pa[i] = (sa >> 24) as u8;
pb[i] = (sb >> 24) as u8;
}
cu(cuMemcpyHtoD_v2(a, pa.as_ptr() as *const c_void, big), "htod A")?;
cu(cuMemcpyHtoD_v2(b, pb.as_ptr() as *const c_void, big), "htod B")?;
}
let hdr = alloc(4096, 0xFF)?; // permissive
// HostSignalSync: [0] = first-finder CAS latch, [+4] = abort/stop flag.
// Prologue gate is `EXIT if sync[+4]==1`, so sync[+4] must be 0 (≠1) to run
// (we had this inverted — setting it to 1 forced instant exit). Zeroed.
let sync = alloc(256, 0)?;
// CONFIRMED via SASS + live dump: ord14 (c[0x3c0], PKj) = the 256-bit
// difficulty BOUND (hash≤bound wins; word-by-word MSW→LSW compare), and
// ord15 (c[0x3c8], S2G_) = the BLAKE3 KEY sA (8 words folded into the hash
// state at 0x2e00). Here both 0xFF: bound=max ⇒ every hash wins (proves the
// trigger); key=0xFF is just a placeholder for the exploratory launch.
let bound = alloc(big, 0xFF)?; // ord14
let key = alloc(big, 0xFF)?; // ord15
// PEARL_KEY=1: upload a known non-degenerate 32-byte key/commitment seed
// [0,1,..,31] so we can test whether the seed drives the transcript M
// (dumped hash would diverge from blake3(zeros, key)).
if std::env::var("PEARL_KEY").map(|v| v == "1").unwrap_or(false) {
let kb: [u8; 32] = std::array::from_fn(|i| i as u8);
cu(cuMemcpyHtoD_v2(key, kb.as_ptr() as *const c_void, 32), "htod key")?;
}
let dump = alloc(big, 0)?;
let dcount = alloc(big, 0)?;
let out20 = alloc(big, 0)?;
let out22 = alloc(big, 0)?;
// Pack the 128-byte argument buffer.
let mut arg = [0u8; 128];
let put_u32 = |a: &mut [u8], off: usize, v: u32| a[off..off + 4].copy_from_slice(&v.to_le_bytes());
let put_ptr = |a: &mut [u8], off: usize, v: u64| a[off..off + 8].copy_from_slice(&v.to_le_bytes());
put_u32(&mut arg, 0x00, m as u32);
put_u32(&mut arg, 0x04, n as u32);
put_u32(&mut arg, 0x08, k as u32);
put_ptr(&mut arg, 0x10, a);
// Stride scalars (cute Layout). PEARL_LDA/PEARL_LDB override (default k).
let envu = |name: &str, d: u32| std::env::var(name).ok().and_then(|s| s.parse().ok()).unwrap_or(d);
put_u32(&mut arg, 0x18, envu("PEARL_LDA", k as u32)); // ldA (ord3)
put_ptr(&mut arg, 0x20, b);
put_u32(&mut arg, 0x28, envu("PEARL_LDB", k as u32)); // ldB (ord8)
put_ptr(&mut arg, 0x30, hdr);
put_ptr(&mut arg, 0x38, sync);
put_ptr(&mut arg, 0x40, bound); // ord14 = 256-bit difficulty bound
put_ptr(&mut arg, 0x48, key); // ord15 = BLAKE3 key sA
put_u32(&mut arg, 0x54, envu("PEARL_O17", 1)); // ord17 = rank cadence divisor (chunk%ord17==0 folds)
put_ptr(&mut arg, 0x58, dump);
put_ptr(&mut arg, 0x60, dcount);
put_ptr(&mut arg, 0x68, out20);
put_u32(&mut arg, 0x70, envu("PEARL_O21", 1)); // ord21
put_ptr(&mut arg, 0x78, out22);
// <Lb0,Lb0> (mine_lb0) is the variant carrying the bound-compare +
// CAS first-finder latch + STG jackpot dump (SASS in /tmp/mk.sass).
// <Lb1,Lb0> (mine_lb1) is the atomic-accumulate variant (283 ATOMG.ADD)
// that updates global transcripts but never dumps. Pick via PEARL_LB1=1.
let use_lb1 = std::env::var("PEARL_LB1").map(|v| v == "1").unwrap_or(false);
let fnc = if use_lb1 { self.mine_lb1 } else { self.mine_lb0 };
let set = cuFuncSetAttribute(fnc, CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, smem as c_int);
if set != CUDA_SUCCESS {
return Ok(ExploreReport { launched: false, dump_count: 0, dump_head: vec![set as u8], header_head: vec![0xEE], buffers: vec![] });
}
let mut argsz = arg.len();
let mut extra: [*mut c_void; 5] = [
CU_LAUNCH_PARAM_BUFFER_POINTER as *mut c_void,
arg.as_ptr() as *mut c_void,
CU_LAUNCH_PARAM_BUFFER_SIZE as *mut c_void,
&mut argsz as *mut usize as *mut c_void,
CU_LAUNCH_PARAM_END as *mut c_void,
];
let lr = cuLaunchKernel(fnc, grid.0, grid.1, grid.2, 256, 1, 1, smem, ptr::null_mut(), ptr::null_mut(), extra.as_mut_ptr());
let launched = lr == CUDA_SUCCESS && cuCtxSynchronize() == CUDA_SUCCESS;
// The found-count is HostSignalSync[+4] (ord19/c[0x3e0] is unused by the
// <Lb0,Lb0> dump variant). Read sync[1] (the u32 at byte offset 4).
let mut sync_words = [0u32; 2];
cuMemcpyDtoH_v2(sync_words.as_mut_ptr() as *mut c_void, sync, 8);
let count = [sync_words[1]];
let _ = dcount;
let mut dump_head = vec![0u8; 256];
cuMemcpyDtoH_v2(dump_head.as_mut_ptr() as *mut c_void, dump, 256);
// The jackpot dump lands in ord12 (HostSignalHeader, c[0x3b0]) — the SASS
// dump-finalize block writes the PearlHeadlessJackpotDumpEntry to R52 =
// LDC.64 c[0x0][0x3b0]. Read the full ~0x2d8-byte entry.
let mut header_head = vec![0u8; 768];
cuMemcpyDtoH_v2(header_head.as_mut_ptr() as *mut c_void, hdr, 768);
// Snapshot the first 64 bytes of every output buffer to localize writes.
let snap = |p: CUdeviceptr| -> Vec<u8> {
let mut v = vec![0u8; 64];
cuMemcpyDtoH_v2(v.as_mut_ptr() as *mut c_void, p, 64);
v
};
let buffers = vec![
("sync(ord13)", snap(sync)),
("counter(ord19/Pi)", snap(dcount)),
("dump(ord18)", snap(dump)),
("ord20(Pj)", snap(out20)),
("ord22(S2L)", snap(out22)),
("hdr(ord12)", snap(hdr)),
];
for p in [a, b, hdr, sync, bound, key, dump, dcount, out20, out22] {
cuMemFree_v2(p);
}
Ok(ExploreReport { launched, dump_count: count[0], dump_head, header_head, buffers })
}
}
}
impl Drop for AlphaKernels {
fn drop(&mut self) {
unsafe {
cuModuleUnload(self.module);
cuCtxDestroy_v2(self.ctx);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
/// Proves we can load alpha-miner's extracted cubin and resolve its mining
/// kernels in our own process (no anti-analysis). Ignored — needs the cubin +
/// an sm_120 GPU. Run:
/// cargo test --no-default-features --features pearl-cuda -- --ignored --nocapture
#[test]
#[ignore]
fn loads_alpha_cubin() {
let path = "pearl-dump/cubins/alpha-miner.35.sm_120.cubin";
let cubin = match std::fs::read(path) {
Ok(c) => c,
Err(_) => { eprintln!("no {path}; skipping"); return; }
};
let k = AlphaKernels::load(&cubin, 0).expect("load+resolve alpha-miner kernels");
assert!(!k.mine_lb0.is_null() && !k.mine_lb1.is_null());
eprintln!("loaded alpha-miner cubin; resolved headless_mine_kernel<false,..> and <true,..>");
}
/// Exploratory launch — observe what the fused kernel writes (no crash =
/// param ABI structurally valid). Ignored — needs the cubin + sm_120 GPU.
#[test]
#[ignore]
fn explore_mine_kernel() {
let path = "pearl-dump/cubins/alpha-miner.35.sm_120.cubin";
let cubin = match std::fs::read(path) {
Ok(c) => c,
Err(_) => { eprintln!("no {path}; skipping"); return; }
};
// ONE launch per process — an ILLEGAL_ADDRESS fault poisons the whole CUDA
// context state, so sweep smem from bash with PEARL_SMEM env, fresh process
// each. Baked CTA tile is 128x256; smem is a multistage pipeline
// (per-stage A 0x4000 + B 0x8000 = 49152).
let smem: u32 = std::env::var("PEARL_SMEM").ok().and_then(|s| s.parse().ok()).unwrap_or(98304);
let k = AlphaKernels::load(&cubin, 0).expect("load");
match k.explore(128, 256, 128, 128, (1, 1, 1), smem) {
Ok(r) => {
eprintln!("smem={smem} launched={} dump_count={}", r.launched, r.dump_count);
if r.launched {
eprintln!(" >>> JACKPOT DUMP ENTRY (ord12/HostSignalHeader), non-zero 16B rows:");
for (i, chunk) in r.header_head.chunks(16).enumerate() {
if chunk.iter().any(|&b| b != 0) {
eprintln!(" +0x{:03x}: {:02x?}", i * 16, chunk);
}
}
for (name, bytes) in &r.buffers {
let nz = bytes.iter().any(|&b| b != 0);
eprintln!(" {name:20} {}: {:02x?}", if nz { "CHANGED" } else { "zero " }, &bytes[..16]);
}
} else {
eprintln!(" (setattr/launch failed: dump_head[0]={:#x})", r.dump_head.first().copied().unwrap_or(0));
}
}
Err(e) => eprintln!("smem={smem} error: {e}"),
}
}
/// Prove we can REPRODUCE the kernel's dumped BLAKE3 jackpot hash with our own
/// CPU blake3 — i.e. we understand the hash function + the entry's transcript
/// field. The kernel writes the 256-bit hash at entry+0x29c; we passed key
/// (ord15) = all-0xFF. So some 64-byte window of the entry is the transcript M,
/// and `blake3_keyed(M, [0xFF;32]) == hash`. Brute-force the window to locate M
/// and confirm the match. Ignored — needs the cubin + sm_120 GPU.
#[test]
#[ignore]
fn reproduce_dumped_hash() {
use crate::pearl::pearlhash::blake3_digest;
let path = "pearl-dump/cubins/alpha-miner.35.sm_120.cubin";
let cubin = match std::fs::read(path) {
Ok(c) => c,
Err(_) => { eprintln!("no {path}; skipping"); return; }
};
let smem: u32 = std::env::var("PEARL_SMEM").ok().and_then(|s| s.parse().ok()).unwrap_or(98304);
let kdim: i32 = std::env::var("PEARL_K").ok().and_then(|s| s.parse().ok()).unwrap_or(128);
let k = AlphaKernels::load(&cubin, 0).expect("load");
eprintln!("launching with K={kdim} (UR7=ceil(K/128)={} chunks; transcript mainloop runs while UR7>1)", (kdim + 127) / 128);
let r = k.explore(128, 256, kdim, 128, (1, 1, 1), smem).expect("explore");
assert!(r.launched, "kernel must launch");
let e = &r.header_head; // the dump entry (in ord12)
let hash: [u8; 32] = e[0x29c..0x29c + 32].try_into().unwrap();
eprintln!("dumped hash @+0x29c = {:02x?}", hash);
// Candidate keys: what we passed. PEARL_KEY=1 uploads [0..31] to ord15.
let key_used: [u8; 32] = if std::env::var("PEARL_KEY").map(|v| v == "1").unwrap_or(false) {
std::array::from_fn(|i| i as u8)
} else {
[0xFFu8; 32]
};
// Decisive: if the dumped hash != blake3(zeros, key_used), then M != 0, i.e.
// the seed/commitment drives the transcript (operands don't).
let zeros_hash = blake3_digest(&[0u8; 64], Some(key_used));
eprintln!("blake3(zeros, key_used) == dumped_hash ? {} (true => M is still zero)",
zeros_hash == hash);
let key_candidates: [(&str, Option<[u8; 32]>); 2] =
[("keyed[key_used]", Some(key_used)), ("unkeyed", None)];
let mut found = false;
let mut found_nonzero = false;
for (kname, key) in key_candidates {
for off in 0..=(e.len().saturating_sub(64)) {
let window = &e[off..off + 64];
if blake3_digest(window, key) == hash {
let nonzero = window.iter().any(|&b| b != 0);
if !found || nonzero {
eprintln!("MATCH: transcript M @ entry+0x{off:03x}, key={kname}, nonzero={nonzero}");
}
if nonzero {
eprintln!(" M bytes = {:02x?}", window);
found_nonzero = true;
}
found = true;
if found_nonzero { break; }
}
}
if found_nonzero { break; }
}
eprintln!("=> hash reproduced: {found}; non-degenerate transcript reached: {found_nonzero}");
assert!(found, "could not reproduce the dumped hash from any 64-byte window — \
transcript layout or key interpretation still unknown");
}
}
+2352
View File
File diff suppressed because it is too large Load Diff
+190
View File
@@ -0,0 +1,190 @@
//! Keyed-BLAKE3 Merkle tree + multi-leaf proof — port of the reference
//! `pearl-blake3` (ISC), built on the stock `blake3::hazmat` API so the tree's
//! node hashes (and root) are bit-identical to BLAKE3's own tree. Used to build
//! the `PlainProof` Merkle authentication paths for share submission.
use blake3::hazmat::{merge_subtrees_non_root, merge_subtrees_root, HasherExt, Mode};
use blake3::{Hasher, CHUNK_LEN, OUT_LEN};
use std::collections::BTreeSet;
pub type Digest = [u8; OUT_LEN]; // 32
fn chunk_cv(key: &[u8; 32], data: &[u8], idx: u64) -> Digest {
Hasher::new_keyed(key)
.set_input_offset(idx * CHUNK_LEN as u64)
.update(data)
.finalize_non_root()
}
/// Round `raw_len` up to a multiple of the BLAKE3 chunk (1024).
pub fn padded_chunk_len(raw_len: usize) -> usize {
raw_len.div_ceil(CHUNK_LEN) * CHUNK_LEN
}
/// Merge precomputed chunk chaining values (`finalize_non_root` CVs, in order)
/// into the keyed-BLAKE3 root — the same pairwise reduction as [`MerkleTree::new`],
/// but for CVs computed elsewhere (e.g. on the GPU). Requires `cvs.len() >= 2`.
pub fn root_from_cvs(mut layer: Vec<Digest>, key: &[u8; 32]) -> Digest {
let mode = Mode::KeyedHash(key);
assert!(layer.len() >= 2, "root_from_cvs needs >= 2 chunks");
while layer.len() > 2 {
layer = layer
.chunks(2)
.map(|p| if p.len() == 2 { merge_subtrees_non_root(&p[0], &p[1], mode) } else { p[0] })
.collect();
}
*merge_subtrees_root(&layer[0], &layer[1], mode).as_bytes()
}
pub fn pad_to_chunk_boundary(data: &[u8]) -> Vec<u8> {
let mut v = data.to_vec();
v.resize(padded_chunk_len(v.len()), 0);
v
}
/// Keyed-BLAKE3 Merkle tree over 1024-byte leaves.
pub struct MerkleTree {
layers: Vec<Vec<Digest>>,
data: Vec<u8>,
key: [u8; 32],
}
impl MerkleTree {
pub fn new(data: &[u8], key: [u8; 32]) -> Self {
let mode = Mode::KeyedHash(&key);
if data.is_empty() {
return Self { layers: vec![vec![]], data: vec![], key };
}
if data.len() <= CHUNK_LEN {
let root = *blake3::keyed_hash(&key, data).as_bytes();
return Self { layers: vec![vec![root]], data: data.to_vec(), key };
}
let n = data.len().div_ceil(CHUNK_LEN);
let cvs: Vec<Digest> = (0..n)
.map(|i| {
let s = i * CHUNK_LEN;
let e = (s + CHUNK_LEN).min(data.len());
chunk_cv(&key, &data[s..e], i as u64)
})
.collect();
let mut layers = vec![cvs];
while layers.last().unwrap().len() > 2 {
let prev = layers.last().unwrap();
let next: Vec<Digest> = prev
.chunks(2)
.map(|p| if p.len() == 2 { merge_subtrees_non_root(&p[0], &p[1], mode) } else { p[0] })
.collect();
layers.push(next);
}
let last = layers.last().unwrap();
if last.len() == 2 {
let root = *merge_subtrees_root(&last[0], &last[1], mode).as_bytes();
layers.push(vec![root]);
}
Self { layers, data: data.to_vec(), key }
}
pub fn root(&self) -> Digest {
self.layers.last().map(|l| l[0]).unwrap_or([0u8; OUT_LEN])
}
pub fn num_leaves(&self) -> usize {
self.layers[0].len()
}
/// Leaf indices (1024-byte chunks) needed to authenticate the given matrix rows.
pub fn compute_leaf_indices_from_rows(row_indices: &[usize], shape: (usize, usize)) -> Vec<usize> {
let cols = shape.1;
let mut idx = BTreeSet::new();
for &row in row_indices {
let first = (row * cols) / CHUNK_LEN;
let last = ((row + 1) * cols - 1) / CHUNK_LEN;
for i in first..=last {
idx.insert(i);
}
}
idx.into_iter().collect()
}
pub fn get_multileaf_proof(&self, leaf_indices: &[usize]) -> MerkleProof {
assert!(!leaf_indices.is_empty());
let unique: BTreeSet<usize> = leaf_indices.iter().copied().collect();
let total_leaves = self.num_leaves();
assert!(*unique.last().unwrap() < total_leaves, "leaf index out of bounds");
let sorted: Vec<usize> = unique.iter().copied().collect();
let leaf_data: Vec<[u8; CHUNK_LEN]> = sorted
.iter()
.map(|&i| {
let s = i * CHUNK_LEN;
let e = (s + CHUNK_LEN).min(self.data.len());
let mut c = [0u8; CHUNK_LEN];
c[..e - s].copy_from_slice(&self.data[s..e]);
c
})
.collect();
let mut siblings = Vec::new();
let mut cur = unique;
let mut level_len = total_leaves;
let mut level = 0;
while level_len > 1 && !cur.is_empty() {
let nodes = &self.layers[level];
for &i in &cur {
if i % 2 == 1 {
if !cur.contains(&(i - 1)) {
siblings.push(nodes[i - 1]);
}
} else if !cur.contains(&(i + 1)) && (i + 1) < level_len {
siblings.push(nodes[i + 1]);
}
}
cur = cur.iter().map(|&i| i / 2).collect();
level_len = level_len.div_ceil(2);
level += 1;
}
MerkleProof { leaf_data, leaf_indices: sorted, total_leaves, root: self.root(), siblings }
}
#[cfg(test)]
fn key_used(&self) -> [u8; 32] {
self.key
}
}
/// Multi-leaf Merkle proof. `leaf_data` are the raw 1024-byte chunks; `siblings`
/// the authentication path.
#[derive(Clone)]
pub struct MerkleProof {
pub leaf_data: Vec<[u8; CHUNK_LEN]>,
pub leaf_indices: Vec<usize>,
pub total_leaves: usize,
pub root: Digest,
pub siblings: Vec<Digest>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn root_equals_keyed_blake3() {
let key = [99u8; 32];
for len in [500usize, 1024, 1500, 4096, 5000] {
let data: Vec<u8> = (0..len).map(|i| (i % 251) as u8).collect();
let padded = pad_to_chunk_boundary(&data);
let tree = MerkleTree::new(&padded, key);
assert_eq!(tree.root(), *blake3::keyed_hash(&key, &padded).as_bytes(), "len {len}");
assert_eq!(tree.key_used(), key);
}
}
#[test]
fn multileaf_proof_collects_siblings() {
let key = [7u8; 32];
let data: Vec<u8> = (0..8 * CHUNK_LEN).map(|i| (i % 251) as u8).collect();
let tree = MerkleTree::new(&data, key);
let proof = tree.get_multileaf_proof(&[0, 3]);
assert_eq!(proof.total_leaves, 8);
assert_eq!(proof.leaf_indices, vec![0, 3]);
assert!(!proof.siblings.is_empty());
assert_eq!(proof.root, tree.root());
}
}
+844
View File
@@ -0,0 +1,844 @@
//! pearlhash / Pearl (PRL) Proof-of-Useful-Work — native CPU implementation.
//!
//! A faithful port of the official reference (github.com/pearl-research-labs/pearl,
//! ISC license): `zk-pow/src/ffi/mine.rs` + `circuit/pearl_noise.rs` +
//! `api/proof{,_utils}.rs`, using the stock `blake3` crate. Confirmed against the
//! whitepaper (pearlresearch.ai) and the alpha-miner GPU SASS we dumped — see
//! `pearl-dump/SPEC.md`.
//!
//! Pipeline: keyed-BLAKE3 commitment → low-rank int8 noise (A=A+E, B=B+F) →
//! tiled int8·int8→int32 matmul → 16×u32 transcript `M[%16]=(M⋘13)⊕X` →
//! win when `BLAKE3(M, key=sA) ≤ difficulty·h·w·k`.
use primitive_types::U256;
use rand::Rng;
use super::merkle::{MerkleProof, MerkleTree};
// ---- constants (from pearl_program.rs / pearl_noise.rs) ----
pub const JACKPOT_SIZE: usize = 16;
pub const LROT_PER_TILE: u32 = 13;
const BLAKE3_DIGEST_SIZE: usize = 32;
const CHUNK_LEN: usize = 1024; // blake3 chunk
const SIGNAL_MIN: i8 = -64;
const SIGNAL_MAX: i8 = 64;
const NOISE_RANGE: usize = 128;
const IDXS_PER_COL: usize = 2;
const UNIFORM_NOISE_RANGE: usize = NOISE_RANGE / IDXS_PER_COL; // 64
const ZERO_POINT_TRANSLATION: i8 = (UNIFORM_NOISE_RANGE / 2) as i8; // 32
const RANGE_MASK: u8 = (UNIFORM_NOISE_RANGE - 1) as u8; // 63
const fn padded_label(label: [u8; 8]) -> [u8; 32] {
let mut r = [0u8; 32];
let mut i = 0;
while i < 8 {
r[i] = label[i];
i += 1;
}
r
}
/// BLAKE3 `seed` label for the A-side noise PRNG (goes in message bytes 32..64).
pub const SEED_LABEL_A: [u8; 32] = padded_label(*b"A_tensor");
/// BLAKE3 `seed` label for the B-side noise PRNG.
pub const SEED_LABEL_B: [u8; 32] = padded_label(*b"B_tensor");
/// Keyed (or unkeyed) BLAKE3, matching the reference `blake3_digest`.
pub fn blake3_digest(data: &[u8], key: Option<[u8; 32]>) -> [u8; 32] {
let mut h = match key {
Some(k) => blake3::Hasher::new_keyed(&k),
None => blake3::Hasher::new(),
};
h.update(data);
*h.finalize().as_bytes()
}
fn pad_to_chunk_boundary(data: &[u8]) -> Vec<u8> {
let mut v = data.to_vec();
let rem = v.len() % CHUNK_LEN;
if rem != 0 {
v.resize(v.len() + (CHUNK_LEN - rem), 0);
}
v
}
// ---- block header + mining configuration (wire-exact serialization) ----
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MMAType {
Int7xInt7ToInt32 = 0,
}
#[derive(Clone, Copy, Debug)]
pub struct IncompleteBlockHeader {
pub version: u32,
pub prev_block: [u8; 32],
pub merkle_root: [u8; 32],
pub timestamp: u32,
pub nbits: u32,
}
impl IncompleteBlockHeader {
pub const SERIALIZED_SIZE: usize = 76;
/// Parse the 76-byte serialized header (e.g. the `mining.notify` header hex).
/// Inverse of [`to_bytes`](Self::to_bytes).
pub fn from_bytes(d: &[u8]) -> Option<Self> {
if d.len() < 76 {
return None;
}
let mut prev_block: [u8; 32] = d[4..36].try_into().ok()?;
prev_block.reverse();
let mut merkle_root: [u8; 32] = d[36..68].try_into().ok()?;
merkle_root.reverse();
Some(Self {
version: u32::from_le_bytes(d[0..4].try_into().ok()?),
prev_block,
merkle_root,
timestamp: u32::from_le_bytes(d[68..72].try_into().ok()?),
nbits: u32::from_le_bytes(d[72..76].try_into().ok()?),
})
}
/// version LE | prev_block reversed | merkle_root reversed | timestamp LE | nbits LE
pub fn to_bytes(&self) -> [u8; 76] {
let mut b = Vec::with_capacity(76);
b.extend_from_slice(&self.version.to_le_bytes());
b.extend(self.prev_block.iter().rev().copied());
b.extend(self.merkle_root.iter().rev().copied());
b.extend_from_slice(&self.timestamp.to_le_bytes());
b.extend_from_slice(&self.nbits.to_le_bytes());
b.try_into().unwrap()
}
}
/// 3-dimensional periodic partition of matrix rows/cols (the "thread pattern").
#[derive(Clone, Copy, Debug)]
pub struct PeriodicPattern {
pub shape: [(u32, u32); 3], // (stride, length) per dim
}
impl PeriodicPattern {
pub const NUM_DIMS: usize = 3;
/// Size-1 pattern ({0}) — one row/col per tile.
pub fn single() -> Self {
Self { shape: [(1, 1); 3] }
}
pub fn to_list(&self) -> Vec<u32> {
let mut res = vec![0u32];
for &(stride, length) in &self.shape {
let mut next = Vec::with_capacity(res.len() * length as usize);
for i in 0..length {
for &r in &res {
next.push(r + i * stride);
}
}
res = next;
}
res
}
pub fn offset_is_valid(&self, mut offset: u32) -> bool {
for &(stride, length) in self.shape.iter().rev() {
offset %= stride * length;
if offset >= stride {
return false;
}
}
true
}
pub fn period(&self) -> u32 {
let &(stride, length) = self.shape.last().unwrap();
stride * length
}
pub fn size(&self) -> u32 {
self.shape.iter().map(|&(_, l)| l).product()
}
/// 6-byte serialization: per dim (factor-1, length-1).
pub fn to_bytes(&self) -> [u8; 6] {
let mut d = [0u8; 6];
let mut min_stride = 1u32;
for (i, &(stride, length)) in self.shape.iter().enumerate() {
let factor = stride / min_stride;
d[2 * i] = (factor - 1) as u8;
d[2 * i + 1] = (length - 1) as u8;
min_stride = stride * length;
}
d
}
/// Inverse of [`to_bytes`](Self::to_bytes): reconstruct shape from 6 bytes.
pub fn from_bytes(d: &[u8; 6]) -> Self {
let mut shape = [(0u32, 0u32); 3];
let mut min_stride = 1u32;
for i in 0..3 {
let factor = d[2 * i] as u32 + 1;
let length = d[2 * i + 1] as u32 + 1;
let stride = factor * min_stride;
shape[i] = (stride, length);
min_stride = stride * length;
}
Self { shape }
}
/// Build a pattern from a sorted index list starting at 0 (port of the
/// reference `PeriodicPattern::from_list`). Returns None if not periodic.
pub fn from_list(pattern: &[u32]) -> Option<Self> {
if pattern.is_empty() || pattern[0] != 0 || !pattern.windows(2).all(|w| w[0] < w[1]) {
return None;
}
let mut p = pattern.to_vec();
let mut shape_vec: Vec<(u32, u32)> = Vec::new();
while p.len() > 1 {
let mut found = false;
for period in 1..p.len() {
if p.len() % period == 0 {
let s = p[period];
if (0..p.len() - period).all(|i| p[i] + s == p[i + period]) {
shape_vec.push((s, (p.len() / period) as u32));
p.truncate(period);
found = true;
break;
}
}
}
found.then_some(())?;
}
shape_vec.reverse();
let period = shape_vec.last().map_or(1, |&(s, l)| s * l);
while shape_vec.len() < 3 {
shape_vec.push((period, 1));
}
Some(Self { shape: shape_vec.try_into().ok()? })
}
}
#[derive(Clone, Copy, Debug)]
pub struct MiningConfiguration {
pub common_dim: u32, // k
pub rank: u16, // r
pub mma_type: MMAType,
pub rows_pattern: PeriodicPattern,
pub cols_pattern: PeriodicPattern,
pub reserved: [u8; 32],
}
impl MiningConfiguration {
pub const SERIALIZED_SIZE: usize = 52;
pub fn to_bytes(&self) -> [u8; 52] {
let mut b = Vec::with_capacity(52);
b.extend_from_slice(&self.common_dim.to_le_bytes());
b.extend_from_slice(&self.rank.to_le_bytes());
b.extend_from_slice(&(self.mma_type as u16).to_le_bytes());
b.extend_from_slice(&self.rows_pattern.to_bytes());
b.extend_from_slice(&self.cols_pattern.to_bytes());
b.extend_from_slice(&self.reserved);
b.try_into().unwrap()
}
pub fn dot_product_length(&self) -> usize {
let k = self.common_dim as usize;
let r = self.rank as usize;
k - k % r
}
}
// ---- commitment + difficulty ----
fn compute_job_key(header: &IncompleteBlockHeader, config: &MiningConfiguration) -> [u8; 32] {
let mut d = Vec::with_capacity(128);
d.extend_from_slice(&header.to_bytes());
d.extend_from_slice(&config.to_bytes());
blake3_digest(&d, None)
}
/// Returns (b_noise_seed = sB, a_noise_seed = sA).
fn compute_commitment_hash(job_key: &[u8; 32], a_row_major: &[u8], b_col_major: &[u8]) -> ([u8; 32], [u8; 32]) {
let hash_a = blake3_digest(a_row_major, Some(*job_key));
let hash_b = blake3_digest(b_col_major, Some(*job_key));
let mut bi = [0u8; 64];
bi[..32].copy_from_slice(job_key);
bi[32..].copy_from_slice(&hash_b);
let b_noise_seed = blake3_digest(&bi, None);
let mut ai = [0u8; 64];
ai[..32].copy_from_slice(&b_noise_seed);
ai[32..].copy_from_slice(&hash_a);
let a_noise_seed = blake3_digest(&ai, None);
(b_noise_seed, a_noise_seed)
}
pub fn compute_jackpot_hash(jackpot: &[u32; 16], commitment_hash: [u8; 32]) -> [u8; 32] {
let msg: [u8; 64] = std::array::from_fn(|i| jackpot[i / 4].to_le_bytes()[i % 4]);
blake3_digest(&msg, Some(commitment_hash))
}
/// Bitcoin-style compact target decode.
pub fn nbits_to_difficulty(nbits: u32) -> U256 {
let exponent = (nbits >> 24) as usize;
let mantissa = nbits & 0x00ff_ffff;
if mantissa == 0 || exponent == 0 || mantissa & 0x0080_0000 != 0 {
return U256::zero();
}
let mut t = U256::from(mantissa);
if exponent <= 3 {
t >>= 8 * (3 - exponent);
} else {
t <<= 8 * (exponent - 3);
}
t
}
/// Pool **share** acceptance bound for stratum difficulty `D`: a candidate tile
/// is a valid share iff `jackpot_hash (LE u256) <= share_bound(D, h, w, k)`.
///
/// Derived empirically by recomputing 5 accepted prl.kryptex.network shares
/// (all at `mining.set_difficulty 30`): they satisfy
/// `hash <= 2^256 / (D · h·w·k · C)` with `C ≈ 32` — the `∝ 1/(D·h·w·k)` form
/// matches the reference block bound, and the weakest accepted share is within
/// ~1% of the `C=32` threshold. We use `C=32` (slightly strict) so every share
/// we submit clears the pool's threshold; re-derive `C` if a new config rejects.
pub fn share_bound(difficulty: u64, h: usize, w: usize, k: usize) -> U256 {
let denom = U256::from(difficulty) * U256::from(h * w * k) * U256::from(32u64);
if denom.is_zero() { U256::MAX } else { U256::MAX / denom }
}
/// Block-level acceptance bound (full network difficulty from `nbits`):
/// `hash <= nbits_to_difficulty(nbits) · h·w·k`. Pool mining uses [`share_bound`].
pub fn extract_difficulty_bound(nbits: u32, config: &MiningConfiguration) -> U256 {
let diff = nbits_to_difficulty(nbits);
let h = config.rows_pattern.size() as usize;
let w = config.cols_pattern.size() as usize;
let factor = U256::from(h * w * config.dot_product_length());
if factor.is_zero() || diff > U256::MAX / factor {
U256::MAX
} else {
diff * factor
}
}
// ---- noise generation (port of pearl_noise.rs) ----
fn get_random_hash(index: usize, seed: &[u8; 32], key: &[u8; 32], prepend_index: usize) -> [u8; 32] {
let mut m = [0u8; 64];
let v = (1 + index) as i32;
m[prepend_index * 4..prepend_index * 4 + 4].copy_from_slice(&v.to_le_bytes());
m[32..64].copy_from_slice(seed);
blake3_digest(&m, Some(*key))
}
fn generate_uniform_random_matrix(seed: &[u8; 32], key: &[u8; 32], row_indices: &[usize], num_cols: usize) -> Vec<Vec<i8>> {
row_indices
.iter()
.map(|&row| {
let start = row * num_cols;
(start / BLAKE3_DIGEST_SIZE..(start + num_cols).div_ceil(BLAKE3_DIGEST_SIZE))
.flat_map(|block| {
get_random_hash(block, seed, key, 0).into_iter().enumerate().filter_map(move |(k, byte)| {
let idx = block * BLAKE3_DIGEST_SIZE + k;
(idx >= start && idx < start + num_cols).then(|| (byte & RANGE_MASK) as i8 - ZERO_POINT_TRANSLATION)
})
})
.collect()
})
.collect()
}
fn mul_hi_u32(a: u32, b: u32) -> u32 {
((a as u64 * b as u64) >> 32) as u32
}
fn generate_permutation_matrix(seed: &[u8; 32], key: &[u8; 32], k: usize, noise_rank: usize) -> Vec<[u32; 2]> {
const LINES_PER_HASH: usize = BLAKE3_DIGEST_SIZE / 4;
let rank_mask = (noise_rank - 1) as u32;
let mut res = vec![[0u32; 2]; k];
for (i, chunk) in res.chunks_mut(LINES_PER_HASH).enumerate() {
let rh = get_random_hash(i, seed, key, 1);
for (j, slot) in chunk.iter_mut().enumerate() {
let r = u32::from_le_bytes([rh[j * 4], rh[j * 4 + 1], rh[j * 4 + 2], rh[j * 4 + 3]]);
let first = r & rank_mask;
let second = first ^ (1 + mul_hi_u32((noise_rank - 1) as u32, r));
*slot = [first, second];
}
}
res
}
fn matvec_sparse_perm(perm: &[[u32; 2]], vec: &[i8]) -> Vec<i8> {
perm.iter()
.map(|&[a, b]| (vec[a as usize] as i32 - vec[b as usize] as i32) as i8)
.collect()
}
struct Noise {
a: Vec<Vec<i8>>, // m×k (selected rows)
b: Vec<Vec<i8>>, // n×k (selected cols of Bᵀ)
}
fn compute_noise_for_indices(
k: usize,
noise_rank: usize,
(b_noise_seed, a_noise_seed): ([u8; 32], [u8; 32]),
a_rows: &[usize],
b_cols: &[usize],
) -> Noise {
let e_al = generate_uniform_random_matrix(&SEED_LABEL_A, &a_noise_seed, a_rows, noise_rank);
let e_ar_t = generate_permutation_matrix(&SEED_LABEL_A, &a_noise_seed, k, noise_rank);
let e_bl = generate_permutation_matrix(&SEED_LABEL_B, &b_noise_seed, k, noise_rank);
let e_br_t = generate_uniform_random_matrix(&SEED_LABEL_B, &b_noise_seed, b_cols, noise_rank);
Noise {
a: e_al.iter().map(|row| matvec_sparse_perm(&e_ar_t, row)).collect(),
b: e_br_t.iter().map(|col| matvec_sparse_perm(&e_bl, col)).collect(),
}
}
// ---- mining ----
fn flatten(matrix: &[Vec<i8>]) -> Vec<u8> {
matrix.iter().flatten().map(|&x| x as u8).collect()
}
pub fn threads_partition(pattern: &PeriodicPattern, total: usize) -> Vec<Vec<usize>> {
let period = pattern.period() as usize;
assert!(total % period == 0, "dimension must be divisible by pattern period");
let base: Vec<usize> = pattern.to_list().iter().map(|&i| i as usize).collect();
(0..total)
.filter(|&i| pattern.offset_is_valid(i as u32))
.map(|off| base.iter().map(|&d| off + d).collect())
.collect()
}
/// A winning tile: the matrices + the row/col indices that open it. Enough to
/// rebuild the Merkle proof for submission (TODO: proof serialization).
pub struct Solution {
pub m: usize,
pub n: usize,
pub k: usize,
pub rank: usize,
pub a: Vec<Vec<i8>>,
pub bt: Vec<Vec<i8>>, // Bᵀ
pub a_rows: Vec<usize>,
pub b_cols: Vec<usize>,
pub jackpot_hash: [u8; 32],
}
/// Noised int8 operands for one mining attempt, shared by the CPU and GPU
/// miners so they cannot drift. `A = A + E` and `B′ᵀ = (B + F)ᵀ` both fit int8
/// (A,B∈[-64,64], noise∈[-63,62] ⇒ [-127,126]), stored row-major and flat.
pub struct AttemptOperands {
pub a_noised: Vec<i8>, // m×k row-major, A = A + E
pub bt_noised: Vec<i8>, // n×k row-major, B′ᵀ = (B + F)ᵀ
pub a_noise_seed: [u8; 32], // sA — the keyed-BLAKE3 jackpot-hash key
}
/// Commitment + noise for an attempt over random `a` (m×k) and `bt` (n×k = Bᵀ),
/// producing the flat int8 noised operands and the jackpot key. This is the work
/// every tile sweep (CPU or GPU) shares; the per-tile GEMM is [`tile_jackpot`].
pub fn prepare_attempt(header: &IncompleteBlockHeader, config: &MiningConfiguration, a: &[Vec<i8>], bt: &[Vec<i8>]) -> AttemptOperands {
let m = a.len();
let n = bt.len();
let k = config.common_dim as usize;
let rank = config.rank as usize;
let job_key = compute_job_key(header, config);
let a_rm = pad_to_chunk_boundary(&flatten(a));
let b_cm = pad_to_chunk_boundary(&flatten(bt));
let seeds = compute_commitment_hash(&job_key, &a_rm, &b_cm);
let a_noise_seed = seeds.1;
let noise = compute_noise_for_indices(k, rank, seeds, &(0..m).collect::<Vec<_>>(), &(0..n).collect::<Vec<_>>());
let mut a_noised = vec![0i8; m * k];
for (row, (ar, nr)) in a.iter().zip(&noise.a).enumerate() {
for (l, (&x, &e)) in ar.iter().zip(nr).enumerate() {
a_noised[row * k + l] = (x as i32 + e as i32) as i8;
}
}
// noise.b is indexed [col][l] (per selected column of Bᵀ).
let mut bt_noised = vec![0i8; n * k];
for (col, (bc, nc)) in bt.iter().zip(&noise.b).enumerate() {
for (l, (&x, &e)) in bc.iter().zip(nc).enumerate() {
bt_noised[col * k + l] = (x as i32 + e as i32) as i8;
}
}
AttemptOperands { a_noised, bt_noised, a_noise_seed }
}
/// The job key = `BLAKE3(header‖config)` (no key). Drives the commitment.
pub fn job_key(header: &IncompleteBlockHeader, config: &MiningConfiguration) -> [u8; 32] {
compute_job_key(header, config)
}
/// Derive `(b_noise_seed, a_noise_seed)` from the job key and the two matrix
/// commitments `HA`/`HB` (e.g. computed on the GPU). Same as the seed-mixing
/// inside [`attempt_seeds`], but for externally-computed `HA`/`HB`.
pub fn seeds_from_commitment(job_key: &[u8; 32], hash_a: [u8; 32], hash_b: [u8; 32]) -> ([u8; 32], [u8; 32]) {
let mut bi = [0u8; 64];
bi[..32].copy_from_slice(job_key);
bi[32..].copy_from_slice(&hash_b);
let b_noise_seed = blake3_digest(&bi, None);
let mut ai = [0u8; 64];
ai[..32].copy_from_slice(&b_noise_seed);
ai[32..].copy_from_slice(&hash_a);
let a_noise_seed = blake3_digest(&ai, None);
(b_noise_seed, a_noise_seed)
}
/// Commitment seeds for an attempt, without computing the noise: returns
/// `(b_noise_seed, a_noise_seed)` (= sB, sA). `a_noise_seed` is also the jackpot
/// hash key. Used by the GPU noise path, which generates A/B′ᵀ on-device from
/// these seeds. The CPU [`prepare_attempt`] computes the same seeds internally.
pub fn attempt_seeds(header: &IncompleteBlockHeader, config: &MiningConfiguration, a: &[Vec<i8>], bt: &[Vec<i8>]) -> ([u8; 32], [u8; 32]) {
let job_key = compute_job_key(header, config);
let a_rm = pad_to_chunk_boundary(&flatten(a));
let b_cm = pad_to_chunk_boundary(&flatten(bt));
compute_commitment_hash(&job_key, &a_rm, &b_cm)
}
/// Cumulative tiled int8 GEMM + transcript fold for one tile, over the flat
/// noised operands from [`prepare_attempt`]. `Cblk` accumulates across rank
/// chunks; each chunk XOR-reduces the tile and folds it into the 16×u32
/// transcript `M[chunk%16] = (M⋘13) ⊕ X`. Matches the GPU `pearl_tile_dp4a`.
pub fn tile_jackpot(a_noised: &[i8], bt_noised: &[i8], a_rows: &[usize], b_cols: &[usize], k: usize, rank: usize) -> [u32; 16] {
let (th, tw) = (a_rows.len(), b_cols.len());
let mut tile = vec![0i32; th * tw];
let mut jackpot = [0u32; 16];
let mut chunk = 0usize;
let mut ll = rank;
while ll <= k {
for (u, &ai) in a_rows.iter().enumerate() {
for (v, &bi) in b_cols.iter().enumerate() {
let mut s = tile[u * tw + v];
for l in ll - rank..ll {
s += a_noised[ai * k + l] as i32 * bt_noised[bi * k + l] as i32;
}
tile[u * tw + v] = s;
}
}
let xored = tile.iter().fold(0u32, |acc, &x| acc ^ x as u32);
jackpot[chunk % JACKPOT_SIZE] = jackpot[chunk % JACKPOT_SIZE].rotate_left(LROT_PER_TILE) ^ xored;
chunk += 1;
ll += rank;
}
jackpot
}
/// One mining attempt over random A,B. Returns a solution if any tile opens.
pub fn try_mine_one<R: Rng>(
rng: &mut R,
m: usize,
n: usize,
k: usize,
header: &IncompleteBlockHeader,
config: &MiningConfiguration,
bound: U256,
) -> Option<Solution> {
let rank = config.rank as usize;
let a: Vec<Vec<i8>> = (0..m).map(|_| (0..k).map(|_| rng.random_range(SIGNAL_MIN..=SIGNAL_MAX)).collect()).collect();
let b: Vec<Vec<i8>> = (0..k).map(|_| (0..n).map(|_| rng.random_range(SIGNAL_MIN..=SIGNAL_MAX)).collect()).collect();
let bt: Vec<Vec<i8>> = (0..n).map(|i| (0..k).map(|j| b[j][i]).collect()).collect();
let op = prepare_attempt(header, config, &a, &bt);
for a_rows in threads_partition(&config.rows_pattern, m) {
for b_cols in threads_partition(&config.cols_pattern, n) {
let jackpot = tile_jackpot(&op.a_noised, &op.bt_noised, &a_rows, &b_cols, k, rank);
let jackpot_hash = compute_jackpot_hash(&jackpot, op.a_noise_seed);
if U256::from_little_endian(&jackpot_hash) <= bound {
return Some(Solution { m, n, k, rank, a, bt, a_rows, b_cols, jackpot_hash });
}
}
}
None
}
/// Recompute a solution's jackpot hash and check it meets target — the CPU
/// share verifier (gate before submit). Self-consistent with the miner.
pub fn verify(header: &IncompleteBlockHeader, config: &MiningConfiguration, sol: &Solution, bound: U256) -> bool {
let (_m, n, k, rank) = (sol.m, sol.n, sol.k, sol.rank);
let job_key = compute_job_key(header, config);
let a_rm = pad_to_chunk_boundary(&flatten(&sol.a));
let b_cm = pad_to_chunk_boundary(&flatten(&sol.bt));
let seeds = compute_commitment_hash(&job_key, &a_rm, &b_cm);
let a_noise_seed = seeds.1;
let noise = compute_noise_for_indices(k, rank, seeds, &sol.a_rows, &sol.b_cols);
let mut jackpot = [0u32; 16];
let mut tile = vec![vec![0i32; sol.b_cols.len()]; sol.a_rows.len()];
for (li, ll) in (rank..=k).step_by(rank).enumerate() {
for (u, _ai) in sol.a_rows.iter().enumerate() {
for (v, _bi) in sol.b_cols.iter().enumerate() {
for l in ll - rank..ll {
// A = A + E (noise rows are indexed 0..rows for the selected set)
let a_v = sol.a[sol.a_rows[u]][l] as i32 + noise.a[u][l] as i32;
let b_v = sol.bt[sol.b_cols[v]][l] as i32 + noise.b[v][l] as i32;
tile[u][v] += a_v * b_v;
}
}
}
let xored = tile.iter().flatten().fold(0u32, |acc, &x| acc ^ x as u32);
let tid = li % JACKPOT_SIZE;
jackpot[tid] = jackpot[tid].rotate_left(LROT_PER_TILE) ^ xored;
}
let jh = compute_jackpot_hash(&jackpot, a_noise_seed);
let _ = n;
jh == sol.jackpot_hash && U256::from_little_endian(&jh) <= bound
}
// ---- submission proof (Merkle authentication of the used A-rows / B-cols) ----
/// Merkle proof for one matrix + which rows it authenticates.
pub struct MatrixMerkleProof {
pub proof: MerkleProof,
pub row_indices: Vec<usize>,
}
/// The block-opening proof submitted to the pool (pre-ZK "PlainProof").
pub struct PlainProof {
pub m: usize,
pub n: usize,
pub k: usize,
pub noise_rank: usize,
pub a: MatrixMerkleProof,
pub bt: MatrixMerkleProof,
}
/// Build a matrix's Merkle proof for `row_indices` (port of reference
/// `build_matrix_proof`). The tree root equals `blake3(padded, key=job_key)`,
/// i.e. the commitment HA/HB.
fn build_matrix_proof(matrix: &[Vec<i8>], job_key: &[u8; 32], row_indices: &[usize], num_cols: usize) -> MatrixMerkleProof {
let padded = super::merkle::pad_to_chunk_boundary(&flatten(matrix));
let tree = MerkleTree::new(&padded, *job_key);
let leaf_indices = MerkleTree::compute_leaf_indices_from_rows(row_indices, (matrix.len(), num_cols));
MatrixMerkleProof {
proof: tree.get_multileaf_proof(&leaf_indices),
row_indices: row_indices.to_vec(),
}
}
/// Assemble the submittable proof for a found [`Solution`].
pub fn build_proof(header: &IncompleteBlockHeader, config: &MiningConfiguration, sol: &Solution) -> PlainProof {
let job_key = compute_job_key(header, config);
PlainProof {
m: sol.m,
n: sol.n,
k: sol.k,
noise_rank: sol.rank,
a: build_matrix_proof(&sol.a, &job_key, &sol.a_rows, sol.k),
bt: build_matrix_proof(&sol.bt, &job_key, &sol.b_cols, sol.k),
}
}
/// Wire encoding of the proof = `bincode(PlainProof)`, matching the reference
/// exactly (the pool accepts `base64(this)`; confirmed from the live capture —
/// `mining.submit [addr, job_id, base64(proof)]`, `share_format:"base64"`).
///
/// bincode layout (little-endian fixint, `usize→u64`, `Vec→u64 count+elems`):
/// PlainProof { m, n, k, noise_rank, a, bt }
/// MatrixMerkleProof { proof, row_indices: Vec<u64> }
/// MerkleProof { leaf_data, leaf_indices, total_leaves, root[32], siblings }
/// leaf_data (serde_chunk_vec = `Vec<&[u8]>`): count, then per leaf `len(1024)+bytes`.
pub fn encode_proof(p: &PlainProof) -> Vec<u8> {
let mut out = Vec::new();
let mut u64 = |o: &mut Vec<u8>, v: usize| o.extend_from_slice(&(v as u64).to_le_bytes());
u64(&mut out, p.m);
u64(&mut out, p.n);
u64(&mut out, p.k);
u64(&mut out, p.noise_rank);
for mp in [&p.a, &p.bt] {
// MerkleProof.leaf_data : Vec<&[u8]> (count, then per-leaf len + bytes)
u64(&mut out, mp.proof.leaf_data.len());
for leaf in &mp.proof.leaf_data {
u64(&mut out, leaf.len()); // 1024
out.extend_from_slice(leaf);
}
// leaf_indices : Vec<u64>
u64(&mut out, mp.proof.leaf_indices.len());
for &li in &mp.proof.leaf_indices {
u64(&mut out, li);
}
// total_leaves : u64
u64(&mut out, mp.proof.total_leaves);
// root : [u8;32]
out.extend_from_slice(&mp.proof.root);
// siblings : Vec<[u8;32]>
u64(&mut out, mp.proof.siblings.len());
for sib in &mp.proof.siblings {
out.extend_from_slice(sib);
}
// MatrixMerkleProof.row_indices : Vec<u64>
u64(&mut out, mp.row_indices.len());
for &r in &mp.row_indices {
u64(&mut out, r);
}
}
out
}
#[cfg(test)]
mod tests {
use super::*;
fn easy_config(k: u32, rank: u16) -> MiningConfiguration {
MiningConfiguration {
common_dim: k,
rank,
mma_type: MMAType::Int7xInt7ToInt32,
rows_pattern: PeriodicPattern::single(),
cols_pattern: PeriodicPattern::single(),
reserved: [0u8; 32],
}
}
#[test]
fn serialization_sizes() {
let h = IncompleteBlockHeader { version: 1, prev_block: [3; 32], merkle_root: [4; 32], timestamp: 9, nbits: 0x207fffff };
assert_eq!(h.to_bytes().len(), 76);
let c = easy_config(64, 32);
assert_eq!(c.to_bytes().len(), 52);
assert_eq!(c.rows_pattern.to_list(), vec![0]); // size-1 pattern
}
/// Recompute the jackpot hash from a real ACCEPTED pool proof
/// (/tmp/pearl_proof.bin) to derive the difficulty-30 share-target formula.
/// Ignored — needs the captured proof file. Run:
/// cargo test --no-default-features --features pearl --bin jackpotminer derive_share_target -- --ignored --nocapture
#[test]
#[ignore]
fn derive_share_target() {
let hx = |s: &str| -> Vec<u8> { (0..s.len() / 2).map(|i| u8::from_str_radix(&s[2*i..2*i+2], 16).unwrap()).collect() };
let hdr_hex = match std::fs::read_to_string("/tmp/pearl_headers.txt") {
Ok(s) => s.lines().find(|l| !l.trim().is_empty()).unwrap_or("").to_string(),
Err(_) => { eprintln!("no /tmp/pearl_headers.txt; skipping"); return; }
};
let header = IncompleteBlockHeader::from_bytes(&hx(&hdr_hex)).unwrap();
let config = MiningConfiguration {
common_dim: 4096, rank: 128, mma_type: MMAType::Int7xInt7ToInt32,
rows_pattern: PeriodicPattern::from_list(&[0, 32]).unwrap(),
cols_pattern: PeriodicPattern::from_list(&(0..64).collect::<Vec<_>>()).unwrap(),
reserved: [0u8; 32],
};
let job_key = compute_job_key(&header, &config);
let mut quals: Vec<U256> = vec![];
let mut hwk = U256::one();
for idx in 0..16usize {
let raw = match std::fs::read(format!("/tmp/pearl_proof_{idx}.bin")) {
Ok(r) => r,
Err(_) => break,
};
let mut o = 0usize;
let rd = |o: &mut usize| { let v = u64::from_le_bytes(raw[*o..*o + 8].try_into().unwrap()); *o += 8; v as usize };
let (_m, _n, k, rank) = (rd(&mut o), rd(&mut o), rd(&mut o), rd(&mut o));
let mut mats = vec![];
for _ in 0..2 {
let ld = rd(&mut o);
let mut chunks = std::collections::HashMap::new();
let mut idxs = vec![];
let mut leaves = vec![];
for _ in 0..ld { let l = rd(&mut o); leaves.push(raw[o..o + l].to_vec()); o += l; }
let li = rd(&mut o);
for _ in 0..li { idxs.push(rd(&mut o)); }
let _t = rd(&mut o);
let root: [u8; 32] = raw[o..o + 32].try_into().unwrap(); o += 32;
let sib = rd(&mut o); o += sib * 32;
let rows = rd(&mut o);
let mut row_indices = vec![];
for _ in 0..rows { row_indices.push(rd(&mut o)); }
for (c, leaf) in idxs.iter().zip(leaves) { chunks.insert(*c, leaf); }
mats.push((chunks, row_indices, root));
}
let cpr = k / 1024;
let extract = |chunks: &std::collections::HashMap<usize, Vec<u8>>, row: usize| -> Vec<i8> {
let mut v = Vec::with_capacity(k);
for c in 0..cpr { v.extend(chunks[&(row * cpr + c)].iter().map(|&b| b as i8)); }
v
};
let (hash_a, hash_b) = (mats[0].2, mats[1].2);
let mut bi = [0u8; 64]; bi[..32].copy_from_slice(&job_key); bi[32..].copy_from_slice(&hash_b);
let b_seed = blake3_digest(&bi, None);
let mut ai = [0u8; 64]; ai[..32].copy_from_slice(&b_seed); ai[32..].copy_from_slice(&hash_a);
let a_seed = blake3_digest(&ai, None);
let a_rows = mats[0].1.clone();
let b_cols = mats[1].1.clone();
let noise = compute_noise_for_indices(k, rank, (b_seed, a_seed), &a_rows, &b_cols);
let a_strips: Vec<Vec<i8>> = a_rows.iter().map(|&r| extract(&mats[0].0, r)).collect();
let b_strips: Vec<Vec<i8>> = b_cols.iter().map(|&c| extract(&mats[1].0, c)).collect();
let (h, w) = (a_rows.len(), b_cols.len());
hwk = U256::from(h * w * k);
let mut jackpot = [0u32; 16];
let mut tile = vec![vec![0i32; w]; h]; // Cblk ACCUMULATES across chunks
for (ci, ll) in (rank..=k).step_by(rank).enumerate() {
for u in 0..h {
for vv in 0..w {
for l in ll - rank..ll {
let a = a_strips[u][l] as i32 + noise.a[u][l] as i32;
let b = b_strips[vv][l] as i32 + noise.b[vv][l] as i32;
tile[u][vv] = tile[u][vv].wrapping_add(a * b);
}
}
}
let x = tile.iter().flatten().fold(0u32, |acc, &e| acc ^ e as u32);
jackpot[ci % 16] = jackpot[ci % 16].rotate_left(13) ^ x;
}
let hash = U256::from_little_endian(&compute_jackpot_hash(&jackpot, a_seed));
let q = U256::MAX / hash;
eprintln!("proof[{idx}] h={h} w={w} hwk={} hash=0x{:x} MAX/hash={}", h * w * k, hash, q);
quals.push(q);
}
if quals.is_empty() { eprintln!("no /tmp/pearl_proof_*.bin"); return; }
let minq = *quals.iter().min().unwrap();
eprintln!("--- pool share difficulty was 30 ---");
eprintln!("min(MAX/hash) = {}", minq);
eprintln!("min(MAX/hash) / 30 = {}", minq / U256::from(30u64));
eprintln!("min(MAX/hash) / hwk = {}", minq / hwk);
eprintln!("min(MAX/hash) / (30*hwk) = {}", minq / (U256::from(30u64) * hwk));
}
#[test]
fn pattern_from_list_and_bytes_roundtrip() {
let p = PeriodicPattern::from_list(&[0, 1, 8, 9]).expect("periodic");
let mut got = p.to_list();
got.sort_unstable();
assert_eq!(got, vec![0, 1, 8, 9]);
assert_eq!(p.size(), 4);
let p2 = PeriodicPattern::from_bytes(&p.to_bytes());
assert_eq!(p2.shape, p.shape, "to_bytes/from_bytes roundtrip");
assert!(PeriodicPattern::from_list(&[0, 1, 3]).is_none(), "non-periodic rejected");
}
/// Mine on a very easy target, then verify the found solution round-trips,
/// and a tampered nonce/jackpot is rejected.
#[test]
fn mine_then_verify_roundtrip() {
let header = IncompleteBlockHeader { version: 0, prev_block: [1; 32], merkle_root: [2; 32], timestamp: 0x66666666, nbits: 0x207fffff };
let config = easy_config(64, 32); // k=64, r=32
let bound = extract_difficulty_bound(header.nbits, &config); // easy nbits
let mut rng = rand::rng();
// Easy target => a tile opens within a few attempts.
let mut sol = None;
for _ in 0..64 {
if let Some(s) = try_mine_one(&mut rng, 2, 2, 64, &header, &config, bound) {
sol = Some(s);
break;
}
}
let sol = sol.expect("found a solution on easy difficulty");
assert!(verify(&header, &config, &sol, bound), "found solution must verify");
// Build the submission proof; its Merkle root must equal the commitment HA.
let proof = build_proof(&header, &config, &sol);
let jk = compute_job_key(&header, &config);
let pa = crate::pearl::merkle::pad_to_chunk_boundary(&flatten(&sol.a));
assert_eq!(proof.a.proof.root, blake3_digest(&pa, Some(jk)), "merkle root == commitment HA");
assert!(!encode_proof(&proof).is_empty());
// Tamper: corrupt the recorded jackpot hash -> verify fails.
let mut bad = Solution { jackpot_hash: sol.jackpot_hash, ..sol_clone(&sol) };
bad.jackpot_hash[0] ^= 1;
assert!(!verify(&header, &config, &bad, bound), "tampered solution must be rejected");
}
fn sol_clone(s: &Solution) -> Solution {
Solution {
m: s.m, n: s.n, k: s.k, rank: s.rank,
a: s.a.clone(), bt: s.bt.clone(),
a_rows: s.a_rows.clone(), b_cols: s.b_cols.clone(),
jackpot_hash: s.jackpot_hash,
}
}
}
+447
View File
@@ -0,0 +1,447 @@
//! Pearl (PRL) pool client + mining loop — wire protocol pinned from a live
//! capture of `prl.kryptex.network` (see `pearl-dump/pearl-stratum.log`).
//!
//! Handshake:
//! C> mining.configure [["pearl/v1"], {}] S> {pearl/v1:true, share_format:"base64"}
//! C> mining.subscribe ["<ua>"] S> [[["mining.set_difficulty",id],["mining.notify",id]], "", 0]
//! C> mining.authorize ["<address>", "<pw>"]
//! Server notifications:
//! pearl.set_mining_params [{m,n,k,rank,rows_pattern,cols_pattern,mma_type}]
//! mining.set_difficulty [<share_diff>]
//! mining.notify [job_id, prev_hash, header_hex(76B = IncompleteBlockHeader),
//! height, ntime, nbits, clean]
//! Submit (TODO: confirm against an accepted share):
//! mining.submit / submitPlainProof with base64 proof (share_format=base64).
//!
//! Reality from the capture: m=n=131072, k=4096 → each attempt is a ~512MB×512MB
//! int8 GEMM (GPU-scale). The CPU path here parses/validates and grinds only at
//! small sizes; real mining needs the GPU pipeline.
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
use std::io::{BufRead, BufReader, Write};
use std::net::TcpStream;
use std::time::{Duration, Instant};
use anyhow::{anyhow, Context, Result};
use serde_json::{json, Value};
use primitive_types::U256;
use super::pearlhash::{
build_proof, encode_proof, share_bound, try_mine_one, verify, IncompleteBlockHeader, MMAType, MiningConfiguration,
PeriodicPattern, Solution,
};
/// Largest CPU-grindable problem (elements per operand). Real pool configs are
/// far bigger (131072×4096) and need the GPU; above this we parse+log only.
const CPU_GRIND_LIMIT: usize = 4096 * 256;
/// Upper bounds on what the GPU path (feature `pearl-cuda`) will attempt. The
/// whole attempt is on-GPU now (rng + commitment + noise + IMMA sweep + harvest),
/// so the only real limit is VRAM: the full-GPU path holds 4 operand buffers ≈
/// `2·(m+n)·k` bytes, so `GPU_MAX_ELEMS` ≈ half the VRAM budget. The **live
/// config (m=n=131072 ⇒ 134M tiles, ~2.15 GB) now FITS and runs** (~50 s/attempt
/// on a 16 GB 5080 via the tensor-core sweep — functional but latency-bound).
/// `GPU_MAX_TILES` is a backstop against absurd grids.
#[cfg(feature = "pearl-cuda")]
const GPU_MAX_TILES: u128 = 256 << 20; // up to ~268M tiles per attempt (live = 134M)
#[cfg(feature = "pearl-cuda")]
const GPU_MAX_ELEMS: usize = 1280 << 20; // (m+n)·k ≤ 1.34e9 ⇒ ≲2.7 GB resident
/// Tiles per GPU sweep batch — bounds the per-batch index upload + jackpot
/// readback (~64 B/tile); the resident matrices are untouched between batches.
#[cfg(feature = "pearl-cuda")]
const GPU_BATCH_TILES: usize = 1 << 16;
#[derive(Clone)]
pub struct Job {
pub id: String,
pub header: IncompleteBlockHeader,
pub config: MiningConfiguration,
pub m: usize,
pub n: usize,
}
impl Job {
fn k(&self) -> usize {
self.config.common_dim as usize
}
}
pub struct PearlStratum {
stream: TcpStream,
rx: std::sync::mpsc::Receiver<Value>,
pending: std::collections::VecDeque<Value>,
next_id: u64,
closed: bool,
}
impl PearlStratum {
pub fn connect(host: &str, port: u16, user: &str, pass: &str) -> Result<Self> {
let stream = TcpStream::connect((host, port)).with_context(|| format!("connect {host}:{port}"))?;
// A dedicated reader thread does blocking line reads (no partial-line /
// non-blocking hazards) and forwards parsed messages over a channel, so
// the mine loop can poll for newer jobs without ever blocking on I/O.
let read_stream = stream.try_clone()?;
let (tx, rx) = std::sync::mpsc::channel::<Value>();
std::thread::spawn(move || {
let mut reader = BufReader::new(read_stream);
let mut line = String::new();
loop {
line.clear();
match reader.read_line(&mut line) {
Ok(0) | Err(_) => break, // closed / fatal
Ok(_) => {
let t = line.trim();
if t.is_empty() {
continue;
}
match serde_json::from_str::<Value>(t) {
Ok(v) => {
if tx.send(v).is_err() {
break; // receiver gone
}
}
Err(_) => {} // ignore malformed lines
}
}
}
}
});
let mut s = Self { stream, rx, pending: std::collections::VecDeque::new(), next_id: 1, closed: false };
s.call("mining.configure", json!([["pearl/v1"], {}]))?;
s.call("mining.subscribe", json!(["jackpotminer/0.1"]))?;
s.call("mining.authorize", json!([user, pass]))?;
Ok(s)
}
fn call(&mut self, method: &str, params: Value) -> Result<u64> {
let id = self.next_id;
self.next_id += 1;
let mut line = serde_json::to_string(&json!({ "id": id, "method": method, "params": params }))?;
line.push('\n');
self.stream.write_all(line.as_bytes())?;
Ok(id)
}
/// Drain the reader channel into the pending buffer (non-blocking).
fn pump(&mut self) {
loop {
match self.rx.try_recv() {
Ok(v) => self.pending.push_back(v),
Err(std::sync::mpsc::TryRecvError::Empty) => break,
Err(std::sync::mpsc::TryRecvError::Disconnected) => {
self.closed = true;
break;
}
}
}
}
fn try_recv(&mut self) -> Result<Option<Value>> {
self.pump();
if let Some(v) = self.pending.pop_front() {
return Ok(Some(v));
}
if self.closed {
return Err(anyhow!("pool closed the connection"));
}
Ok(None)
}
/// Whether a `mining.notify` for a job other than `current_id` is buffered —
/// i.e. newer work has arrived and the current attempt should be abandoned.
/// Non-consuming: the message stays queued for the main loop to apply.
pub fn has_newer_job(&mut self, current_id: &str) -> bool {
self.pump();
self.pending.iter().any(|m| is_newer_notify(m, current_id))
}
/// Submit a base64 proof for `job_id`. TODO(confirm): exact method/params +
/// any nonce/ntime fields, from an accepted-share capture.
pub fn submit(&mut self, user: &str, job_id: &str, proof: &[u8]) -> Result<()> {
use base64::Engine;
let b64 = base64::engine::general_purpose::STANDARD.encode(proof);
self.call("mining.submit", json!([user, job_id, b64]))?;
Ok(())
}
}
/// A buffered message is "newer work" iff it's a `mining.notify` whose job id
/// (params[0]) differs from the one currently being mined.
fn is_newer_notify(m: &Value, current_id: &str) -> bool {
m.get("method").and_then(Value::as_str) == Some("mining.notify")
&& m["params"].get(0).and_then(Value::as_str).is_some_and(|id| id != current_id)
}
fn unhex(s: &str) -> Vec<u8> {
let s = s.trim_start_matches("0x");
(0..s.len() / 2).filter_map(|i| u8::from_str_radix(&s[2 * i..2 * i + 2], 16).ok()).collect()
}
/// Parse `pearl.set_mining_params` → (config, m, n).
fn parse_mining_params(p: &Value) -> Option<(MiningConfiguration, usize, usize)> {
let o = p.get(0)?;
let m = o.get("m")?.as_u64()? as usize;
let n = o.get("n")?.as_u64()? as usize;
let k = o.get("k")?.as_u64()? as u32;
let rank = o.get("rank")?.as_u64()? as u16;
let to_list = |key: &str| -> Option<Vec<u32>> {
Some(o.get(key)?.as_array()?.iter().filter_map(|v| v.as_u64().map(|x| x as u32)).collect())
};
let rows = PeriodicPattern::from_list(&to_list("rows_pattern")?)?;
let cols = PeriodicPattern::from_list(&to_list("cols_pattern")?)?;
let config = MiningConfiguration {
common_dim: k,
rank,
mma_type: MMAType::Int7xInt7ToInt32,
rows_pattern: rows,
cols_pattern: cols,
reserved: [0u8; 32],
};
Some((config, m, n))
}
/// Parse a `mining.notify` array using the current matmul config.
fn parse_notify(p: &Value, config: &MiningConfiguration, m: usize, n: usize) -> Option<Job> {
let arr = p.as_array()?;
let id = arr.first()?.as_str()?.to_string();
let header_hex = arr.get(2)?.as_str()?;
let header = IncompleteBlockHeader::from_bytes(&unhex(header_hex))?;
Some(Job { id, header, config: *config, m, n })
}
/// The Pearl mining loop. Connects, tracks config/difficulty, parses jobs.
/// Grinds on CPU only for small problems; real (131072×4096) configs are logged
/// for the GPU pipeline.
pub fn run(host: &str, port: u16, user: &str, pass: &str, running: Arc<AtomicBool>) -> Result<()> {
let mut pool = PearlStratum::connect(host, port, user, pass)?;
let threads = num_cpus::get().max(1);
log::info!("pearl: connected to {host}:{port} ({threads} CPU threads)");
#[cfg(feature = "pearl-cuda")]
let mut gpu_nonce: u64 = 0;
#[cfg(feature = "pearl-cuda")]
let gpu = match super::gpu::PearlGpu::new(0) {
Ok(g) => {
log::info!("pearl: GPU 0 ready (int8 dp4a tile kernel)");
Some(g)
}
Err(e) => {
log::warn!("pearl: GPU init failed ({e}); CPU grind only");
None
}
};
let mut config: Option<MiningConfiguration> = None;
let (mut m, mut n) = (0usize, 0usize);
let mut difficulty = 1u64;
let mut job: Option<Job> = None;
while running.load(Ordering::Relaxed) {
while let Some(msg) = pool.try_recv()? {
log::debug!("pearl: recv {}", serde_json::to_string(&msg).unwrap_or_default());
match msg.get("method").and_then(Value::as_str).unwrap_or("") {
"pearl.set_mining_params" => {
if let Some((c, mm, nn)) = parse_mining_params(&msg["params"]) {
log::info!(
"pearl: params m={mm} n={nn} k={} rank={} h={} w={}",
c.common_dim, c.rank, c.rows_pattern.size(), c.cols_pattern.size()
);
config = Some(c);
m = mm;
n = nn;
}
}
"mining.set_difficulty" => {
if let Some(d) = msg["params"].get(0).and_then(Value::as_f64) {
difficulty = d.max(1.0) as u64;
log::info!("pearl: share difficulty {difficulty}");
}
}
"mining.notify" => {
if let Some(c) = &config {
if let Some(j) = parse_notify(&msg["params"], c, m, n) {
log::info!("pearl: job {} (nbits {:#010x})", j.id, j.header.nbits);
job = Some(j);
}
}
}
_ => {}
}
}
let Some(j) = job.clone() else {
std::thread::sleep(Duration::from_millis(200));
continue;
};
let bound = share_bound(difficulty, j.config.rows_pattern.size() as usize, j.config.cols_pattern.size() as usize, j.k());
let deadline = Instant::now() + Duration::from_millis(500);
let cpu_ok = j.m.saturating_mul(j.k()) <= CPU_GRIND_LIMIT;
// Pick a miner: GPU for tractable configs (pearl-cuda), else CPU for
// small problems, else skip. A GPU attempt can open several tiles — each
// is a separate share — so the miner returns ALL winners for the job.
let sols: Vec<Solution> = {
#[cfg(feature = "pearl-cuda")]
{
if let (Some(g), true) = (gpu.as_ref(), gpu_suitable(&j)) {
gpu_mine(g, &j, bound, &mut pool, &running, &mut gpu_nonce)
} else if cpu_ok {
mine_batch(&j, bound, deadline, &running, threads).into_iter().collect()
} else {
log::warn!(
"pearl: job {} too large for the GPU VRAM budget (m={} n={} k={}, {} tiles)",
j.id, j.m, j.n, j.k(), tile_count(&j)
);
std::thread::sleep(Duration::from_millis(500));
Vec::new()
}
}
#[cfg(not(feature = "pearl-cuda"))]
{
if cpu_ok {
mine_batch(&j, bound, deadline, &running, threads).into_iter().collect()
} else {
log::warn!(
"pearl: job {} is GPU-scale (m={} k={}); CPU grind skipped — build with --features pearl-cuda",
j.id, j.m, j.k()
);
std::thread::sleep(Duration::from_millis(500));
Vec::new()
}
}
};
for sol in &sols {
let proof = build_proof(&j.header, &j.config, sol);
pool.submit(user, &j.id, &encode_proof(&proof))?;
}
if !sols.is_empty() {
log::info!("pearl: submitted {} share(s) for job {}", sols.len(), j.id);
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
/// Validate parsing against the real prl.kryptex.network capture
/// (pearl-dump/pearl-stratum.log).
#[test]
fn parses_live_capture() {
let cols: Vec<u32> = (0..64).collect();
let params = json!([{
"m": 131072, "n": 131072, "k": 4096, "rank": 128,
"rows_pattern": [0, 32], "cols_pattern": cols, "mma_type": "Int7xInt7ToInt32"
}]);
let (c, m, n) = parse_mining_params(&params).expect("params");
assert_eq!((m, n, c.common_dim, c.rank), (131072, 131072, 4096, 128));
assert_eq!(c.rows_pattern.size(), 2);
assert_eq!(c.cols_pattern.size(), 64);
let header_hex = "0000402089571bf45a9e6d9f88d4e48aa1d44fe0060dbb1b871002d21a58b56a36e0793958eec088936f1453e3f3903402e691f23ab996f73ca0fa38146d70cb1656b2ee2a4e226a86350118";
let prev = "3979e0366ab5581ad20210871bbb0d06e04fd4a18ae4d4889f6d9e5af41b5789";
let notify = json!(["0001099c-fad2b0b3-1978c7701d91dda9", prev, header_hex, 67996, "6a224e2a", "18013586", true]);
let j = parse_notify(&notify, &c, m, n).expect("notify");
assert_eq!(j.id, "0001099c-fad2b0b3-1978c7701d91dda9");
assert_eq!(j.header.nbits, 0x1801_3586);
assert_eq!(j.header.timestamp, 0x6a22_4e2a);
// prev_block recovered (header stores it reversed); job_key uses to_bytes.
assert_eq!(j.header.prev_block.to_vec(), unhex(prev));
// header round-trips: to_bytes == the notify header hex (so commitment matches).
assert_eq!(j.header.to_bytes().to_vec(), unhex(header_hex));
}
/// `is_newer_notify` drives the abandon-stale-work check: it fires only for a
/// `mining.notify` carrying a job id different from the one being mined.
#[test]
fn detects_newer_job() {
let cur = "0001099c-fad2b0b3-1978c7701d91dda9";
let same = json!({"method": "mining.notify", "params": [cur, "prev", "00", 1, "t", "n", true]});
let newer = json!({"method": "mining.notify", "params": ["0001099d-aaaa-bbbb", "prev", "00", 1, "t", "n", true]});
let other = json!({"method": "mining.set_difficulty", "params": [30]});
assert!(!is_newer_notify(&same, cur), "same job id is not newer");
assert!(is_newer_notify(&newer, cur), "different job id is newer work");
assert!(!is_newer_notify(&other, cur), "non-notify is not newer work");
}
}
/// Grind `try_mine_one` across `threads` cores until a tile opens or the deadline
/// passes. First verified solution wins.
fn mine_batch(j: &Job, bound: U256, deadline: Instant, running: &AtomicBool, threads: usize) -> Option<Solution> {
let found: Mutex<Option<Solution>> = Mutex::new(None);
let stop = AtomicBool::new(false);
std::thread::scope(|s| {
for _ in 0..threads {
s.spawn(|| {
let mut rng = rand::rng();
while !stop.load(Ordering::Relaxed) && running.load(Ordering::Relaxed) && Instant::now() < deadline {
if let Some(sol) = try_mine_one(&mut rng, j.m, j.n, j.k(), &j.header, &j.config, bound) {
if verify(&j.header, &j.config, &sol, bound) {
*found.lock().unwrap() = Some(sol);
stop.store(true, Ordering::Relaxed);
return;
}
}
}
});
}
});
found.into_inner().unwrap()
}
/// Tiles swept per attempt for the periodic patterns: `(m/h)·(n/w)`.
#[cfg(feature = "pearl-cuda")]
fn tile_count(j: &Job) -> u128 {
let h = j.config.rows_pattern.size() as usize;
let w = j.config.cols_pattern.size() as usize;
(j.m / h.max(1)) as u128 * (j.n / w.max(1)) as u128
}
/// Whether the GPU host-gather path can attempt this job (operands + tile count
/// within [`GPU_MAX_ELEMS`]/[`GPU_MAX_TILES`]). The live config exceeds both.
#[cfg(feature = "pearl-cuda")]
fn gpu_suitable(j: &Job) -> bool {
let elems = j.m.saturating_add(j.n).saturating_mul(j.k());
elems <= GPU_MAX_ELEMS && tile_count(j) <= GPU_MAX_TILES
}
/// GPU mining: runs ONE **fully-on-GPU** attempt (A,Bᵀ generated, committed,
/// noised, and swept on the GPU; see [`super::gpu::PearlGpu::mine_full_gpu_all`])
/// over every tile with the next nonce, returning ALL winning tiles (each a
/// separate share). The sweep checks `running` between row-tile chunks, so a long
/// live-scale attempt stays interruptible. The chunk-aligned fast path needs
/// `(m·k)%1024==0`; otherwise it falls back to CPU-generated operands (first win).
/// The caller loops (refreshing the job between attempts).
#[cfg(feature = "pearl-cuda")]
fn gpu_mine(gpu: &super::gpu::PearlGpu, j: &Job, bound: U256, pool: &mut PearlStratum, running: &AtomicBool, nonce: &mut u64) -> Vec<Solution> {
let (m, n, k) = (j.m, j.n, j.k());
let batch = GPU_BATCH_TILES;
let aligned = (m * k) % 1024 == 0 && (n * k) % 1024 == 0;
*nonce = nonce.wrapping_add(1);
let attempt = if aligned {
// Abandon the attempt on shutdown or when the pool pushes a newer job.
let jid = j.id.clone();
gpu.mine_full_gpu_all(&j.header, &j.config, m, n, bound, *nonce, batch, || {
running.load(Ordering::Relaxed) && !pool.has_newer_job(&jid)
})
} else {
use rand::Rng;
let mut rng = rand::rng();
let a: Vec<Vec<i8>> = (0..m).map(|_| (0..k).map(|_| rng.random_range(-64..=64i8)).collect()).collect();
let b: Vec<Vec<i8>> = (0..k).map(|_| (0..n).map(|_| rng.random_range(-64..=64i8)).collect()).collect();
let bt: Vec<Vec<i8>> = (0..n).map(|i| (0..k).map(|jj| b[jj][i]).collect()).collect();
gpu.try_mine_one_gpu(&j.header, &j.config, a, bt, m, n, bound, batch).map(|o| o.into_iter().collect())
};
match attempt {
Ok(v) => v,
Err(e) => {
log::error!("pearl: GPU mine error: {e}");
Vec::new()
}
}
}
+551
View File
@@ -0,0 +1,551 @@
//! Minimal Zcash-style Stratum client (the protocol used by ZClassic and other
//! Equihash pools, as implemented by nheqminer/EWBF).
//!
//! A supervisor thread owns the socket lifecycle: it performs the
//! subscribe/authorize handshake, reads newline-delimited JSON-RPC messages, and
//! publishes the latest job and target into shared state for the mining threads.
//! Share submissions are written back through the same socket. If the pool drops
//! the connection, the supervisor reconnects automatically (capped exponential
//! backoff) and re-handshakes; TCP keepalive reduces idle disconnects.
use std::io::{BufRead, BufReader, Write};
use std::net::TcpStream;
use std::sync::atomic::{AtomicU64, Ordering};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
use anyhow::{anyhow, Context, Result};
use log::{debug, info, warn};
use serde_json::{json, Value};
use socket2::{SockRef, TcpKeepalive};
/// Backoff bounds for reconnecting after the pool drops us.
const RECONNECT_MIN: Duration = Duration::from_secs(1);
const RECONNECT_MAX: Duration = Duration::from_secs(30);
/// Idle time before TCP keepalive probes start.
const KEEPALIVE: Duration = Duration::from_secs(30);
/// JSON-RPC id for our custom `get_jackpot` request.
const JACKPOT_ID: u64 = 4;
/// Everything a mining thread needs to build headers and check shares.
#[derive(Clone)]
pub struct Work {
/// Monotonic id; bumped whenever a fresh job arrives so workers can restart.
pub epoch: u64,
pub job_id: String,
/// The 108 header bytes before the nonce (version..bits), ready to concat.
pub prefix: Vec<u8>,
/// Time field as sent by the pool (hex), echoed back on submit.
pub time_hex: String,
/// Pool-assigned nonce prefix; the worker fills the remaining nonce bytes.
pub nonce1: Vec<u8>,
/// 256-bit share target, big-endian.
pub target: [u8; 32],
}
/// Shared, lock-protected current work plus an epoch counter for cheap polling.
#[derive(Clone)]
pub struct WorkHandle {
inner: Arc<Mutex<Option<Work>>>,
epoch: Arc<AtomicU64>,
}
impl WorkHandle {
fn new() -> Self {
Self {
inner: Arc::new(Mutex::new(None)),
epoch: Arc::new(AtomicU64::new(0)),
}
}
/// Current epoch (changes when a new job is published).
pub fn epoch(&self) -> u64 {
self.epoch.load(Ordering::Acquire)
}
/// Snapshot the current work, if any.
pub fn get(&self) -> Option<Work> {
self.inner.lock().unwrap().clone()
}
}
/// A Stratum session that reconnects automatically when the pool drops it.
///
/// `writer` holds the live socket, or `None` while disconnected; the supervisor
/// thread swaps it as connections come and go.
#[derive(Clone)]
pub struct StratumClient {
host: String,
port: u16,
user: String,
pass: String,
writer: Arc<Mutex<Option<TcpStream>>>,
work: WorkHandle,
submit_id: Arc<AtomicU64>,
/// In-flight share submissions: submit id -> the worker that sent it (e.g.
/// "GPU 0 (CUDA)" or "CPU cores 0-3"), so the pool's accept/reject reply can
/// name the submitter. Entries are removed when the reply arrives, and the
/// map is cleared on reconnect (those replies will never come).
pending: Arc<Mutex<HashMap<u64, String>>>,
/// Latest `get_jackpot` reply: a JSON object with current jackpot + pool-share
/// info for the current and last 10 lotteries (None until the pool replies).
jackpot: Arc<Mutex<Option<Value>>>,
}
impl StratumClient {
/// Connect, handshake, and start the supervisor thread that keeps the
/// connection alive (reconnecting on drop). The first connection must succeed
/// so a bad URL or unreachable pool fails fast.
pub fn connect(host: &str, port: u16, user: &str, pass: &str) -> Result<Self> {
let client = Self {
host: host.to_string(),
port,
user: user.to_string(),
pass: pass.to_string(),
writer: Arc::new(Mutex::new(None)),
work: WorkHandle::new(),
submit_id: Arc::new(AtomicU64::new(100)),
pending: Arc::new(Mutex::new(HashMap::new())),
jackpot: Arc::new(Mutex::new(None)),
};
let stream = client.dial_and_handshake()?;
// Supervisor: read until the pool drops us, then reconnect forever.
let supervisor = client.clone();
thread::spawn(move || supervisor.run_sessions(stream));
Ok(client)
}
/// Handle for mining threads to read jobs from.
pub fn work(&self) -> WorkHandle {
self.work.clone()
}
/// The pool payout mode implied by the worker password: `no-jackpot` →
/// "pplns", `solo` → "solo", `jackpot`/`jackpot.<pct>` (the default) →
/// "jackpot".
pub fn mining_mode(&self) -> &'static str {
if self.pass == "solo" {
"solo"
} else if self.pass == "no-jackpot" {
"pplns"
} else {
// "jackpot" or "jackpot.<pct>"
"jackpot"
}
}
/// The pool's last `get_jackpot` reply: a JSON object with current jackpot and
/// pool-share info for the current and last 10 lotteries. `None` until the
/// pool responds. (Accessor for consumers/UI; the raw object is preserved.)
#[allow(dead_code)]
pub fn jackpot(&self) -> Option<Value> {
self.jackpot.lock().unwrap().clone()
}
/// Open a fresh socket, enable keepalive, install it as the writer, and run
/// the subscribe/authorize handshake. Returns the stream for the reader loop.
fn dial_and_handshake(&self) -> Result<TcpStream> {
let stream = TcpStream::connect((self.host.as_str(), self.port))
.with_context(|| format!("connecting to {}:{}", self.host, self.port))?;
stream.set_nodelay(true).ok();
if let Err(e) = SockRef::from(&stream).set_tcp_keepalive(&TcpKeepalive::new().with_time(KEEPALIVE)) {
debug!("could not enable TCP keepalive: {e}");
}
// Install the writer before sending so `send` can use it.
*self.writer.lock().unwrap() = Some(stream.try_clone()?);
self.send(&json!({
"id": 1,
"method": "mining.subscribe",
"params": ["jackpotminer/0.1.0", Value::Null, self.host, self.port],
}))?;
self.send(&json!({
"id": 2,
"method": "mining.authorize",
"params": [self.user, self.pass],
}))?;
// Custom call: current jackpot + pool-share info for the current and last
// 10 lotteries. Best-effort (pools without it just error/ignore).
self.send(&json!({
"id": JACKPOT_ID,
"method": "get_jackpot",
"params": [],
}))?;
Ok(stream)
}
/// Own the connection lifecycle: read until disconnect, then reconnect with
/// capped exponential backoff. Runs until the process exits.
fn run_sessions(&self, first: TcpStream) {
let mut stream = first;
let mut backoff = RECONNECT_MIN;
loop {
// Blocks until the pool closes the connection or errors.
match reader_loop(stream, self.work.clone(), self.jackpot.clone(), self.pending.clone()) {
Ok(()) => warn!("stratum connection closed; reconnecting..."),
Err(e) => warn!("stratum disconnected: {e}; reconnecting..."),
}
// The socket is dead; stop workers from writing to it, and drop any
// in-flight submissions — their replies will never arrive.
*self.writer.lock().unwrap() = None;
self.pending.lock().unwrap().clear();
// Retry until reconnected, backing off between failed attempts.
stream = loop {
match self.dial_and_handshake() {
Ok(s) => {
info!("reconnected to {}:{}", self.host, self.port);
backoff = RECONNECT_MIN;
break s;
}
Err(e) => {
warn!("reconnect to {}:{} failed: {e}; retrying in {:?}", self.host, self.port, backoff);
thread::sleep(backoff);
backoff = (backoff * 2).min(RECONNECT_MAX);
}
}
};
}
}
/// Submit a found share. `nonce2` is the worker-chosen nonce tail; `solution`
/// is the full serialised solution including its compact-size prefix. Fails
/// (without crashing the worker) if currently disconnected — the supervisor
/// reconnects in the background for the next share.
pub fn submit(&self, who: &str, job_id: &str, time_hex: &str, nonce2: &[u8], solution: &[u8]) -> Result<()> {
let id = self.submit_id.fetch_add(1, Ordering::Relaxed);
let msg = json!({
"id": id,
"method": "mining.submit",
"params": [
self.user,
job_id,
time_hex,
hex::encode(nonce2),
hex::encode(solution),
],
});
// Record the submitter so the pool's reply (matched by `id`) can name it.
self.pending.lock().unwrap().insert(id, who.to_string());
info!("submitting share for job {job_id} from {who}");
self.send(&msg)
}
/// Serialise a JSON-RPC message and write it (newline-terminated) to the
/// current socket. Errors if disconnected or the write fails (broken pipe).
fn send(&self, msg: &Value) -> Result<()> {
let mut line = serde_json::to_string(msg)?;
line.push('\n');
let mut guard = self.writer.lock().unwrap();
let stream = guard.as_mut().ok_or_else(|| anyhow!("not connected to pool"))?;
stream.write_all(line.as_bytes())?;
stream.flush()?;
debug!("-> {}", line.trim_end());
Ok(())
}
}
/// Read and dispatch messages until the connection closes.
fn reader_loop(
stream: TcpStream,
work: WorkHandle,
jackpot: Arc<Mutex<Option<Value>>>,
pending: Arc<Mutex<HashMap<u64, String>>>,
) -> Result<()> {
// Pool-assigned nonce prefix, learned from the subscribe response.
let mut nonce1: Vec<u8> = Vec::new();
// Latest target; defaults to "anything" until the pool sets one.
let mut target = [0xffu8; 32];
let reader = BufReader::new(stream);
for line in reader.lines() {
let line = line?;
if line.trim().is_empty() {
continue;
}
debug!("<- {line}");
let v: Value = match serde_json::from_str(&line) {
Ok(v) => v,
Err(e) => {
warn!("bad json from pool: {e}");
continue;
}
};
// Subscribe response: result[1] carries the nonce1 prefix.
if v.get("id").and_then(Value::as_u64) == Some(1) {
if let Some(arr) = v.get("result").and_then(Value::as_array) {
if let Some(n1) = arr.get(1).and_then(Value::as_str) {
nonce1 = hex::decode(n1).unwrap_or_default();
info!("subscribed; nonce1 = {} ({} bytes)", n1, nonce1.len());
}
}
continue;
}
// get_jackpot response: a JSON object with current jackpot + pool-share
// info for the current and last 10 lotteries. Stored raw for consumers.
if v.get("id").and_then(Value::as_u64) == Some(JACKPOT_ID) {
if v.get("error").map(|e| !e.is_null()).unwrap_or(false) {
debug!("pool has no get_jackpot: {}", v.get("error").unwrap());
} else if let Some(result) = v.get("result").filter(|r| r.is_object()) {
info!("jackpot info received");
*jackpot.lock().unwrap() = Some(result.clone());
}
continue;
}
match v.get("method").and_then(Value::as_str) {
Some("mining.set_target") => {
if let Some(t) = v
.get("params")
.and_then(Value::as_array)
.and_then(|p| p.first())
.and_then(Value::as_str)
{
target = parse_target(t)?;
info!("new target {t}");
}
}
Some("mining.notify") => {
if let Some(params) = v.get("params").and_then(Value::as_array) {
match build_work(params, &nonce1, target) {
Ok(w) => {
let epoch = work.epoch.fetch_add(1, Ordering::AcqRel) + 1;
let w = Work { epoch, ..w };
info!("new job {} (epoch {epoch})", w.job_id);
*work.inner.lock().unwrap() = Some(w);
}
Err(e) => warn!("ignoring malformed job: {e}"),
}
}
}
_ => {
// Submit acks land here; surface rejects. Name the submitter by
// matching the reply's id against the pending-submit map.
let id = v.get("id").and_then(Value::as_u64);
let who = id.and_then(|i| pending.lock().unwrap().remove(&i));
let from = who.as_deref().unwrap_or("?");
if v.get("error").map(|e| !e.is_null()).unwrap_or(false) {
let reason = reject_reason(v.get("error").unwrap());
// Flag address rejections distinctly so the dashboard can
// highlight them (a misconfigured payout address rejects
// every share — worth shouting about).
if reason.to_lowercase().contains("address") {
warn!("share rejected [{from}]: invalid address — {reason}");
} else {
warn!("share rejected [{from}]: {reason}");
}
} else if id.map(|i| i >= 100).unwrap_or(false) {
info!("share accepted [{from}]");
}
}
}
}
Err(anyhow!("connection closed by pool"))
}
/// Extract a human-readable reason from a JSON-RPC error value. Stratum errors
/// are usually `[code, "message", data]`, but some pools send an object with a
/// `message` field or a bare string; fall back to the raw JSON otherwise.
fn reject_reason(err: &Value) -> String {
if let Some(msg) = err.as_array().and_then(|a| a.get(1)).and_then(Value::as_str) {
return msg.to_string();
}
if let Some(msg) = err.get("message").and_then(Value::as_str) {
return msg.to_string();
}
if let Some(s) = err.as_str() {
return s.to_string();
}
err.to_string()
}
/// Parse a `mining.notify` params array into [`Work`] (epoch filled in later).
fn build_work(params: &[Value], nonce1: &[u8], target: [u8; 32]) -> Result<Work> {
let s = |i: usize| -> Result<&str> {
params
.get(i)
.and_then(Value::as_str)
.ok_or_else(|| anyhow!("notify param {i} missing"))
};
let job_id = s(0)?.to_string();
let version = hex::decode(s(1)?)?;
let prevhash = hex::decode(s(2)?)?;
let merkle = hex::decode(s(3)?)?;
let reserved = hex::decode(s(4)?)?;
let time_hex = s(5)?.to_string();
let time = hex::decode(&time_hex)?;
let bits = hex::decode(s(6)?)?;
let mut prefix =
Vec::with_capacity(version.len() + prevhash.len() + merkle.len() + reserved.len() + 8);
prefix.extend_from_slice(&version);
prefix.extend_from_slice(&prevhash);
prefix.extend_from_slice(&merkle);
prefix.extend_from_slice(&reserved);
prefix.extend_from_slice(&time);
prefix.extend_from_slice(&bits);
if prefix.len() != 108 {
return Err(anyhow!("header prefix is {} bytes, expected 108", prefix.len()));
}
Ok(Work {
epoch: 0,
job_id,
prefix,
time_hex,
nonce1: nonce1.to_vec(),
target,
})
}
/// Decode a 256-bit big-endian target hex string into a fixed array.
fn parse_target(hexstr: &str) -> Result<[u8; 32]> {
let bytes = hex::decode(hexstr)?;
if bytes.len() != 32 {
return Err(anyhow!("target must be 32 bytes, got {}", bytes.len()));
}
let mut out = [0u8; 32];
out.copy_from_slice(&bytes);
Ok(out)
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::{BufRead, BufReader, Write};
use std::net::TcpListener;
use std::time::{Duration, Instant};
/// Drive a full handshake against a mock pool and validate that the client
/// publishes correct work and submits a well-formed share.
#[test]
fn handshake_job_and_submit() {
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
let port = listener.local_addr().unwrap().port();
// Mock pool: handshake, push a target + job, then capture one submit.
let server = std::thread::spawn(move || {
let (sock, _) = listener.accept().unwrap();
let mut writer = sock.try_clone().unwrap();
let mut lines = BufReader::new(sock).lines();
// subscribe (id 1) -> nonce1 in result[1]; authorize (id 2) -> ok.
let sub = lines.next().unwrap().unwrap();
assert!(sub.contains("mining.subscribe"));
writeln!(writer, r#"{{"id":1,"result":[null,"deadbeef"],"error":null}}"#).unwrap();
let auth = lines.next().unwrap().unwrap();
assert!(auth.contains("mining.authorize"));
writeln!(writer, r#"{{"id":2,"result":true,"error":null}}"#).unwrap();
// Client also sends our custom get_jackpot request.
let jp = lines.next().unwrap().unwrap();
assert!(jp.contains("get_jackpot"));
writeln!(writer, r#"{{"id":4,"result":{{"current":{{"jackpot":12.5,"pool_shares":40}},"history":[]}},"error":null}}"#).unwrap();
// Push target and a job. prevhash/merkle/reserved are 32-byte hex.
let h32 = "11".repeat(32);
let target = "ff".repeat(32);
writeln!(writer, r#"{{"id":null,"method":"mining.set_target","params":["{target}"]}}"#).unwrap();
writeln!(
writer,
r#"{{"id":null,"method":"mining.notify","params":["job1","04000000","{h32}","{h32}","{h32}","abcdef00","1d00ffff",true]}}"#
).unwrap();
// Capture the share the client submits.
let submit = lines.next().unwrap().unwrap();
submit
});
let client = StratumClient::connect("127.0.0.1", port, "wallet.worker", "x").unwrap();
let work = client.work();
// Wait for the job to propagate.
let deadline = Instant::now() + Duration::from_secs(5);
let w = loop {
if let Some(w) = work.get() {
break w;
}
assert!(Instant::now() < deadline, "no job received");
std::thread::sleep(Duration::from_millis(20));
};
assert_eq!(w.job_id, "job1");
assert_eq!(w.prefix.len(), 108, "header prefix must be 108 bytes");
assert_eq!(w.nonce1, hex::decode("deadbeef").unwrap());
assert_eq!(w.time_hex, "abcdef00");
assert_eq!(w.target, [0xffu8; 32]);
// Prefix begins with the version field we sent.
assert_eq!(&w.prefix[..4], &hex::decode("04000000").unwrap()[..]);
// The get_jackpot object was intaken and preserved.
let jp = client.jackpot().expect("jackpot info");
assert_eq!(jp["current"]["jackpot"].as_f64(), Some(12.5));
assert_eq!(jp["current"]["pool_shares"].as_i64(), Some(40));
// Submit a dummy share and verify the wire format.
let nonce2 = [0xAAu8; 28];
let solution = vec![0x01u8; 3 + crate::params::SOLUTION_BYTES];
client.submit("test", &w.job_id, &w.time_hex, &nonce2, &solution).unwrap();
let submit = server.join().unwrap();
let v: Value = serde_json::from_str(&submit).unwrap();
assert_eq!(v["method"], "mining.submit");
let params = v["params"].as_array().unwrap();
assert_eq!(params[0], "wallet.worker");
assert_eq!(params[1], "job1");
assert_eq!(params[2], "abcdef00");
assert_eq!(params[3], hex::encode(nonce2));
assert_eq!(params[4], hex::encode(&solution));
}
#[test]
fn target_parsing() {
let t = parse_target(&"00".repeat(32)).unwrap();
assert_eq!(t, [0u8; 32]);
assert!(parse_target("abcd").is_err());
}
/// After the pool drops the socket, the client should reconnect and run the
/// handshake again (rather than failing every later submit with broken pipe).
#[test]
fn reconnects_after_drop() {
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
let port = listener.local_addr().unwrap().port();
let server = std::thread::spawn(move || {
// First connection: handshake, then drop the socket (simulated drop).
{
let (sock, _) = listener.accept().unwrap();
let mut w = sock.try_clone().unwrap();
let mut lines = BufReader::new(sock).lines();
assert!(lines.next().unwrap().unwrap().contains("mining.subscribe"));
writeln!(w, r#"{{"id":1,"result":[null,"deadbeef"],"error":null}}"#).unwrap();
assert!(lines.next().unwrap().unwrap().contains("mining.authorize"));
writeln!(w, r#"{{"id":2,"result":true,"error":null}}"#).unwrap();
// Consume the custom handshake request before dropping so the
// client's handshake writes all land before the socket closes.
assert!(lines.next().unwrap().unwrap().contains("get_jackpot"));
// sock + w drop here -> client sees EOF and must reconnect.
}
// Second connection: the client should reconnect and re-subscribe.
let (sock2, _) = listener.accept().unwrap();
let resub = BufReader::new(sock2).lines().next().unwrap().unwrap();
assert!(resub.contains("mining.subscribe"), "client did not re-subscribe after drop");
});
let _client = StratumClient::connect("127.0.0.1", port, "wallet.worker", "x").unwrap();
// The server thread asserts the reconnect happened; join surfaces failures.
server.join().unwrap();
}
}
+712
View File
@@ -0,0 +1,712 @@
//! Live full-screen dashboard (opt-in via `--tui`), built on `ratatui`.
//!
//! Shows a per-card table (Sol/s, power, efficiency, shares), a totals row, and
//! a pane of recent log lines (logs are captured into a ring buffer so they
//! don't scribble over the UI). Quit with `q`, `Esc`, or `Ctrl-C`.
use std::collections::VecDeque;
use std::io;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Mutex, OnceLock};
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
use log::{Level, LevelFilter, Metadata, Record};
use ratatui::crossterm::event::{self, Event, KeyCode, KeyEventKind, KeyModifiers};
use ratatui::prelude::*;
use ratatui::widgets::{Block, Cell, Paragraph, Row, Sparkline, Table, Wrap};
use crate::controls::Controls;
use crate::cpu_groups::{CpuGroups, CpuMining};
use crate::miner::{CardSnapshot, Stats};
use crate::stratum::StratumClient;
/// Step sizes for the live hardware controls (per key press).
const CORE_STEP_MHZ: i32 = 15;
const MEM_STEP_MHZ: i32 = 50;
const TDP_STEP_W: i32 = 10;
const LOG_CAP: usize = 500;
/// How many Sol/s samples (≈ seconds) of history each graph keeps.
const HIST_CAP: usize = 600;
/// How often the CPU-group Sol/s figures are refreshed (seconds). Longer than
/// the per-card 1 s window because a CPU-group solve takes several seconds.
const CPU_POLL_SECS: u64 = 10;
fn log_buf() -> &'static Mutex<VecDeque<String>> {
static B: OnceLock<Mutex<VecDeque<String>>> = OnceLock::new();
B.get_or_init(|| Mutex::new(VecDeque::new()))
}
/// Separate ring buffer for pool "new job" notifications (shown in their own
/// pane, kept out of the general log).
fn job_buf() -> &'static Mutex<VecDeque<String>> {
static B: OnceLock<Mutex<VecDeque<String>>> = OnceLock::new();
B.get_or_init(|| Mutex::new(VecDeque::new()))
}
/// A `log` sink that captures recent lines into a ring buffer for the TUI pane.
struct CaptureLogger {
level: LevelFilter,
}
impl log::Log for CaptureLogger {
fn enabled(&self, m: &Metadata) -> bool {
m.level() <= self.level
}
fn log(&self, record: &Record) {
if !self.enabled(record.metadata()) {
return;
}
let lvl = match record.level() {
Level::Error => "ERR",
Level::Warn => "WRN",
Level::Info => "inf",
Level::Debug => "dbg",
Level::Trace => "trc",
};
let msg = record.args().to_string();
// Pool "new job <id> (epoch N)" notices go to their own pane (compact,
// without the level tag); everything else to the general log.
let (buf, line) = match msg.strip_prefix("new job ") {
Some(rest) => (job_buf(), format!("{} {rest}", utc_hms())),
None => (log_buf(), format!("{} {lvl} {msg}", utc_hms())),
};
let mut b = buf.lock().unwrap();
b.push_back(line);
while b.len() > LOG_CAP {
b.pop_front();
}
}
fn flush(&self) {}
}
/// Route logging into the in-memory ring buffer instead of the terminal. Call
/// instead of initialising `env_logger` when the TUI is active.
pub fn install_logger() {
let _ = log::set_boxed_logger(Box::new(CaptureLogger { level: LevelFilter::Info }));
log::set_max_level(LevelFilter::Info);
}
/// Run the dashboard until the user quits or `running` is cleared. Blocks.
///
/// If the terminal can't be taken over (rare on a real TTY), falls back to
/// periodic text stats on stderr so output is never lost.
#[allow(clippy::too_many_arguments)]
pub fn run(stats: &Stats, pool: &str, running: &AtomicBool, start: Instant, client: &StratumClient, controls: &Controls, cpu_mining: &CpuMining) {
match ratatui::try_init() {
Ok(mut terminal) => {
let _ = render_loop(&mut terminal, stats, pool, running, start, client, controls, cpu_mining);
ratatui::restore();
}
Err(e) => {
eprintln!("dashboard unavailable ({e}); falling back to text stats");
text_fallback(stats, running);
}
}
}
/// Degraded mode: print per-card stats + captured log lines to stderr every 10 s.
/// Used only if `ratatui` init fails after we'd already chosen the capture logger.
fn text_fallback(stats: &Stats, running: &AtomicBool) {
let mut prev: Vec<u64> = stats.cards().iter().map(|c| c.solutions).collect();
let mut t = Instant::now();
while running.load(Ordering::Relaxed) {
std::thread::sleep(Duration::from_millis(500));
if t.elapsed() < Duration::from_secs(10) {
continue;
}
let dt = t.elapsed().as_secs_f64();
t = Instant::now();
// Surface captured log + job lines, then per-card stats.
for l in log_buf().lock().unwrap().drain(..) {
eprintln!("{l}");
}
for l in job_buf().lock().unwrap().drain(..) {
eprintln!("new job {l}");
}
let cards = stats.cards();
prev.resize(cards.len(), 0);
for (i, c) in cards.iter().enumerate() {
let rate = c.solutions.saturating_sub(prev[i]) as f64 / dt;
prev[i] = c.solutions;
let w = c.power_mw as f64 / 1000.0;
if w > 0.0 {
eprintln!("{}: {rate:.1} Sol/s ({} shares, {w:.0} W, {:.2} Sol/W)", c.label, c.shares, rate / w);
} else {
eprintln!("{}: {rate:.1} Sol/s ({} shares)", c.label, c.shares);
}
}
}
for l in log_buf().lock().unwrap().drain(..) {
eprintln!("{l}");
}
}
#[allow(clippy::too_many_arguments)]
fn render_loop(
terminal: &mut ratatui::DefaultTerminal,
stats: &Stats,
pool: &str,
running: &AtomicBool,
start: Instant,
client: &StratumClient,
controls: &Controls,
cpu_mining: &CpuMining,
) -> io::Result<()> {
// Sol/s is computed over ~1 s windows; redraw is faster (for the clock/logs).
let mut prev: Vec<u64> = stats.cards().iter().map(|c| c.solutions).collect();
let mut rates: Vec<f64> = vec![0.0; prev.len()];
let mut hist: Vec<VecDeque<u64>> = vec![VecDeque::new(); prev.len()];
// Current CPU grouping snapshot; refreshed when the group size changes (the
// generation bumps). `controls` tracks the row count for Tab selection.
let mut groups = cpu_mining.groups();
let mut last_gen = cpu_mining.generation();
controls.set_group_rows(groups.len());
// Per-CPU-group Sol/s, refreshed every CPU_POLL_SECS. A slow CPU core finds
// only a few solutions per refresh, so a short-window delta (integer / ~10 s)
// quantises to ~0.1 steps and the second decimal is always zero. Instead we
// show a cumulative average since the core was enabled: the elapsed window
// grows over time, giving genuine two-decimal precision and a steady figure.
let mut rates_g: Vec<f64> = vec![0.0; groups.len()];
// Start instant + solution count at the beginning of each group's current
// enabled streak (`None` while disabled), used to compute the average.
let mut cpu_since: Vec<Option<Instant>> = vec![None; groups.len()];
let mut cpu_base: Vec<u64> = vec![0; groups.len()];
let mut prev_t = Instant::now();
let mut prev_tg = Instant::now();
while running.load(Ordering::Relaxed) {
// Pick up a regroup (group-size change): refresh the snapshot, the row
// count, and reset the per-group stat tracking to the new grouping.
let gen = cpu_mining.generation();
if gen != last_gen {
groups = cpu_mining.groups();
controls.set_group_rows(groups.len());
rates_g = vec![0.0; groups.len()];
cpu_since = vec![None; groups.len()];
cpu_base = vec![0; groups.len()];
last_gen = gen;
}
if prev_t.elapsed() >= Duration::from_secs(1) {
let dt = prev_t.elapsed().as_secs_f64();
let cards = stats.cards();
prev.resize(cards.len(), 0);
rates.resize(cards.len(), 0.0);
while hist.len() < cards.len() {
hist.push(VecDeque::new());
}
for (i, c) in cards.iter().enumerate() {
rates[i] = c.solutions.saturating_sub(prev[i]) as f64 / dt;
prev[i] = c.solutions;
push_hist(&mut hist[i], rates[i]);
}
prev_t = Instant::now();
}
if prev_tg.elapsed() >= Duration::from_secs(CPU_POLL_SECS) {
let now = Instant::now();
for (i, g) in groups.iter().enumerate() {
if !g.enabled() {
cpu_since[i] = None;
rates_g[i] = 0.0;
continue;
}
match cpu_since[i] {
// First refresh of an enabled streak: start averaging here.
None => {
cpu_since[i] = Some(now);
cpu_base[i] = g.solutions();
rates_g[i] = 0.0;
}
// Cumulative average over the (growing) enabled window.
Some(t0) => {
let elapsed = now.duration_since(t0).as_secs_f64();
if elapsed >= 1.0 {
rates_g[i] = g.solutions().saturating_sub(cpu_base[i]) as f64 / elapsed;
}
}
}
}
prev_tg = now;
}
let cards = stats.cards();
let mode = client.mining_mode();
let group_size = cpu_mining.group_size();
terminal.draw(|frame| draw(frame, pool, mode, start, &cards, &rates, &hist, controls, &groups, group_size, &rates_g))?;
if event::poll(Duration::from_millis(200))? {
if let Event::Key(k) = event::read()? {
if k.kind == KeyEventKind::Press {
let ctrl = k.modifiers.contains(KeyModifiers::CONTROL);
match k.code {
KeyCode::Char('q') | KeyCode::Esc => {
running.store(false, Ordering::Relaxed);
break;
}
KeyCode::Char('c') if ctrl => {
running.store(false, Ordering::Relaxed);
break;
}
// Tab cycles the selection over the GPUs then the CPU groups.
KeyCode::Tab => controls.select_next(),
// 'g' cycles the CPU group size (cores per mining row); the
// supervisor regroups the workers to match.
KeyCode::Char('g') => {
cpu_mining.cycle_group_size();
log::info!("CPU group size -> {} core(s) per row", cpu_mining.group_size());
}
// Backspace toggles mining on the selected row — a GPU
// device or a CPU group.
KeyCode::Backspace => {
if let Some(d) = controls.selected_device() {
let dev = controls.device(d);
dev.toggle_enabled();
let label = cards.get(d).map(|c| short_label(&c.label).to_string()).unwrap_or_else(|| format!("GPU {d}"));
log::info!("{label}: mining {}", if dev.enabled() { "enabled" } else { "disabled" });
} else if let Some(gi) = controls.selected_group() {
if gi < groups.len() {
cpu_mining.toggle_group(gi);
let g = groups.group(gi);
log::info!("{}: CPU mining {}", g.label(), if g.enabled() { "enabled" } else { "disabled" });
}
}
}
// Live hardware controls for the selected GPU — only when
// a GPU is selected and unlocked via --unlock-controls.
KeyCode::Char('z') if controls.unlocked() => {
if let Some(d) = controls.selected_device() {
controls.device(d).adjust_core(-CORE_STEP_MHZ);
}
}
KeyCode::Char('x') if controls.unlocked() => {
if let Some(d) = controls.selected_device() {
controls.device(d).adjust_core(CORE_STEP_MHZ);
}
}
KeyCode::Char('c') if controls.unlocked() => {
if let Some(d) = controls.selected_device() {
controls.device(d).adjust_mem(-MEM_STEP_MHZ);
}
}
KeyCode::Char('v') if controls.unlocked() => {
if let Some(d) = controls.selected_device() {
controls.device(d).adjust_mem(MEM_STEP_MHZ);
}
}
KeyCode::Char('b') if controls.unlocked() => {
if let Some(d) = controls.selected_device() {
controls.device(d).adjust_power(-TDP_STEP_W);
}
}
KeyCode::Char('n') if controls.unlocked() => {
if let Some(d) = controls.selected_device() {
controls.device(d).adjust_power(TDP_STEP_W);
}
}
_ => {}
}
}
}
}
}
Ok(())
}
#[allow(clippy::too_many_arguments)]
fn draw(
frame: &mut Frame,
pool: &str,
mode: &str,
start: Instant,
cards: &[CardSnapshot],
rates: &[f64],
hist: &[VecDeque<u64>],
controls: &Controls,
cpu_groups: &CpuGroups,
group_size: usize,
group_rates: &[f64],
) {
// Tall enough for the controls panel's lines (state + core/mem/tdp + clock
// readout, in a border), plus a row per CPU core and a CPU TOTAL row below
// the GPU totals.
let cpu_total_rows = if cpu_groups.is_empty() { 0 } else { 1 };
let dev_h = (cards.len() as u16 + cpu_groups.len() as u16 + 4 + cpu_total_rows).max(7);
let chunks = Layout::vertical([
Constraint::Length(1), // title
Constraint::Length(dev_h), // device table (+ auto-tune + controls)
Constraint::Length(9), // network Sol/s text + per-GPU graphs
Constraint::Min(3), // log pane
Constraint::Length(1), // footer
])
.split(frame.area());
// Title bar: name badge, then the pool payout mode, then pool + uptime.
let title = Line::from(vec![
Span::styled(" jackpotminer ", Style::new().fg(Color::Black).bg(Color::Green).bold()),
Span::raw(" "),
Span::styled(format!(" {mode} "), Style::new().fg(Color::Black).bg(Color::Cyan).bold()),
Span::raw(format!(" pool {pool} up {}", fmt_dur(start.elapsed()))),
]);
frame.render_widget(Paragraph::new(title), chunks[0]);
// Device table + totals.
let header = Row::new(["DEVICE", "Sol/s", "Power", "Temp", "Sol/W", "Shares"])
.style(Style::new().fg(Color::Cyan).bold());
let (mut tot_rate, mut tot_w, mut tot_sh, mut max_temp) = (0.0_f64, 0.0_f64, 0u64, 0u32);
let mut rows: Vec<Row> = Vec::with_capacity(cards.len() + 1);
for (i, c) in cards.iter().enumerate() {
let enabled = controls.device(i).enabled();
let rate = rates.get(i).copied().unwrap_or(0.0);
let w = c.power_mw as f64 / 1000.0;
let (power, eff) = if w > 0.0 {
tot_w += w;
(format!("{w:.0} W"), format!("{:.2}", rate / w))
} else {
("".to_string(), "".to_string())
};
let temp = match c.temp_c {
0 => "".to_string(),
t => {
max_temp = max_temp.max(t);
format!("{t}°C")
}
};
// Mark the device the controls panel currently targets, and flag a device
// disabled from the dashboard (Backspace).
let sel = controls.selected_device() == Some(i);
let marker = if sel { "" } else { " " };
let state = if enabled { "" } else { " [off]" };
let device = match &c.name {
Some(n) => format!("{marker}{} {n}{state}", c.label),
None => format!("{marker}{}{state}", c.label),
};
let rate_str = if enabled { format!("{rate:.1}") } else { "".to_string() };
let mut row = Row::new([
trunc(&device, 53),
rate_str,
power,
temp,
eff,
c.shares.to_string(),
]);
row = if sel {
row.style(Style::new().fg(Color::Yellow).bold())
} else if !enabled {
row.style(Style::new().fg(Color::DarkGray))
} else {
row
};
rows.push(row);
if enabled {
tot_rate += rate;
}
tot_sh += c.shares;
}
let (tpower, teff) = if tot_w > 0.0 {
(format!("{tot_w:.0} W"), format!("{:.2}", tot_rate / tot_w))
} else {
("".to_string(), "".to_string())
};
let ttemp = if max_temp > 0 { format!("{max_temp}°C") } else { "".to_string() };
rows.push(
Row::new([
Cell::from(" TOTAL"),
Cell::from(format!("{tot_rate:.1}")),
Cell::from(tpower),
Cell::from(ttemp),
Cell::from(teff),
Cell::from(tot_sh.to_string()),
])
.style(Style::new().bold()),
);
// CPU core rows below the totals: each mines when enabled (Backspace toggles
// the selected one). Disabled cores are dimmed and show no Sol/s. A CPU TOTAL
// row (summing enabled cores' Sol/s and all cores' shares) follows.
let (mut cpu_rate, mut cpu_sh) = (0.0_f64, 0u64);
for (i, g) in cpu_groups.iter().enumerate() {
let sel = controls.selected_group() == Some(i);
let on = g.enabled();
let r = group_rates.get(i).copied().unwrap_or(0.0);
let marker = if sel { "" } else { " " };
let state = if on { "[on] " } else { "[off]" };
let device = format!("{marker}{state} {}", g.label());
let rate = if on { format!("{r:.2}") } else { "".to_string() };
let mut row = Row::new([
trunc(&device, 53),
rate,
"".to_string(),
"".to_string(),
"".to_string(),
g.shares().to_string(),
]);
row = if sel {
row.style(Style::new().fg(Color::Yellow).bold())
} else if on {
row.style(Style::new().fg(Color::Green))
} else {
row.style(Style::new().fg(Color::DarkGray))
};
rows.push(row);
if on {
cpu_rate += r;
}
cpu_sh += g.shares();
}
if !cpu_groups.is_empty() {
rows.push(
Row::new([
Cell::from(" CPU TOTAL"),
Cell::from(format!("{cpu_rate:.2}")),
Cell::from(""),
Cell::from(""),
Cell::from(""),
Cell::from(cpu_sh.to_string()),
])
.style(Style::new().bold()),
);
}
let widths = [
Constraint::Length(53),
Constraint::Length(9),
Constraint::Length(8),
Constraint::Length(6),
Constraint::Length(7),
Constraint::Length(7),
];
// Device table on the left; live hardware-control panel on the right.
let table = Table::new(rows, widths)
.header(header)
.block(Block::bordered().title(" devices "));
let dev_cols = Layout::horizontal([Constraint::Min(0), Constraint::Length(26)]).split(chunks[1]);
frame.render_widget(table, dev_cols[0]);
draw_controls(frame, dev_cols[1], controls, cards, cpu_groups);
// One Sol/s graph per GPU, side by side, across the full width.
if !cards.is_empty() {
let cols = Layout::horizontal(vec![Constraint::Ratio(1, cards.len() as u32); cards.len()])
.split(chunks[2]);
for (i, c) in cards.iter().enumerate() {
let rate = rates.get(i).copied().unwrap_or(0.0);
let title = format!(" {} {rate:.0} Sol/s ", short_label(&c.label));
let data = hist.get(i).map(|h| h.iter().copied().collect::<Vec<u64>>()).unwrap_or_default();
frame.render_widget(
Sparkline::default()
.block(Block::bordered().title(title))
.data(data)
.style(Style::new().fg(Color::Cyan)),
cols[i],
);
}
}
// Bottom row: recent log on the left, pool job notices on the right. Each
// shows the most recent lines that fill its pane (down to the bottom).
let log_cols = Layout::horizontal([Constraint::Min(0), Constraint::Length(34)]).split(chunks[3]);
let visible = (chunks[3].height.saturating_sub(2) as usize).max(1); // minus the borders
let tail = |buf: &Mutex<VecDeque<String>>| -> Vec<Line> {
let b = buf.lock().unwrap();
let n = b.len();
b.iter()
.skip(n.saturating_sub(visible))
.map(|l| Line::raw(l.clone()))
.collect()
};
// Recent log: most-recent lines, coloured by severity and wrapped to the
// pane width so long messages don't overflow off the edge.
let log_w = log_cols[0].width.saturating_sub(2).max(1) as usize; // inside borders
frame.render_widget(
Paragraph::new(Text::from(recent_log_lines(log_buf(), visible, log_w)))
.wrap(Wrap { trim: false })
.block(Block::bordered().title(" recent ")),
log_cols[0],
);
frame.render_widget(
Paragraph::new(Text::from(tail(job_buf()))).block(Block::bordered().title(" jobs ")),
log_cols[1],
);
// Footer.
frame.render_widget(
Paragraph::new(
Line::from(if controls.unlocked() {
format!(" q/Esc quit · Tab select · Backspace enable/disable · g cpu group size ({group_size}) · z/x core · c/v mem · b/n tdp")
} else {
format!(" q/Esc quit · Tab select · Backspace enable/disable · g cpu group size ({group_size}) · controls locked")
})
.style(Style::new().fg(Color::DarkGray)),
),
chunks[4],
);
}
/// Build the recent-log lines: the newest entries that fit `visible` rows once
/// wrapped to `width` columns, coloured by severity. Selecting wrap-aware (from
/// newest backward, stopping before the wrapped height exceeds the pane) keeps
/// the latest line on screen instead of letting wrapping push it off the bottom.
fn recent_log_lines(buf: &Mutex<VecDeque<String>>, visible: usize, width: usize) -> Vec<Line<'static>> {
let b = buf.lock().unwrap();
let width = width.max(1);
let mut chosen: Vec<&String> = Vec::new();
let mut rows = 0usize;
for l in b.iter().rev() {
// Rows this line occupies once wrapped (ceil of width, at least one).
let h = (l.chars().count() + width - 1) / width;
let h = h.max(1);
if rows + h > visible && !chosen.is_empty() {
break;
}
rows += h;
chosen.push(l);
if rows >= visible {
break;
}
}
chosen.iter().rev().map(|l| style_log_line(l)).collect()
}
/// Colour a captured log line: red for an invalid-address share rejection,
/// green for an accepted share, yellow for any other warning/error, default for
/// everything else (including share submissions). Lines are "HH:MM:SS LVL
/// message", so the level tag sits at byte offset 9..12.
fn style_log_line(l: &str) -> Line<'static> {
let lower = l.to_lowercase();
if lower.contains("invalid address") {
Line::styled(l.to_string(), Style::new().fg(Color::Red).bold())
} else if lower.contains("share accepted") {
// The pool accepted a share — good news, show it green.
Line::styled(l.to_string(), Style::new().fg(Color::Green))
} else if matches!(l.get(9..12), Some("WRN") | Some("ERR")) {
Line::styled(l.to_string(), Style::new().fg(Color::Yellow))
} else {
Line::raw(l.to_string())
}
}
/// Push a Sol/s sample (rounded) into a capped history buffer.
fn push_hist(h: &mut VecDeque<u64>, rate: f64) {
h.push_back(rate.max(0.0).round() as u64);
while h.len() > HIST_CAP {
h.pop_front();
}
}
/// Short graph label: the part before " (" (e.g. "GPU 0 (CUDA)" -> "GPU 0").
fn short_label(label: &str) -> &str {
label.split(" (").next().unwrap_or(label)
}
fn trunc(s: &str, max: usize) -> String {
if s.chars().count() <= max {
s.to_string()
} else {
s.chars().take(max.saturating_sub(1)).collect::<String>() + ""
}
}
/// The live hardware-control panel for the selected GPU: per-row label,
/// decrease/increase keys, and the current target value. Adjusted by the key
/// handler in `render_loop`; Tab selects which GPU it targets.
fn draw_controls(frame: &mut Frame, area: Rect, controls: &Controls, cards: &[CardSnapshot], cpu_groups: &CpuGroups) {
// When a CPU group is selected, show its panel (with the Backspace hint)
// instead of the GPU clock/power controls.
if let Some(gi) = controls.selected_group() {
let g = cpu_groups.group(gi);
let lbl = Style::new().fg(Color::Cyan);
let val = Style::new().fg(Color::Green);
let key = Style::new().fg(Color::Yellow).bold();
let (state, state_style) = if g.enabled() {
("mining", Style::new().fg(Color::Green).bold())
} else {
("idle", Style::new().fg(Color::DarkGray).bold())
};
let lines = vec![
Line::from(vec![Span::styled("cores ", lbl), Span::styled(format!("{}", g.ncores()), val)]),
Line::from(vec![Span::styled("state ", lbl), Span::styled(state, state_style)]),
Line::from(vec![Span::styled("shares ", lbl), Span::styled(format!("{}", g.shares()), val)]),
Line::from(vec![Span::styled("Backspace", key), Span::raw(" toggle")]),
];
let title = format!(" {} ", g.label());
frame.render_widget(Paragraph::new(lines).block(Block::bordered().title(title)), area);
return;
}
let sel = controls.selected_device().unwrap_or(0);
let dev = controls.device(sel);
let off = |v: i32| format!("{v:+} MHz");
let pw = match dev.power_w() {
0 => "default".to_string(),
w => format!("{w} W"),
};
let key = Style::new().fg(Color::Yellow).bold();
let lbl = Style::new().fg(Color::Cyan);
let val = Style::new().fg(Color::Green);
// label(5) + " " + dec-key + "- " + inc-key + "+ " + value
let row = |name: &str, dn: char, up: char, value: String| {
Line::from(vec![
Span::styled(format!("{name:<5}"), lbl),
Span::styled(dn.to_string(), key),
Span::raw("- "),
Span::styled(up.to_string(), key),
Span::raw("+ "),
Span::styled(value, val),
])
};
let (state, state_style) = if dev.enabled() {
("mining", Style::new().fg(Color::Green).bold())
} else {
("idle", Style::new().fg(Color::DarkGray).bold())
};
let lines = vec![
// Mining state + the Backspace enable/disable hint.
Line::from(vec![
Span::styled("", key),
Span::styled(state, state_style),
]),
row("core", 'z', 'x', off(dev.core_off())),
row("mem", 'c', 'v', off(dev.mem_off())),
row("tdp", 'b', 'n', pw),
// Live actual clocks (sampled from the card), not the offsets above.
{
let c = cards.get(sel);
let clk = |mhz: u32| if mhz > 0 { format!("{mhz}") } else { "".to_string() };
Line::from(vec![
Span::styled("clock ", lbl),
Span::styled(
format!(
"{} / {} MHz",
clk(c.map(|c| c.core_clock_mhz).unwrap_or(0)),
clk(c.map(|c| c.mem_clock_mhz).unwrap_or(0)),
),
val,
),
])
},
];
// Title names the targeted card (its short label, e.g. "GPU 0") and flags the
// locked state (the footer says how to unlock).
let name = cards.get(sel).map(|c| short_label(&c.label)).unwrap_or("GPU");
let title = if controls.unlocked() {
format!(" controls · {name} ")
} else {
format!(" {name} · LOCKED ")
};
frame.render_widget(Paragraph::new(lines).block(Block::bordered().title(title)), area);
}
fn fmt_dur(d: Duration) -> String {
let s = d.as_secs();
let (days, rem) = (s / 86_400, s % 86_400);
format!("{days}d {:02}:{:02}:{:02}", rem / 3600, (rem % 3600) / 60, rem % 60)
}
/// Current wall-clock time of day as `HH:MM:SS` (UTC; no timezone dep).
fn utc_hms() -> String {
let secs = SystemTime::now().duration_since(UNIX_EPOCH).map(|d| d.as_secs()).unwrap_or(0);
format!("{:02}:{:02}:{:02}", (secs / 3600) % 24, (secs / 60) % 60, secs % 60)
}