Nothing changes for the default class: the pinned packs are byte-identical (tests/packs.rs), the v2 draw stream is untouched.
LoadClass {mix, load_slots, scratch}: fixed widths w16, w64, w64x4 (4 loads of 64 B), era mixes 50/35/15 and 25/50/25 drawn per load with one extra below(100) roll, and the scratch variant scr0/2/4/8 (persistent warps, 1 MiB per warp, tagged lazy fill, measurement only). A wide load reads the W-aligned address and folds every word: x = dst ^ w0; x = (rotl(x, 11) * 0x9e3779b1) ^ w[j]. Program ids carry the class. proto-opencl/host.c taken from opencl-rdna4 20ceac6 (--memprobe, select read-back).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
60 lines
3.2 KiB
C++
60 lines
3.2 KiB
C++
// Generated by igneum-pow export (generator v2) for seed "igneum-readwidth/A/2". Do not edit by hand.
|
|
// Program metadata for host.cu plus the launch wrappers defined in kernel.cu.
|
|
// Also included by proto-opencl/host.c (C99), which defines IGNEUM_NO_CUDA first and reads only the macros.
|
|
#pragma once
|
|
#ifdef __cplusplus
|
|
#include <cstdint>
|
|
#else
|
|
#include <stdint.h>
|
|
#endif
|
|
#ifndef IGNEUM_NO_CUDA
|
|
#include <cuda_runtime.h>
|
|
#endif
|
|
|
|
#define IGNEUM_SEED_STRING "igneum-readwidth/A/2"
|
|
#define IGNEUM_SEED_BYTES_HEX "69676e65756d2d7265616477696474682f412f32"
|
|
#define IGNEUM_GENERATOR 2
|
|
#define IGNEUM_PROGRAM_ATTEMPT 0
|
|
#define IGNEUM_PROGRAM_ID 0x11d47bbfc868120eull
|
|
#define IGNEUM_DAY_STRING "2026-10-03"
|
|
#define IGNEUM_DAY_BYTES_HEX "6461792f323032362d31302d3033"
|
|
#define IGNEUM_DAY0 0x3067619fu
|
|
#define IGNEUM_DAY1 0x3c269176u
|
|
#define IGNEUM_DATASET_LOG2 28
|
|
#define IGNEUM_MASK 0x0fffffffu
|
|
#define IGNEUM_LANES 32
|
|
#define IGNEUM_ITERATIONS 8
|
|
#define IGNEUM_INSTR_COUNT 64
|
|
#define IGNEUM_LOADS_PER_HASH 128
|
|
#define IGNEUM_WIDE_LOADS_PER_HASH 0
|
|
#define IGNEUM_OP_MIX "load=16 add=10 mul=7 mulhi=7 xor=7 shfl=6 rotl=4 rotr=4 mad=3"
|
|
// Read-width experiment (5 October 2026, docs/plans/read-width.md): NOT the lottery hash. A load of W words reads
|
|
// the W-word-aligned address and folds every word into dst: x = dst ^ w[0]; x = (rotl(x, 11) * 0x9e3779b1) ^ w[j]; dst = x.
|
|
#define IGNEUM_LOAD_CLASS "mix50-35-15"
|
|
#define IGNEUM_LOAD_SLOTS 16
|
|
#define IGNEUM_LOAD_MIX { 50, 35, 15 }
|
|
#define IGNEUM_LOAD_WIDTH_COUNTS { 8, 5, 3 } // loads of 4, 16, 64 bytes per program
|
|
#define IGNEUM_BYTES_PER_HASH 2432
|
|
#define IGNEUM_FOLD_ROT 11
|
|
#define IGNEUM_FOLD_MUL 0x9e3779b1u
|
|
// 0 = closed-form dataset (ds_elem), 1 = memory-hard cache construction (MEMHARD.md, memhard.h)
|
|
#define IGNEUM_DATASET_MODE 1
|
|
|
|
#define IGNEUM_SEEDW_INIT { 0x774fd410u, 0x520f91b2u, 0x9357786fu, 0x8bbe44d7u, 0x23db18feu, 0x52022aecu, 0x653ea608u, 0x57788e47u }
|
|
#define IGNEUM_KEY_INIT { 0x3067619fu, 0x3c269176u, 0x84a03b03u, 0xf8c63294u, 0xff977c5bu, 0xe60def3eu, 0x63630141u, 0xb8fbcb58u }
|
|
#define IGNEUM_CACHE_LOG2_WORDS 26
|
|
#define IGNEUM_CACHE_SEGMENT_LOG2_LINES 6
|
|
#define IGNEUM_CACHE_SEGMENTS 65536u
|
|
#define IGNEUM_ITEM_ROUNDS 8
|
|
#define IGNEUM_MIX_ROT_INIT { 20u, 20u, 19u, 4u, 26u, 3u, 3u, 27u }
|
|
#define IGNEUM_MIX_MUL_INIT { 0x42146205u, 0x52cbe0fbu, 0x7ecf4a03u, 0x6728907fu, 0xd81d9751u, 0x132952c3u, 0xf60de277u, 0x05358035u, 0xbaf6499du, 0xe4db9667u, 0x3e98f45du, 0xd0004eddu, 0x2691630du, 0x9beb3bcfu, 0xab310379u, 0x99cfb423u }
|
|
#define IGNEUM_MIX_RC_INIT { 0xbab68293u, 0xcc162340u, 0x6ce151ccu, 0xe62b8997u, 0xc9c80297u, 0xf74a1654u, 0x3d704af5u, 0x3cf522b7u, 0x2b9cac04u, 0xa880ac10u, 0x13e5dd1du, 0x6fc3e233u, 0x2d83eeacu, 0x9006e8bfu, 0x2c4b5362u, 0x31b49ee2u }
|
|
|
|
#ifndef IGNEUM_NO_CUDA
|
|
// Defined in kernel.cu. All launch on the default stream and return cudaGetLastError().
|
|
cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments);
|
|
cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems);
|
|
cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask,
|
|
uint32_t nonces, uint32_t blockWarps);
|
|
cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps);
|
|
#endif
|