Bonjour,
Je suis en train de réfléchir à un problème que je voudrais vous soumettre.
Le contexte est celui d'une librairie d'algèbre linéaire. On va dire que pour l'instant elle ne contient que des vecteurs.
L'idée est d'écrire des expressions complexes comme
a = b+c-2*d;
et que celle-ci soit réduite à
Je connais le principe des expressions template, mais je ne peux pas l'appliquer dans mon cas. En effet, mes vecteurs peuvent aussi aller calculer sur la carte graphique où on se brosse pour les iterator
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for (i=0; i < n; ++i) a[i] = b[i] + c[i] - 2*d[i];
Du coup je dispose d'un ensemble de fonctions en C comme par exemple
et leurs homologues en CUDA.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void add(a, b, c) { for (i = 0 ; i < n ; ++i) a[i] = b[i] + c[i]; }
Ne pourrais-je pas créer une classe expression, qui générerait le code voulu à partir du code de mes fonctions existentes, et le compilerait à la volée?
Par exemple je ferais
et cela me créerait le fichier expr001.h, expr001.cpp et expr001.cu qui contiendraient ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Expr* = new Expr('=', '+', '-');
Une fois ceux-ci générés, je pourrais appeler ma méthode dans un fichier compilé plus tard avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //!expr001.cpp // présent dans expr001.cu extern "C" void expr001kernel(vector& a, vector& b, vector& c, vector& d); // déclaré dans expr001.h void expr001 (vector& a, vector& b, vector& c, vector& d) { for (i = 0 ; i < n ; ++i) a[i] = b[i] + c[i] - d[i]; }
Bref, que pensez vous de cette idée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #include "expr001.h" Expr->apply(a, b, c, d);
Est-ce que c'est possible?
Est-ce que ça a déjà été fait, en bien, en mal...?
Merci de vos impressions
Partager