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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user