Ho lavorato su alcuni codici MOLTO ad alta intensità di calcolo in (gasp!) C #.
Sto realizzando un'implementazione GPGPU di FDTD per la modellazione ottica. Su un piccolo cluster (128 processori), molte delle nostre simulazioni richiedono settimane per l'esecuzione. Le implementazioni della GPU, tuttavia, tendono a funzionare circa 50 volte più velocemente - e questo è su una scheda NVidia di livello consumer. Ora abbiamo un server con due schede a doppio processore GTX295 (diverse centinaia di core), e presto otterremo alcune Teslas.
In che modo ciò riguarda la tua lingua? Allo stesso modo in cui il codice C ++ FDTD che stavamo usando prima era associato alla CPU, questi sono associati alla GPU, quindi la differenza ( molto piccola) di potenza tra il codice gestito e il codice nativo non entra mai in gioco. L'app C # funge da conduttore: caricamento dei kernel OpenCL, passaggio di dati da e verso le GPU, fornitura dell'interfaccia utente, reportistica, ecc., Tutte attività che sono un problema nel culo in C ++.
Negli anni passati, la differenza di prestazioni tra codice gestito e non gestito era abbastanza significativa che a volte valeva la pena sopportare il terribile modello a oggetti di C ++ per ottenere il extra percento di velocità. In questi giorni, il costo di sviluppo di C ++ vs C # supera di gran lunga i vantaggi per la maggior parte delle applicazioni.
Inoltre, la maggior parte della differenza di prestazioni non verrà dalla tua lingua scelta, ma dall'abilità del tuo sviluppatore. Alcune settimane fa, ho spostato un'operazione di divisione singola dall'interno di un ciclo a triplo annidamento (attraversamento di array 3D), che ha ridotto del 15% i tempi di esecuzione per un determinato dominio computazionale. Questo è il risultato dell'architettura del processore: la divisione è lenta, che è una di quelle facce che devi solo aver raccolto da qualche parte.