[R-sig-hpc] Grand Central Dispatch (simple loop optimization)

Saptarshi Guha saptarshi.guha at gmail.com
Thu Sep 17 20:03:33 CEST 2009


Nice, how does this compare when using OpenMP?
How does it compare when several other core hungry processes are  
running?( GC is supposed to nicely handle resource allocation, does  
OpenMP compete with the other processes?).

Regards
Saptarshi


On Sep 17, 2009, at 1:58 PM, Jan de Leeuw wrote:

> ****************** threads.c  
> *******************************************************
>
> #include <math.h>
> #include <dispatch/dispatch.h>
>
> double do_work(double *, int , int);
> void gcd_try (int *, int *, double *, double *);
> void dgc_try (int *, int *, double *, double *);
>
> void gcd_try (int *npowers, int *nlength, double *data, double  
> *results) {
> dispatch_queue_t queue =  
> dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
> dispatch_apply(*npowers, queue, ^(size_t i) {
>    results[i] = do_work(data, *nlength, i);
>    });
> }
>
> void dcg_try (int *npowers, int *nlength, double *data, double  
> *results) {
> int i;
> for (i = 0; i < *npowers; i++) {
>    results[i] = do_work(data, *nlength, i);
>    }
> }
>
> double do_work(double *data, int nlength, int power) {
> int k; double s = 0.0;
> for (k = 0; k < nlength; k++) {
>    s += pow(data[k],(double) power);
>    }
> return(s);
> }
>
> ****************** threads.R  
> *******************************************************
>
> dyn.load("threads.so")
>
> threads<-function(nlength,npowers,gcd=FALSE) {
> set.seed(12345)
> data<-rnorm(nlength)
> results<-rep(0,npowers)
> if (gcd)
>     
> aList 
> < 
> -.C 
> ("gcd_try 
> ",npowers 
> = 
> as 
> .integer 
> (npowers 
> ),nlength 
> =as.integer(nlength),data=as.double(data),results=as.double(results))
> else
>     
> aList 
> < 
> -.C 
> ("dcg_try 
> ",npowers 
> = 
> as 
> .integer 
> (npowers 
> ),nlength 
> =as.integer(nlength),data=as.double(data),results=as.double(results))
> return(aList$results)
> }
>
> **************************************************************************************
> > system.time(threads(100000,1000,gcd=FALSE))
>   user  system elapsed
>  8.967   0.004   8.971
> > system.time(threads(100000,1000,gcd=TRUE))
>   user  system elapsed
> 10.453   0.008   0.697
>
> > system.time(threads(1000000,100,gcd=FALSE))
>   user  system elapsed
>  3.698   0.013   3.712
> > system.time(threads(1000000,100,gcd=TRUE))
>   user  system elapsed
>  5.253   0.026   0.477
>
> ======================================================================
>      Jan de Leeuw, 11667 Steinhoff Rd, Frazier Park, CA 93225
>      home 661-245-1725 mobile 661-231-5416 work 310-825-9550
>      .mac: jdeleeuw +++  aim: deleeuwjan +++ skype: j_deleeuw
> ======================================================================
>                Toen wij van Rotterdam vertrokken
>                Vertrokken wij van Rotterdam
>
> _______________________________________________
> R-sig-hpc mailing list
> R-sig-hpc at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-hpc



More information about the R-sig-hpc mailing list