Ho quasi finito con un algoritmo che elabora alcuni interi molto grandi (dell'ordine di 2 elevato alla potenza di 100.000.000). Ciò richiede un paio di ore di codice altamente parallelo su un server 16 core con una memoria più che sufficiente poiché l'algoritmo non richiede molta memoria. Faccio uso della classe BigInteger in .NET 4.Utilizzo della GPU per accelerare i calcoli BigInteger
Le specifiche del algoritmo non sono importanti, ma per il contesto, che segue è una lista abbastanza esaustivo di operazioni eseguite su questi numeri interi e alcune caratteristiche salienti dell'algoritmo:
- Addizione/sottrazione.
- Moltiplicazione di un gran numero di piccoli numeri.
- Divisione di numeri grandi in base a numeri molto piccoli (ad esempio 2).
- Base 2 Log.
- Base 2 Potenza.
- Confronto di due o più numeri grandi (Min/Max).
- Nessun coinvolgimento di sorta dei numeri primi.
- L'algoritmo è progettato in modo specifico per non richiedere un uso intensivo della memoria poiché il calo delle prestazioni dell'accesso alla memoria è superiore a quello di alcuni calcoli intelligenti al volo. Tuttavia, se l'accesso alla memoria dovesse migliorare, l'algoritmo potrebbe essere vantaggioso.
Ho ottimizzato il codice il più possibile e profilatura ora mostra solo due strozzature:
- Calculating base 2 log per tali grandi numeri.
- Verifica di modelli predefiniti di cifre binarie in questi numeri. Questo perché l'unico modo per accedere ai dati sottostanti di BigInteger è utilizzando innanzitutto ToByteArray piuttosto che le operazioni sul posto. Inoltre, il funzionamento su blocchi di dimensioni in byte non aiuta le prestazioni.
Considerando l'accesso alla memoria e le operazioni di registro, ho iniziato a pensare alle GPU e se potevo scaricare parte del lavoro in modo efficace. So molto poco delle GPU, tranne per il fatto che sono ottimizzate per le operazioni in virgola mobile.
La mia domanda è, utilizzando una libreria come GPU .NET, come posso elaborare numeri così grandi sulla GPU? Posso in qualche modo utilizzare le ottimizzazioni in virgola mobile per calcolare Log per numeri così grandi?
Alla ricerca di un punto di partenza per formare una strategia.
Avete considerato l'utilizzo di CUDAfy.NET? http://cudafy.codeplex.com/ (Attenzione, questo è specifico per NVIDIA, quindi forse non ti è utile) –