87 lines
5.7 KiB
C++
87 lines
5.7 KiB
C++
// Generated by igneum-pow export (generator v2) for seed "igneum-epoch/edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07/day/69676e65756d2d6461792ffa50000000000000". 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-epoch/edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07/day/69676e65756d2d6461792ffa50000000000000"
|
|
#define IGNEUM_SEED_BYTES_HEX "edc4fa844da9dc98d37e965176f6558a31560e40502ab3ae5491b21aaaabfb07"
|
|
#define IGNEUM_GENERATOR 4
|
|
#define IGNEUM_PROGRAM_ATTEMPT 0
|
|
#define IGNEUM_PROGRAM_ID 0xc120d7963abdcd96ull
|
|
#define IGNEUM_DAY_STRING "bytes:69676e65756d2d6461792ffa50000000000000"
|
|
#define IGNEUM_DAY_BYTES_HEX "69676e65756d2d6461792ffa50000000000000"
|
|
#define IGNEUM_DAY0 0xceed56d7u
|
|
#define IGNEUM_DAY1 0x9ba270d2u
|
|
#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=15 shfl=6 mad=4 or=4 rotl=4 rotr=4 xor=4 mulhi=3 mul=2 sub=2"
|
|
// Program class v4 (Counter ASIC 3.0, docs/plans/counter-asic-3-node.md): generator version 4, class v3 plus the
|
|
// latency-shadow block (IGNEUM_SHADOW_INSTRS x IGNEUM_SHADOW_REPS per iteration); a worker that runs another class
|
|
// refuses this pack, and a job line names the class it wants (class=v4 era=<hex>).
|
|
#define IGNEUM_PROGRAM_CLASS "v4"
|
|
#define IGNEUM_ERA_SEED_HEX "5e0587f455a86e91e4990f5c481a34cca0044d3f3ae519adcae58ddc82885d31"
|
|
// Class v3 construction (Counter ASIC 2.0, 5 October 2026, docs/plans/mixer-x4.md): version 2 loads; the dataset item
|
|
// derivation applies the mixer IGNEUM_MIXER_MULT times per round (memhard.h), and the cache follows the growth rule.
|
|
#define IGNEUM_LOAD_CLASS "mx8-era4488f3ed+sh256x27"
|
|
#define IGNEUM_CLASS_MIXER_MULT 8
|
|
#define IGNEUM_CACHE_GROWTH 1 // 1: cache words = 2^(26 + doublings(day)), doublings = floor(log2(1 + day / 1460))
|
|
#define IGNEUM_LOAD_SLOTS 16
|
|
#define IGNEUM_LOAD_MIX { 100, 0, 0 }
|
|
#define IGNEUM_LOAD_WIDTH_COUNTS { 16, 0, 0 } // loads of 4, 16, 64 bytes per program
|
|
#define IGNEUM_BYTES_PER_HASH 512
|
|
#define IGNEUM_FOLD_ROT 11
|
|
#define IGNEUM_FOLD_MUL 0x9e3779b1u
|
|
// Era layout (5 October 2026, docs/plans/era-layout.md): NOT the lottery hash. Every dataset load reads
|
|
// idx = ((rotl(src * STRIDE_MUL, STRIDE_ROT) & window mask) | window offset) & MASK; the window of a load site is the
|
|
// dataset, a half or a quarter of it (IGNEUM_ERA_WINDOWS: site:shrink:offset); dataset word w holds word j(w) of item
|
|
// t(w) with j's bits at the INTERLEAVE positions (memhard.h: mh_t, mh_j, mh_addr).
|
|
#define IGNEUM_ERA_LABEL "4488f3ed"
|
|
#define IGNEUM_ERA_SEED_WORDS { 0x4488f3edu, 0x3cf22d2au, 0xb3e8271eu, 0x55754277u, 0xc2b1c4c7u, 0x8e627302u, 0x584d5acdu, 0xc31dd01du }
|
|
#define IGNEUM_ERA_ALLOWED_WIDTHS { 1, 0, 0 } // words, ascending, 0 = unused; one entry pins the width
|
|
#define IGNEUM_ERA_WIDTH_WORDS 1
|
|
#define IGNEUM_ERA_STRIDE_MUL 0x4d38603du
|
|
#define IGNEUM_ERA_STRIDE_ROT 10
|
|
#define IGNEUM_ERA_INTERLEAVE { 2, 9, 13, 15 }
|
|
#define IGNEUM_ERA_WINDOWS "7:2:1 8:1:1 9:1:1 10:1:1 11:0:0 13:1:1 29:0:0 30:2:2 31:1:1 44:1:1 46:2:0 47:0:0 52:0:0 56:0:0 58:2:0 63:1:1"
|
|
// Latency-shadow block (Counter ASIC 3.0 item 8, docs/analysis/latency-shadow-2026-10-06.md): NOT the lottery hash. A block of
|
|
// IGNEUM_SHADOW_INSTRS ALU instructions (the ten non-load families) runs IGNEUM_SHADOW_REPS times at the end of every
|
|
// iteration; the 16 loads, the acceptance rule and the base program are the class's without the shadow.
|
|
#define IGNEUM_SHADOW_INSTRS 256
|
|
#define IGNEUM_SHADOW_REPS 27
|
|
#define IGNEUM_SHADOW_INSTRS_PER_HASH 55296
|
|
#define IGNEUM_SHADOW_OP_MIX "add=43 shfl=39 xor=29 mul=27 mad=26 rotl=26 mulhi=20 rotr=18 or=14 sub=14"
|
|
// 0 = closed-form dataset (ds_elem), 1 = memory-hard cache construction (MEMHARD.md, memhard.h)
|
|
#define IGNEUM_DATASET_MODE 1
|
|
|
|
#define IGNEUM_SEEDW_INIT { 0x667d0fbdu, 0x7b8e5963u, 0x31c67e5eu, 0x4529ddc6u, 0xef19d6d8u, 0xaccf6211u, 0xda0aed32u, 0xabc6df31u }
|
|
#define IGNEUM_KEY_INIT { 0xceed56d7u, 0x9ba270d2u, 0x82caab2du, 0x81ebce0eu, 0x12b6ecf1u, 0xd0f3fd7cu, 0xd872eefeu, 0xc158c7bdu }
|
|
#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_MIXER_MULT 8 // mixer applications per round and after the last read (class v3, docs/plans/mixer-x4.md)
|
|
#define IGNEUM_MIX_ROT_INIT { 17u, 12u, 20u, 23u, 7u, 3u, 27u, 16u }
|
|
#define IGNEUM_MIX_MUL_INIT { 0xf351d601u, 0xa3bb398fu, 0xb5a09e35u, 0x7509c9c1u, 0x6bbf31e9u, 0xfc849a79u, 0xded91851u, 0x8d9113d1u, 0x0ff15225u, 0x3a5bdd41u, 0xab533435u, 0xe1c55ad5u, 0xe6d3bd0du, 0x9d9ffbbdu, 0xbb2a3cf3u, 0x50a7c08du }
|
|
#define IGNEUM_MIX_RC_INIT { 0xc6892460u, 0x25b7228au, 0xcd515004u, 0x2846527au, 0xa6324241u, 0x36e3ec53u, 0x82961bacu, 0x0f97ba7du, 0xb6f921a9u, 0x3ada24e5u, 0xde20ab91u, 0x5378eeb2u, 0x7d161662u, 0x89353cc1u, 0xb1aa03a2u, 0x788acae6u }
|
|
|
|
#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
|