Site: footer rebuilt; litepaper reads one section at a time with chips on mobile, pager and a whole-paper mode

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-03 16:00:43 +00:00
parent c964a59dae
commit 0a1bfb8a12
5 changed files with 133 additions and 13 deletions

View file

@ -61,6 +61,7 @@ template<class T> cudaError_t cudaOccupancyMaxActiveBlocksPerMultiprocessor(int*
// Device intrinsics
inline unsigned int __umulhi(unsigned int a, unsigned int b) { return (unsigned int)(((uint64_t)a * (uint64_t)b) >> 32); }
unsigned int __shfl_xor_sync(unsigned int mask, unsigned int v, int laneMask, int width = 32);
unsigned int __shfl_sync(unsigned int mask, unsigned int v, int srcLane, int width = 32); // wide loads (lever b) broadcast lane 0
// Warp emulation
struct EmuWarp {

View file

@ -27,3 +27,13 @@ unsigned int __shfl_xor_sync(unsigned int, unsigned int v, int laneMask, int) {
warp_barrier(w);
return r;
}
unsigned int __shfl_sync(unsigned int, unsigned int v, int srcLane, int) {
EmuWarp* w = emu_current_warp;
unsigned lane = threadIdx.x & 31u;
w->slot[lane] = v;
warp_barrier(w);
unsigned int r = w->slot[(unsigned)srcLane & 31u];
warp_barrier(w);
return r;
}

View file

@ -287,15 +287,36 @@ static SizeResult runSize(const Options& o, int mib, uint64_t* dOut, uint32_t no
uint32_t idx = (uint32_t)z & mask;
uint32_t v = 0;
CUDA_CHECK(cudaMemcpy(&v, dDs + idx, sizeof(v), cudaMemcpyDeviceToHost));
#if IGNEUM_DATASET_MODE == 1
uint32_t want = host_ds_word(idx);
#else
uint32_t want = host_ds_elem(idx, IGNEUM_DAY0, IGNEUM_DAY1);
#endif
if (v != want) {
if (badRnd == 0) std::printf(" dataset[%u] = 0x%08x, host formula 0x%08x\n", idx, v, want);
if (badRnd == 0) std::printf(" dataset[%u] = 0x%08x, host %s 0x%08x\n", idx, v, IGNEUM_DATASET_MODE == 1 ? "derivation" : "formula", want);
++badRnd;
}
}
r.dsPass = (badHead == 0 && lastOk && badRnd == 0);
std::printf("dataset self-test: %s (head 16 vs Mac %s, element [MASK] vs Mac %s, 64 random points vs host formula %s)\n",
r.dsPass ? "PASS" : "FAIL", badHead == 0 ? "PASS" : "FAIL", lastText, badRnd == 0 ? "PASS" : "FAIL");
// The Mac's sampled words: every sample whose index lies inside this dataset size (items are the same
// at every size, the smaller dataset is a prefix of the larger one).
int badSample = 0, nSample = 0;
#ifdef IGNEUM_DS_SAMPLES
for (int k = 0; k < IGNEUM_DS_SAMPLES; ++k) {
if (IGNEUM_DS_SAMPLE_INDEX[k] > mask) continue;
++nSample;
uint32_t v = 0;
CUDA_CHECK(cudaMemcpy(&v, dDs + IGNEUM_DS_SAMPLE_INDEX[k], sizeof(v), cudaMemcpyDeviceToHost));
if (v != IGNEUM_DS_SAMPLE_VALUE[k]) {
if (badSample == 0) std::printf(" dataset[%u] = 0x%08x, Mac 0x%08x\n", IGNEUM_DS_SAMPLE_INDEX[k], v, IGNEUM_DS_SAMPLE_VALUE[k]);
++badSample;
}
}
#endif
r.dsPass = (badHead == 0 && lastOk && badRnd == 0 && badSample == 0);
std::printf("dataset self-test: %s (head 16 vs Mac %s, element [MASK] vs Mac %s, 64 random points vs host %s %s, %d Mac samples %s)\n",
r.dsPass ? "PASS" : "FAIL", badHead == 0 ? "PASS" : "FAIL", lastText,
IGNEUM_DATASET_MODE == 1 ? "derivation" : "formula", badRnd == 0 ? "PASS" : "FAIL",
nSample, nSample == 0 ? "none in pack" : (badSample == 0 ? "PASS" : "FAIL"));
}
// Vectors, standalone: one 32-thread block per base nonce, exactly like the Mac cross-check.
@ -410,6 +431,13 @@ int main(int argc, char** argv) {
SEEDW[0], SEEDW[1], SEEDW[2], SEEDW[3], SEEDW[4], SEEDW[5], SEEDW[6], SEEDW[7]);
std::printf("day \"%s\" (d0 0x%08x, d1 0x%08x), pack dataset 2^%d words = %d MiB\n",
IGNEUM_DAY_STRING, IGNEUM_DAY0, IGNEUM_DAY1, IGNEUM_DATASET_LOG2, packMib());
#if IGNEUM_DATASET_MODE == 1
std::printf("dataset construction: memory-hard (256 MiB ChaCha cache, %d dependent cache reads per 64-byte item; proto-metal/MEMHARD.md)\n", IGNEUM_ITEM_ROUNDS);
bool cachePass = setupCache();
#else
std::printf("dataset construction: closed-form ds_elem (the original prototype dataset, not memory-hard)\n");
bool cachePass = true;
#endif
uint32_t nonces = 1u << o.batchLog2;
if (nonces % (32u * (uint32_t)o.blockWarps) != 0u) {
@ -429,9 +457,10 @@ int main(int argc, char** argv) {
std::printf("\n=== summary (%s, pack %s, batch 2^%d x %d, %d warp(s)/block, GPU-event time) ===\n",
prop.name, IGNEUM_SEED_STRING, o.batchLog2, o.batches, o.blockWarps);
std::printf("| dataset MiB | fill ms (second) | Mhash/s | GB/s useful | random loads/s (G) | loads/hash | dataset self-test | vectors |\n");
std::printf("| dataset MiB | %s ms (second) | Mhash/s | GB/s useful | random loads/s (G) | loads/hash | dataset self-test | vectors |\n",
IGNEUM_DATASET_MODE == 1 ? "build" : "fill");
std::printf("|---|---|---|---|---|---|---|---|\n");
bool overall = true, anyVec = false;
bool overall = cachePass, anyVec = false;
for (size_t i = 0; i < results.size(); ++i) {
const SizeResult& r = results[i];
overall = overall && r.dsPass && (!r.vecChecked || r.vecPass);
@ -442,6 +471,10 @@ int main(int argc, char** argv) {
r.dsPass ? "PASS" : "FAIL",
r.vecChecked ? (r.vecPass ? "PASS (3 warps, standalone and in batch)" : "FAIL") : "skipped (not pack size)");
}
#if IGNEUM_DATASET_MODE == 1
std::printf("cache: GPU fill %.2f ms (second), host fill %.1f ms one thread, cache check %s\n", gCacheFillSecondMs, gCacheHostMs, cachePass ? "PASS" : "FAIL");
CUDA_CHECK(cudaFree(gCache));
#endif
if (!anyVec) std::printf("NOTE: no vectors were checked. Run at %d MiB (the default) to verify against the Mac.\n", packMib());
std::printf("OVERALL: %s\n", overall ? "PASS" : "FAIL");
return overall ? 0 : 1;

View file

@ -163,8 +163,16 @@ pre{margin:0;font-family:'IBM Plex Mono',monospace;font-size:13px;line-height:1.
.band .wrap{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:24px;padding-block:56px}
.band h2{font-weight:900;font-size:clamp(26px,3.5vw,36px)}
.band p{font-size:16px;max-width:56ch}
footer .wrap{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:20px;padding-block:40px 48px;font-size:14px;color:var(--ash)}
footer .fl{display:flex;flex-wrap:wrap;gap:20px}
footer{border-top:1px solid var(--line)}
footer .wrap{padding-block:48px 32px}
.foot-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:32px}
.foot-brand{display:flex;flex-direction:column;gap:12px;max-width:34ch}
.foot-brand p{color:var(--ash);font-size:14px}
.foot-col{display:flex;flex-direction:column;gap:10px;font-size:15px}
.foot-col .eyebrow{margin-bottom:4px}
.foot-col a{color:var(--ink-2)}
.foot-col a:hover{color:var(--molten)}
.foot-base{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 24px;margin-top:36px;padding-top:20px;border-top:1px solid var(--line);font-size:13px;color:var(--ash)}
</style>
</head>
<body>
@ -393,11 +401,27 @@ footer .fl{display:flex;flex-wrap:wrap;gap:20px}
<footer>
<div class="wrap">
<div class="brand"><svg viewBox="0 0 100 100" width="22" height="22" aria-hidden="true"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></svg><span class="word" style="font-size:14px;color:var(--bone)">IGNEUM</span><span>· nothing on this page is an offer to sell anything</span></div>
<div class="fl">
<a href="/litepaper">Litepaper</a>
<a href="https://github.com/[second-owner-login]/igneum" rel="noopener" style="display:inline-flex;align-items:center;gap:6px"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"/></svg>GitHub</a>
<a href="#journey">Journey</a>
<div class="foot-grid">
<div class="foot-brand">
<div class="brand"><svg viewBox="0 0 100 100" width="26" height="26" aria-hidden="true"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></svg><span class="word" style="font-size:16px;color:var(--bone)">IGNEUM</span></div>
<p>Mined by GPUs. Proven by fire.</p>
</div>
<nav class="foot-col" aria-label="Read">
<div class="eyebrow">Read</div>
<a href="/litepaper">Litepaper</a>
<a href="/litepaper#limits">What Igneum does not claim</a>
<a href="/litepaper#randomx">Igneum vs RandomX</a>
</nav>
<nav class="foot-col" aria-label="Follow">
<div class="eyebrow">Follow</div>
<a href="#journey">Journey</a>
<a href="https://github.com/[second-owner-login]/igneum" rel="noopener" style="display:inline-flex;align-items:center;gap:6px"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"/></svg>GitHub</a>
<a href="#mine">Get the miner</a>
</nav>
</div>
<div class="foot-base">
<span>© 2026 Igneum. Nothing on this page is an offer to sell anything.</span>
<span class="mono">igneum.network</span>
</div>
</div>
</footer>

View file

@ -79,6 +79,30 @@ td.num{font-family:'IBM Plex Mono',monospace;font-variant-numeric:tabular-nums;w
pre{margin:0 0 16px;padding:16px 18px;background:var(--code);color:var(--code-ink);border-radius:12px;font-family:'IBM Plex Mono',monospace;font-size:13px;line-height:1.6;overflow-x:auto}
.foot{padding-block:28px 48px;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:16px 32px;justify-content:space-between;font-size:14px;color:var(--quiet)}
.mark{flex:0 0 auto}
article section{display:none;border-top:0;padding-top:0}
article section.active{display:block}
body.all article section{display:block;border-top:1px solid var(--line);padding-top:34px}
body.all article section:first-of-type{border-top:0;padding-top:0}
.toc li a.active{background:var(--tint);color:var(--ink);font-weight:600}
.toc li a.active::before{color:var(--ember)}
.toc .mode{margin-top:14px;display:flex;gap:8px}
.toc .mode button{flex:1;min-height:40px;border-radius:8px;border:1px solid var(--line);background:var(--surface);color:var(--ink-2);font:inherit;font-size:13px;cursor:pointer}
.toc .mode button.on{background:var(--ink);color:var(--ground);border-color:var(--ink)}
.pager{display:flex;justify-content:space-between;gap:12px;margin-top:36px;padding-top:22px;border-top:1px solid var(--line)}
.pager a{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 16px;border:1px solid var(--line);border-radius:10px;color:var(--ink);font-size:14px;max-width:48%}
.pager a:hover{text-decoration:none;border-color:var(--ember)}
.pager a span{color:var(--quiet);font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:.12em;text-transform:uppercase}
.pager a.next{margin-left:auto;text-align:right}
body.all .pager{display:none}
@media (max-width:959px){
.toc{position:sticky;top:0;z-index:5;background:var(--ground);margin-inline:-16px;padding:10px 16px;border-bottom:1px solid var(--line)}
.toc ol{flex-direction:row;overflow-x:auto;gap:6px;scrollbar-width:none;-webkit-overflow-scrolling:touch;padding-bottom:2px}
.toc ol::-webkit-scrollbar{display:none}
.toc li a{white-space:nowrap;border:1px solid var(--line);border-radius:999px;padding:8px 12px;font-size:13px;gap:6px}
.toc li a::before{min-width:0}
.toc .dl{display:none}
.toc .mode{margin-top:8px}
}
@media (prefers-reduced-motion:no-preference){.pull{transition:transform .2s}}
</style>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpolygon points='50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34' fill='%23F2541B'/%3E%3C/svg%3E">
@ -126,6 +150,7 @@ pre{margin:0 0 16px;padding:16px 18px;background:var(--code);color:var(--code-in
<li><a href="#builders-ask">Questions builders ask</a></li>
<li><a href="#limits">What Igneum does not claim</a></li>
</ol>
<div class="mode" role="group" aria-label="Reading mode"><button type="button" id="m-tabs" class="on">One section at a time</button><button type="button" id="m-all">Whole paper</button></div>
<div class="dl">Latin igneum: fiery. A cupel is the vessel in which metal is proven by fire.</div>
</nav>
@ -449,5 +474,32 @@ pre{margin:0 0 16px;padding:16px 18px;background:var(--code);color:var(--code-in
</footer>
</div>
<script>
(function(){
var secs=Array.prototype.slice.call(document.querySelectorAll('article section'));
var links=Array.prototype.slice.call(document.querySelectorAll('.toc ol a'));
var ids=secs.map(function(s){return s.id;});
var mAll=document.getElementById('m-all'),mTabs=document.getElementById('m-tabs');
var all=false;try{all=localStorage.getItem('lp-mode')==='all';}catch(e){}
secs.forEach(function(s,i){
var pager=document.createElement('div');pager.className='pager';
if(i>0){var a=document.createElement('a');a.href='#'+ids[i-1];a.innerHTML='<span>previous</span> '+secs[i-1].querySelector('h2').textContent;pager.appendChild(a);}
if(i<secs.length-1){var b=document.createElement('a');b.href='#'+ids[i+1];b.className='next';b.innerHTML=secs[i+1].querySelector('h2').textContent+' <span>next</span>';pager.appendChild(b);}
s.appendChild(pager);
});
function show(id,scroll){
if(ids.indexOf(id)<0)id=ids[0];
secs.forEach(function(s){s.classList.toggle('active',s.id===id);});
links.forEach(function(l){var on=l.getAttribute('href')==='#'+id;l.classList.toggle('active',on);if(on&&l.scrollIntoView&&window.innerWidth<960){try{l.scrollIntoView({block:'nearest',inline:'center'});}catch(e){}}});
if(scroll){var top=document.querySelector('article').getBoundingClientRect().top+window.scrollY-(window.innerWidth<960?70:24);window.scrollTo({top:Math.max(0,top),behavior:'smooth'});}
}
function setMode(a){all=a;document.body.classList.toggle('all',all);mAll.classList.toggle('on',all);mTabs.classList.toggle('on',!all);try{localStorage.setItem('lp-mode',all?'all':'tabs');}catch(e){}}
mAll.addEventListener('click',function(){setMode(true);});
mTabs.addEventListener('click',function(){setMode(false);show(location.hash.slice(1),false);});
window.addEventListener('hashchange',function(){show(location.hash.slice(1),true);});
setMode(all);
show(location.hash.slice(1),false);
})();
</script>
</body>
</html>