Ciao a tutti

una delle potenzialità maggiori che abbiamo oggi quasi in ogni PC, è la capacità estrema che offre la GPU di processare tanti dati in maniera parallela

Basti considerare che un normale processore Intel (o AMD) che sia ha al suo interno nei sistemi mobili 2 o 4 core al massimo mentre dai 4 ai 10 core per i sistemi desktop e fino a 24 core per i sistemi server, mentre una GPU commerciale nVidia conta i core a multipli di 100 anche con i modelli di fascia medio-bassa

Detto questo, è ovvio pensare che il risultato è drasticamente diverso se eseguiamo codice parallelo su CPU o su GPU. Infatti crittografia, cracking, mining di Bitcoin e tante altre funzioni simili, dove si lavora di matematica su super set di dati, le GPU sono la scelta migliore

La domanda che molti si pongono è: noi che siamo DEV microsoftiani, e non vogliamo programmare in C++ o Assembly dentro un firmware, come possiamo accedere a questa potenzialità? Semplice, con l’architettura CUDA di nVidia abbiamo accesso alla GPU e con librerie di cross-compilazione (tipo come fa Xamarin per farci lavorare su iOS/Android) possiamo poi programmare in C# e lasciar tradurre il ns. codice in quello nativo della GPU

La libreria che andremo ad usare è Cudafy.NET (https://cudafy.codeplex.com/) che andremo a prendere tramite NuGet con questo nome: CUDAfy.NET (ad oggi, in v1.29). Per far funzionare il tutto, ho scaricato il pacchetto completo da Codeplex, poi registrato gli assembly ed aggiunto due chiavi nelle variabili di sistema, altrimenti il loro interprete non riuscirà a compilare i nostri metodi visibili CUDA. Nel progetto, per comodità, ho comunque registrato il pacchetto NuGet.

 

Senza entrare nei tecnicismi, la GPU a differenza della CPU usa una programmazione potremmo dire più elementare: abbiamo N parametri in input, li mettiamo tutti nell’area di memoria della GPU, compiliamo uno o più metodi per la GPU, la inviamo sempre nella GPU, allochiamo (si come si faceva con il C) un’area di memoria per i risultati, e diamo il via alle danze. Poi ci prendiamo i risultati ed eventualmente li andiamo a ricollegare ai rispettivi parametri in ingresso

Di seguito un esempio elementare di un’addizione con due soli parametri ed un mini-array di dimensione 1 per il risultato

using Cudafy;
using Cudafy.Host;
using Cudafy.Translator;

 

//MAIN

var km = CudafyTranslator.Cudafy();
var gpu = CudafyHost.GetDevice(CudafyModes.Target);
gpu.LoadModule(km);

//simple add operation in CUDA
int a = 5, b = 6, c;

int[] out_array = gpu.Allocate<int>();
gpu.Launch().add(a, b, out_array);
gpu.CopyFromDevice(out_array, out c);

Console.WriteLine($”{a} + {b} = {c}”);
gpu.FreeAll();

Console.ReadLine();

 

//metodo fuori il Main decorato con l’attributo Cudafy per renderlo visibile alla GPU

[Cudafy]
public static void add(int a, int b, int[] c)
{
    c[0] = a + b;
}

 

 

Presto ulteriori post con esempi più completi