2008-10-13 10 views
3

J'explore différentes options pour mapper des constructions de code C# courantes en code CUDA C++ pour l'exécution sur un GPU. La structure du système est la suivante (flèches représentent les appels de méthode):Transformation de méthodes C# en méthodes C++

C# programme -> C# GPU lib -> implémentation C++ CUDA lib

Une méthode dans la bibliothèque GPU pourrait ressembler à ceci:

public static void Map<T>(this ICollection<T> c, Func<T,T> f) 
{ 
    //Call 'f' on each element of 'c' 
} 

Ceci est une méthode d'extension à ICollection <> types qui exécute une fonction sur chaque élément. Cependant, ce que je voudrais faire, c'est appeler la bibliothèque C++ et lui faire exécuter les méthodes sur le GPU. Cela nécessiterait que la fonction soit, d'une manière ou d'une autre, traduite en code C++. Est-ce possible? Pour développer, si l'utilisateur de ma bibliothèque exécute une méthode (en C#) avec du code arbitraire, je voudrais traduire ce code dans l'équivélant C++ de sorte que je puisse l'exécuter sur CUDA. J'ai l'impression qu'il n'y a pas de moyen facile de le faire, mais j'aimerais savoir s'il y a moyen de le faire ou d'obtenir le même résultat. Une chose dont je m'interrogeais est de capturer la fonction à traduire dans une expression et de l'utiliser pour la mapper à un équivélant C++. Quelqu'un a une expérience avec ça?

Répondre

7

Il y a CUDA.Net si vous voulez des références comment C# peut être exécuté sur GPU.

+0

GRAND lien, merci !!! – endian

+0

Je pense que vous trouverez que vous ne pouvez pas exécuter C# sur un GPU comme vous l'avez dit, mais plutôt que vous pouvez lancer des noyaux CUDA à partir de C#. – cr333

2

Pour être honnête, je ne suis pas sûr de bien comprendre ce que vous voulez dire. Cependant, vous pouvez être intéressé par ce projet qui convertit les applications/bibliothèques .Net en C++ droit sans aucune infrastructure .Net requise. http://www.codeplex.com/crossnet

0

Question intéressante. Je ne suis pas très expert en C#, mais je pense qu'un ICollection est un conteneur de objets. Si chaque élément de c était, disons, un pixel, vous auriez à faire beaucoup de marshalling pour convertir cela en un tampon d'octets ou de flottants que CUDA pourrait utiliser. Je soupçonne que cela ralentirait tout assez pour annuler l'avantage de faire quoi que ce soit sur le gpu.

0

Ce que vous pourriez faire serait d'écrire un IQueryable LINQ provider, comme c'est le cas pour LINQ to SQL pour traduire les requêtes LINQ en SQL.

Cependant, un problème que je vois avec cette approche est le fait que les requêtes LINQ sont généralement évaluées paresseusement. Afin de bénéficier de pipelining, ce n'est probablement pas une solution viable.

Il peut également être intéressant d'étudier comment implémenter Google MapReduce API pour C# et CUDA et ensuite utiliser une approche similaire à PyCuda pour envoyer la logique au GPU. Dans ce contexte, il peut également être utile de jeter un oeil à la MapReduce implementation in CUDA déjà existante.

0

C'est une question très intéressante et je n'ai aucune idée de comment faire cela.

Cependant, le Brahma library semble faire quelque chose de très similaire. Vous pouvez définir des fonctions à l'aide de LINQ, qui sont ensuite compilées dans des shaders GLSL pour fonctionner efficacement sur un GPU. Jetez un oeil à leur code et en particulier l'échantillon Game of Life.

1

je recommande le processus suivant pour accélérer une partie de votre calcul en utilisant CUDA d'un programme C#:

  • Tout d'abord, créez un non géré bibliothèque C++ que vous P/Invoke pour les fonctions que vous voulez accélérer. Cela vous limitera plus ou moins aux types de données que vous pouvez facilement utiliser dans CUDA.
  • Intégrez votre bibliothèque non gérée à votre application C#. Si vous faites les choses correctement, vous devriez déjà remarquer une sorte d'accélération. Si non, vous devriez probablement abandonner.
  • Remplacez les fonctions C++ dans votre bibliothèque (sans changer d'interface) pour effectuer les calculs sur le GPU avec les noyaux CUDA.
Questions connexes