web-dev-qa-db-fra.com

Exécuter le code C # sur le GPU

Je n'ai aucune connaissance des concepts de programmation GPU et des API. J'ai quelques questions:

  1. Est-il possible d'écrire un morceau de code C # managé et de le compiler/traduire en un type de module pouvant être exécuté sur le GPU? Ou suis-je condamné à avoir deux implémentations, une pour la gestion sur le processeur et une pour le GPU (je comprends qu'il y aura des restrictions sur ce qui peut être exécuté sur le GPU)?
  2. Existe-t-il une API décente et mature pour programmer indépendamment de différents fournisseurs de matériel GPU (c'est-à-dire une API commune)?
  3. Existe-t-il des pratiques recommandées si l'on souhaite développer des applications qui s'exécutent sur un processeur, écrites en langage géré, et fournissent également des optimisations de vitesse si le matériel GPU approprié est présent?

Je serais également ravi de trouver des liens vers tout type de documentation contenant des ressources pédagogiques appropriées.

Meilleur, Jozef

32
jojovilco

1) Non - pas pour le cas général de C # - évidemment, tout peut être créé pour un sous-ensemble du langage

2) Oui - HLSL utilisant Direct X ou Open GL

3) Pas généralement possible - le codage de la CPU et du GPU est fondamentalement différent

Fondamentalement, vous ne pouvez pas penser que le codage du processeur et du GPU est comparable. Un GPU est un outil de traitement parallèle hautement spécialisé, permettant de nombreux calculs simples en parallèle.

Essayer d'écrire un programme général dans un GPU avec beaucoup de branches, etc. ne sera tout simplement pas efficace - peut-être même pas possible.

Leurs architectures d'accès à la mémoire sont totalement différentes.

Vous devez écrire pour le processeur, mais transférer les calculs parallèles appropriés au GPU.

22
James Gaunt

1) Non, pas pour le cas général de C #, mais un petit sous-ensemble, oui. Soit via un environnement d'exécution (consultez Tidepowerd GPU.NET), soit via un support de langue (LINQ ou Code Quotations).

2) Oui, DirectCompute (DX11 Compute Shaders) et OpenCL sont des API matures indépendantes du fournisseur. Vous pouvez y trouver une liaison .NET.

3) Non, comme l'a dit James, ils sont différents. Les GPU sont des processeurs à latence élevée optimisés pour les applications parallèles de données à haut débit, tandis que les CPU sont des processeurs à latence faible optimisés pour les applications séquentielles à usage général.

Le seul projet de recherche que je connaisse qui tente de résoudre ce problème est le SPAP language.

Mon conseil, n'essayez pas de trouver le moteur/API universel idéal, car il n'y en a pas. Choisissez une technologie existante (DirectCompute ou OpenCL) et voyez comment en tirer parti pour votre entreprise.

Liens utiles pour commencer:

17
Stringer

Il y a aussi brahma . Il capture soi-disant des expressions et les compile pour le GPU. Je n'ai pas essayé moi-même.

Et Microsoft a un prototype de recherche appelé accelerator , qui a un objectif similaire mais une syntaxe différente.

2
user180326

1) Pas que je sache, mais il pourrait y avoir une bibliothèque pour C # qui puisse vous aider.

2) OpenCL. Il est indépendant du processeur graphique et peut même fonctionner sur des processeurs.

3) OpenCL vous aidera avec cela, vous pouvez aussi compiler pour CPU avec OpenCL, bien que je ne sois pas sûr de la qualité du code qu’il génère pour le CPU. Je suis vraiment tombé amoureux d'OpenCL récemment, cela fonctionne vraiment très bien.

2
Xorlev

Avez-vous regardé Alea GPU ? Les bibliothèques, bien que n'étant pas complètement gratuites, ont une licence équitable. Il existe une excellente documentation et une chaîne d'outils impressionnante.

1
Guy Langston

Pour Java, voir le projet Aparapi ( https://github.com/aparapi/aparapi ). Cela permet à un sous-ensemble de Java d'être exécuté sur tout GPU prenant en charge OpenCL. Le bytecode des classes du noyau est compilé de manière croisée lors de l'exécution en code OpenCL. Le code Java peut être compilé de manière très restrictive. En principe, aucun objet ne peut être utilisé en tant que champ, local ou argument de méthode.

Cependant, un avantage considérable est que les noyaux peuvent être exécutés en Java ou en OpenCL (avec repli automatique sur l'exécution de ThreadPool en Java en cas d'indisponibilité d'un périphérique GPU/APU approprié). Cela semble être ce qui se rapproche le plus de ce que vous recherchez dans la partie 3 de votre question (bien que le langage géré ne soit bien sûr pas le C #).

Je ne suis au courant de rien de semblable en C #.

0
barneypitt