2013-03-30 15 views
15

Il mio software di grafica 3D, scritto in C# con SlimDX, esegue molte operazioni vettoriali sulla CPU. (In questa situazione specifica, non è possibile scaricare il lavoro sulla GPU).Fast Vector Math in .NET - Quali sono le opzioni?

Come posso rendere più veloce la matematica vettoriale? Finora, ho trovato questi approcci:

  • Esegui su Mono anziché Microsoft .NET, perché hanno il supporto SIMD. Non un'opzione per questo progetto.
  • SlimGen, un progetto che inietta codice matematico ad alte prestazioni in fase di esecuzione. Sfortunatamente, il progetto non è ancora in uno stato utilizzabile.
  • Scrivere una DLL in C++ utilizzando un compilatore che utilizza le istruzioni SSE. Interoperare con quella DLL da C#.

Esistono altre opzioni per realizzare una matematica vettoriale più veloce in .NET?

+19

Come è "off-topic"? A volte la gente è sconcertante. –

+1

Il multithreading (o Open MP) potrebbe essere utile. Non so se è possibile utilizzare Open MP su .NET, ma raccomanderei comunque una dll nativa se si riesce a mantenere bassa la quantità totale di chiamate di funzione p/invoke. – dialer

+1

Risposta tardiva Lo so, ma potresti voler esaminare lo Yeppp!Libreria SIMD – user9993

risposta

0

Miscelazione .NET con codice nativo. In questo caso è necessario disporre di una versione per x86 e un'altra per x64. È possibile vedere Mixed (Native and Managed) Assemblies [MSDN]

8

Scrivere una DLL utilizzando il compilatore di Microsoft Visual C++. Usa standard C++ con SSE intrinsec e/o OpenMP per il pesante codice numerico, con #pragma unmanaged. Utilizzare #pragma managed per definire un'API C++/CLI pulita che C# può utilizzare.

L'interoperabilità in C++ è un po 'più veloce di p/invoke. E C++/CLI è l'unico modo elegante per gestire sia la memoria raccolta dai rifiuti, sia le ipotesi delle funzioni native (che i blocchi di memoria non si spostano).

Si potrebbe scoprire che lo spostamento di alcune chiamate OpenGL in C++ e l'utilizzo dei buffer di memoria allocati C++ direttamente per il caricamento di VBO, ecc. Offre anche una grande vittoria per le prestazioni.

4

Microsoft ha appena annunciato il supporto per la generazione di istruzioni vettoriali nel loro .NET Native compiler grazie alle ottimizzazioni del compilatore C++ back-end e, ancora più importante, supporto nativo per i tipi di vettori SIMD nella versione più recente del loro JIT ("RyuJIT"). Vedi alcuni samples here.

0

Se si è in vena di scrivere codice assembly in C#, un'altra opzione è il progetto NAsmJit, che è una porta di AsmJit in C#. Non l'ho aggiornato per riflettere le ultime modifiche in quel progetto, ma gran parte del supporto era abbastanza utilizzabile all'ultima verifica.