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 : 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];
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 : 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];
}
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Expr* = new Expr('=', '+', '-');
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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