[R-sig-hpc] Grand Central Dispatch (simple loop optimization)
Jan de Leeuw
deleeuw at stat.ucla.edu
Thu Sep 17 19:58:13 CEST 2009
****************** 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
More information about the R-sig-hpc
mailing list