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:
parent
0b3cf78bb0
commit
1321907aa6
5 changed files with 133 additions and 13 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue