Ho lavorato su un codice MOLTO calcolo intensivo in (gasp!) C #.
Sto costruendo un'implementazione GPGPU di FDTD per la modellazione ottica. Su un piccolo cluster (128 processori), molte delle nostre simulazioni impiegano settimane per essere eseguite. Le implementazioni della GPU, tuttavia, tendono a funzionare circa 50 volte più velocemente - e questo è su una scheda NVidia di livello consumer. Ora disponiamo di un server con due schede a doppio processore GTX295 (diverse centinaia di core) e riceviamo presto Tesla.
In che modo questo riguarda la tua lingua? Nello stesso modo in cui il codice FDTD C ++ che stavamo usando prima era legato alla CPU, questi sono vincolati alla GPU, quindi la differenza ( molto piccola) del codice gestito vs nativo non viene mai giocare. L'app C # funge da conduttore - carica i kernel OpenCL, trasferendo i dati da e verso le GPU, fornendo l'interfaccia utente, i rapporti, ecc. - tutte le attività che sono un rompicapo in C ++.
Negli anni passati, la differenza di prestazioni tra codice gestito e non gestito era abbastanza significativa che a volte valeva la pena affrontare il terribile modello a oggetti di C ++ per ottenere un'ulteriore percentuale 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 delle tue differenze in termini di prestazioni non deriveranno dalla tua lingua, ma dalle abilità del tuo sviluppatore. Alcune settimane fa, ho spostato un'operazione a singola divisione dall'interno di un ciclo a triplo nidificato (3D array traversal), che riduceva del 15% il tempo di esecuzione per un dato dominio computazionale. Questo è il risultato dell'architettura del processore: la divisione è lenta, che è una di quelle facce che hai appena bisogno di aver raccolto da qualche parte.