génération de code et compilation à la volée?
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 à
Code:
1 2
| for (i=0; i < n; ++i)
a[i] = b[i] + c[i] - 2*d[i]; |
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 :)
Du coup je dispose d'un ensemble de fonctions en C comme par exemple
Code:
1 2 3 4
| void add(a, b, c) {
for (i = 0 ; i < n ; ++i)
a[i] = b[i] + c[i];
} |
et leurs homologues en CUDA.
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
Code:
1 2
|
Expr* = new Expr('=', '+', '-'); |
et cela me créerait le fichier expr001.h, expr001.cpp et expr001.cu qui contiendraient ça :
Code:
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];
} |
Une fois ceux-ci générés, je pourrais appeler ma méthode dans un fichier compilé plus tard avec
Code:
1 2 3
|
#include "expr001.h"
Expr->apply(a, b, c, d); |
Bref, que pensez vous de cette idée?
Est-ce que c'est possible?
Est-ce que ça a déjà été fait, en bien, en mal...?
Merci de vos impressions