Concours estival

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Concours estival

Messagepar Logez Maxime » 20 Juil 2018, 18:28

Bonjour,

C'est carrément autorisé si tu mets tout ton code.
L'idée c'était aussi de partager nos différentes méthodes a partir de R ou nos idées même les plus loufoques parce que sûrement intéressante dans un autre contexte.

On attend ton code pour se faire décoiffer :)

Maxime

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Concours estival

Messagepar Eric Wajnberg » 21 Juil 2018, 10:52

Logez Maxime a écrit :Bonjour,

C'est carrément autorisé si tu mets tout ton code.
L'idée c'était aussi de partager nos différentes méthodes a partir de R ou nos idées même les plus loufoques parce que sûrement intéressante dans un autre contexte.

On attend ton code pour se faire décoiffer :)

Maxime

Si j'ai le temps, je m'y colle, mais pas sûr que j'y arrive.. je suis en mission à l'étranger actuellement..

Eric.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Concours estival

Messagepar Logez Maxime » 23 Juil 2018, 08:22

Eric Wajnberg a écrit :Si j'ai le temps, je m'y colle, mais pas sûr que j'y arrive.. je suis en mission à l'étranger actuellement..

Après nous avoir fait saliver tu ne peux pas nous laisser sans réponse :)

Maxime

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Concours estival

Messagepar Eric Wajnberg » 06 Déc 2018, 14:16

Logez Maxime a écrit :
Eric Wajnberg a écrit :Si j'ai le temps, je m'y colle, mais pas sûr que j'y arrive.. je suis en mission à l'étranger actuellement..

Après nous avoir fait saliver tu ne peux pas nous laisser sans réponse :)

Maxime

Et bien, il n'est jamais trop tard pour reprendre ce concours, et - enfin (...) - fournir une réponse correspondant à la solution que j'avais proposée.

J'ai donc re-écrit la fonction colSums() en C, avec la fonction suivante :

Code : Tout sélectionner

#include <R.h>
void colSums_eric(double *x, long *n, long *ligne, double *res)
{
        int nb_ligne;
        int nb_col;
        int i,j;
        int compteur=0;

        nb_ligne=*ligne;
        nb_col=(int)((float)*n/(float)nb_ligne);

        for (i=0;i<nb_col;i++)
                res[i]=0.0;
        for (i=0;i<nb_col;i++)
                for (j=0;j<nb_ligne;j++)
                {
                        res[i]+=x[compteur++];
                }
}


Cette fonction est à compiler avec la ligne de commande R CMD SHLIB etc. (après avoir installé Rtools).

Il faut ensuite monter dynamiquement cette fonction dans R avec dyn.load(), et l'invoquer avec la fonction .C().

Voici l'invocation du benckmark :

Code : Tout sélectionner

library(microbenchmark)
set.seed(198)
dta <- matrix(rnorm(1e6), 1e3)

microbenchmark(colSums(dta),
.C("colSums_eric",x=as.double(dta),n=as.integer(1e6),ligne=as.integer(1e3),res=as.double(rep(0,1e6/1e3)))$res)


Et voici les résultats :

Code : Tout sélectionner

Unit: milliseconds
                                                                                                                                  expr    min     lq      mean   median       uq      max neval cld
                                                                                                                          colSums(dta) 1.7554 1.7651  1.795682  1.78035  1.80745   2.6086   100  a
 .C("colSums_eric", x = as.double(dta), n = as.integer(1e+06),      ligne = as.integer(1000), res = as.double(rep(0, 1e+06/1000)))$res 5.6536 8.2946 14.257787 11.60260 14.64605 237.2044   100   b


De toute évidence, j'avais tord. La ré-écrite dans ce cas en C conduit à des calculs bien plus longs que les fonctions natives de R, surtout qu'elles sont je pense optimisées (compilées) dans les versions récentes de R. Le résultat serait encore plus catastrophique en prenant la comparaison avec du code parallélisé..

Bon, j'aurais essayé..

Mais il reste que l'interfaçage de R avec du C présente d'autres avantages vraiment importants, que j'utilise fréquemment.

AMitiés à tous, Eric.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Concours estival

Messagepar Logez Maxime » 07 Déc 2018, 15:23

Bonjour,

merci pour le code si détaillé qui permet de bien comprendre comment interfacer du C avec R.
Par curiosité, as-tu déjà programmé avec Rcpp qui me semble pouvoir faire la même chose ?

Cordialement,
Maxime

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Concours estival

Messagepar Eric Wajnberg » 07 Déc 2018, 15:30

Oui, on devrait faire la même chose avec Rcpp. Jamais essayé.

En revanche, un point qui reste à travailler (notamment dans le cadre de ce concours estival ; mais je n'ai jamais eu à le faire), est que l'on peut drastiquement réduire les temps de calculs avec cette procédure. Voir https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Speed-considerations. Il faut pour ce faire enregistrer dans R la procédure comme étant native, ce qui évite que R passe à chaque fois du temps à "mettre la main dessus". Je n'ai pas le temps de tester ceci (et n'en ai pas trop le besoin). Mais je pense que ca pourrait sensiblement réduire les temps de calcul correspondant.

Eric.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité