FreeForGemPearl — Pearl (PRL) miner with a feature nobody else has: --auto-uv
When you overclock a GPU, the real limit is invisible by ordinary means:
❌ No rejected/invalid shares — the pool accepts everything
❌ No Xid errors in dmesg
❌ No artifacts, no crashes
But right at the edge, the card starts producing silent wrong results: one matrix op in thousands computes differently. The pool won't flag it as a reject — the share just vanishes. You think you're mining at 100% while silently losing valid shares.
--auto-uv fixes this: the miner walks up the V/F offset in 15 MHz steps and verifies every step bit-exactly — the same work is re-run on the GPU and compared against the CPU result. If a single bit differs, the step is rejected and it steps back 15 MHz.
Real example on an RTX 3070:
+240 ok → +255 ok → +270 FAILED (transcript words diverge on rerun 480) → back to +240
Result: 98.4 → 86.5 W at the same 70 TH/s. You'd never find this by hand — the card never "complained".
State is saved per GPU (UUID + driver + kernel), re-checked every 6 h, auto step-back on reject bursts. On a 4070 Ti there is not a single bit error up to the +300 cap across 1500–2500 MHz — huge headroom you didn't know you had.
Measured on live rigs (LuckyPool):
8× RTX 3070 (lock 1650/810):
— miner-reported: 589.4 TH/s @ ~914 W, 0 rejected
— pool averages (dashboard): 723 / 623 / 630 TH/s over 1h/6h/24h
RTX 4070 Ti (lock 2100, auto-uv +300): 94.8 TH/s @ ~135 W (0.70 TH/W)
1× RTX 3070 (lock 1560 + auto-uv): 70.2 TH/s, 86.5 W after undervolt
⚠️ For 40xx: the kernel is tuned for sm86 — peak at 1900–2100 MHz; above that hashrate degrades (51 TH/s at 2300). Best 4070 Ti efficiency: 1900 MHz → 86 TH/s @ 118 W (0.73 TH/W).
1% dev fee. Windows / Linux / HiveOS. Ready-made start files for LuckyPool and Kryptex, gzip-compressed proofs (~90× less traffic per share), NOCK merge mining on LuckyPool (pays NOCK for the same work).
Not supported: pearlhash.xyz — that pool uses a proprietary binary protocol, not JSON stratum (support planned).
Releases:
https://github.com/pepsykolya/FreeForGemPear/releasesWhat's new in 1.4.8
Three new options for the optional --auto-uv undervolt tuner:
--uv-min N: the offset the tuner starts from and never goes below. Default: the offset already set in HiveOS / the driver, or 120 if none. (Before, tuning always started at the card's current offset.)
--uv-step N: MHz per tuning step (default 15).
--uv-keep-last: after a failed step, keep the last good step instead of the default (last good step minus one step of margin).
These only affect --auto-uv; mining and the kernel are unchanged (v1pb-k8192, label 3616f6e6). Validated on an RTX 3070: --uv-min 150 started the search at +150 and stepped up by 15 MHz, restoring the card's own offset on exit.
Since 1.4.7
Per-device m on mixed-SM rigs. Until now a rig with different GPU models used one m (the default 47104) on every card, so cards that are not 46-SM carried a partial-wave "tail". Now each GPU uses the m matched to its own SM count (m = 128 * SM * r): the miner builds one job per SM group and each card mines its own. Measured gains from the right m (same kernel, same power): RTX 3070 (46 SM) stays at 47104; RTX 4070 Laptop (36 SM) uses 36864, about +4-8%; other non-46-SM Ampere/Ada cards (3060 Ti, 3070 Ti, 3080, 3090, 4070 Ti) likewise pick their own m. Validated live on a mixed 3070 + 4070 Ti rig: banner m per device [47104, 61440], both cards mine at their own m, the pool accepts shares, 0 rejected. On a homogeneous rig (e.g. all 3070) nothing changes: one shared job as before. FFGP_M still overrides with one m on every device.
Kernel unchanged (v1pb-k8192, label 3616f6e6).
Since 1.4.6
Larger default m: +0.38% hashrate at the same power. The default number of A-rows per attempt, m, is raised from 23552 to 47104. This amortizes the per-attempt prologue/epilogue over more row-blocks, with the same kernel. Measured on an RTX 3070 (1560/810 MHz, 135 W): kernel bench 70.30 → 70.57 TMAC/s (reproducible); self-test PASSED; a LuckyPool run accepted 8/8 shares, 0 rejected, ~70.57 TH/s. Cost: slightly more host RAM (m*k bytes of a_base per job) and a marginally larger Merkle tree per proof.
FFGP_M overrides m (a multiple of 128, in 1024..1048576). On a homogeneous rig the miner auto-picks m from the GPUs' SM count (m = 128 * SM * r): an RTX 3070 (46 SM) resolves to exactly 47104; mixed-SM rigs and any FFGP_M keep 47104. The +0.38% is measured on 46-SM (3070) cards; other SM counts use the same formula and every value is self-test-validated bit-exactly.
Kernel unchanged from 1.3.0–1.4.5 (v1pb-k8192, label 3616f6e6).
--auto-uv: saved undervolt results (uv.json) now record the m they were found at and are reused only when driver + kernel + m all match; changing m re-runs the undervolt check.
https://github.com/pepsykolya/FreeForGemPear/releases/tag/v1.4.8