Aggiungi versione GPU (CUDA) del bruteforce

Porta la stessa strategia algoritmica della versione CPU (batch EC in
coordinate Jacobiane con Z1=1 + un'unica inversione di campo per batch
via trucco di Montgomery) su GPU NVIDIA, dove però GMP non è
disponibile: l'aritmetica a 256 bit mod il primo di secp256k1 è scritta
a mano (limb a 64 bit + __int128, riduzione veloce sfruttando
2^256 ≡ 2^32+977 mod p), e ogni thread CUDA agisce come una lane di
ricerca indipendente con la propria chiave privata iniziale casuale —
esattamente come un thread CPU, ma migliaia in parallelo invece di una
manciata.

La moltiplicazione scalare su device è un semplice double-and-add
(nessun wNAF/tabelle precalcolate come in libsecp256k1 lato host), il
principale margine di ottimizzazione futura. Il matching usa un Bloom
filter + ricerca binaria su un array di target ordinato, entrambi
caricati una volta sola in memoria device.

Aggiunge i target `make gpu` / `make gpu-info` al Makefile (NVCC_ARCH
configurabile, default sm_61/Pascal) e documenta in README che su WSL2
il driver NVIDIA arriva dall'host Windows: dentro WSL serve installare
solo il CUDA Toolkit, mai un driver.

Verificato: aritmetica di campo, moltiplicazione scalare e batch add
confrontati bit-per-bit con secp256k1_ec_pubkey_create (nessuna
discrepanza su ~30 valori di test); run end-to-end con privkey nota
trova la chiave corretta; nessun falso positivo su chiavi pubbliche
valide casuali. Su una Quadro P4000 (Pascal): ~15M keys/sec, contro
~3.5-4M keys/sec della CPU con 11 thread nello stesso ambiente.
This commit is contained in:
2026-07-03 15:58:26 +02:00
parent adb608df38
commit ac68b6aa88
5 changed files with 820 additions and 8 deletions
+26
View File
@@ -54,6 +54,32 @@ make
---
## Versione GPU (CUDA)
Se hai una GPU NVIDIA con driver e CUDA Toolkit disponibili, la versione GPU
usa la stessa strategia algoritmica di quella CPU (batch EC in coordinate
Jacobiane + una sola inversione di campo per batch) ma su migliaia di thread
paralleli invece che su una manciata di core.
```bash
cd bruteforce
make gpu-info # verifica driver NVIDIA (nvidia-smi) e CUDA Toolkit (nvcc)
make gpu # compila (default: sm_61 / Pascal — sovrascrivi con NVCC_ARCH per altre GPU)
./p2pk_bruteforce_gpu
```
Su una Quadro P4000 (Pascal, 2016) si osservano ~15M keys/sec, contro i
~300K-2M keys/sec della CPU — ma la moltiplicazione scalare su GPU non è
ottimizzata quanto quella di libsecp256k1 (niente wNAF/tabelle precalcolate),
quindi il margine di ulteriore miglioramento è ancora ampio su GPU più
recenti.
> **Nota (WSL2)**: il driver NVIDIA arriva dal sistema Windows host (basta
> che `nvidia-smi` funzioni già) — dentro WSL serve installare solo il CUDA
> Toolkit, mai un driver.
---
## Utilizzo
### 1. Prepara il File Target