2010-11-07 8 views
29

Non ho conoscenza dei concetti di programmazione e API della GPU. Ho alcune domande:Esegui codice C# su GPU

  1. È possibile scrivere un pezzo di codice C# gestito e compilarlo/tradurlo in qualche tipo di modulo, che può essere eseguito sulla GPU? O sono condannato ad avere due implementazioni, una per la gestione della CPU e una per la GPU (ho capito che ci saranno delle restrizioni su cosa può essere eseguito sulla GPU)?
  2. Esiste una API decente e matura per programmare in modo indipendente contro vari fornitori di hardware GPU (ad esempio un'API comune)?
  3. Esistono buone pratiche se si desidera sviluppare applicazioni eseguite su una CPU, scritte in linguaggio gestito e anche fornire ottimizzazioni di velocità se è presente l'hardware GPU adatto?

Sarei anche contento per i collegamenti a qualsiasi tipo di documentazione con risorse di apprendimento appropriate.

migliore, Jozef

+4

Il codice di livello basso è scritto meglio in un linguaggio di basso livello. Non c'è una buona ragione per farlo in C# quando ci sono alternative migliori. –

+0

questa domanda simile: http://stackoverflow.com/questions/375011/utilizing-the-gpu-with-c-sharp – mcmillab

risposta

21

1) No - non per il caso generale di C# - ovviamente tutto può essere creato per qualche sottoinsieme del linguaggio

2) Sì - HLSL con Direct X o Open GL

3) non generalmente possibile - CPU e GPU codifica sono fondamentalmente differenti

in sostanza non si può pensare di CPU e GPU codifica come paragonabili. Una GPU è uno strumento di elaborazione parallela altamente specializzato, per molti semplici calcoli paralleli.

Cercare di scrivere un programma generico in una GPU con molti rami ecc. Non sarà efficiente, forse nemmeno possibile.

Le loro architetture di accesso alla memoria sono completamente diverse.

Si dovrebbe scrivere per la CPU ma generare calcoli paralleli appropriati alla GPU.

+7

-1 per non menzionare OpenCL o DirectCompute. – Euphoric

+7

Ouch - che fa male :) –

+1

-1: OpenGL utilizza il linguaggio di ombreggiatura GLSL non HLSL –

2

1) Non che io sappia, ma potrebbe esserci una libreria per C# che può aiutarti.

2) OpenCL. È indipendente dalla GPU e può persino funzionare su CPU.

3) OpenCL vi aiuterà con questo, potete anche compilare per CPU con OpenCL, anche se non sono sicuro di quanto sia grande il codice che rende per la CPU. Mi sono davvero innamorato di OpenCL ultimamente, funziona davvero molto bene.

17

1) No, non per il caso generale di C#, ma un piccolo sottoinsieme, sì. Attraverso un runtime (controlla Tidepowerd GPU.NET) o tramite il supporto della lingua (LINQ o Code Quotations).

2) Sì, DirectCompute (DX11 Compute Shaders) e OpenCL sono entrambe API indipendenti e indipendenti dal fornitore e potete trovare il binding .NET per loro.

3) No, come James ha detto, sono bestie diverse. Le GPU sono processori ad alta latenza ottimizzati per applicazioni parallele con dati ad alto throughput, mentre le CPU sono processori a bassa latenza ottimizzati per applicazioni sequenziali di uso generale.

L'unico progetto di ricerca che conosco che tenta di risolvere questo problema è la lingua SPAP.

Il mio consiglio, non provare a trovare l'API/runtime universale perfetto perché non ce n'è. Scegli una tecnologia esistente (DirectCompute o OpenCL) e scopri come puoi sfruttarla per la tua azienda.

Link utili per partenza:

+0

il link a tidepowered è morto, eccone uno da gettare https://github.com/tidepowerd/GPU.NET-Example-Projects –

2

C'è anche brahma. Presumibilmente cattura le espressioni e le compila per la GPU. Non ho provato me stesso.

E Microsoft ha un prototipo di ricerca chiamato accelerator, che è simile nella meta ma sintatticamente diverso.

-1

Per Java, vedere il progetto Aparapi (https://github.com/aparapi/aparapi). Ciò consente a un sottoinsieme di Java di essere eseguito su qualsiasi GPU che supporti OpenCL. Il bytecode delle classi Kernel è cross-compilato in fase di runtime su codice OpenCL. Ci sono severe restrizioni sul codice java che possono essere compilate in modo incrociato, in pratica non si possono usare oggetti come campi, locals o metodi.

Tuttavia, un vantaggio considerevole è che i kernel possono essere eseguiti in Java o OpenCL (con esecuzione automatica del fallback in ThreadPool Java in caso di indisponibilità di un dispositivo GPU/APU appropriato). Questo suona come la cosa più vicina a ciò che stai cercando nella terza parte della tua domanda (anche se ovviamente la lingua gestita non è C#).

Non sono a conoscenza di qualcosa di simile in C#.