[Rcpp-commits] r2155 - pkg/Rcpp/inst/examples/ConvolveBenchmarks
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Fri Sep 24 11:04:42 CEST 2010
Author: romain
Date: 2010-09-24 11:04:42 +0200 (Fri, 24 Sep 2010)
New Revision: 2155
Added:
pkg/Rcpp/inst/examples/ConvolveBenchmarks/convolve9_cpp.cpp
Modified:
pkg/Rcpp/inst/examples/ConvolveBenchmarks/buildAndRun.sh
pkg/Rcpp/inst/examples/ConvolveBenchmarks/exampleRCode.r
Log:
adding another version with Vec closer to the structure of NUmericVector, still faster.
Modified: pkg/Rcpp/inst/examples/ConvolveBenchmarks/buildAndRun.sh
===================================================================
--- pkg/Rcpp/inst/examples/ConvolveBenchmarks/buildAndRun.sh 2010-09-24 08:29:15 UTC (rev 2154)
+++ pkg/Rcpp/inst/examples/ConvolveBenchmarks/buildAndRun.sh 2010-09-24 09:04:42 UTC (rev 2155)
@@ -15,6 +15,7 @@
R CMD SHLIB convolve4_cpp.cpp
R CMD SHLIB convolve5_cpp.cpp
R CMD SHLIB convolve8_cpp.cpp
+R CMD SHLIB convolve9_cpp.cpp
# call R so that we get an interactive session
Rscript exampleRCode.r
Added: pkg/Rcpp/inst/examples/ConvolveBenchmarks/convolve9_cpp.cpp
===================================================================
--- pkg/Rcpp/inst/examples/ConvolveBenchmarks/convolve9_cpp.cpp (rev 0)
+++ pkg/Rcpp/inst/examples/ConvolveBenchmarks/convolve9_cpp.cpp 2010-09-24 09:04:42 UTC (rev 2155)
@@ -0,0 +1,61 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+
+// this version expands convolve8_cpp by making Vec mimic the structure of
+// NumericVector. It peforms well, so this is is not the structure of
+// NumericVector that is the problem. So what is it then ?
+//
+// could it be because NumericVector is in a different library than
+// this code, so that operator[] is not inlined ?
+//
+// clues:
+// - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3538.html
+
+#include <Rcpp.h>
+
+class Cache{
+public:
+ typedef double& proxy ;
+ typedef double* iterator ;
+
+ Cache( iterator data_) : data(data_){}
+
+ inline proxy ref(int i){ return data[i] ; }
+ inline proxy ref(int i) const { return data[i] ; }
+
+private:
+ iterator data ;
+} ;
+
+class Vec {
+public:
+ typedef double& proxy ;
+
+ Vec( double* data_ ) : cache(data_){}
+ inline proxy operator[]( int i){ return cache.ref(i) ; }
+ inline proxy operator[]( int i) const { return cache.ref(i) ; }
+
+private:
+ Cache cache ;
+} ;
+
+
+RcppExport SEXP convolve9cpp(SEXP a, SEXP b){
+ Rcpp::NumericVector xa(a);
+ Rcpp::NumericVector xb(b);
+ int n_xa = xa.size() ;
+ int n_xb = xb.size() ;
+ int nab = n_xa + n_xb - 1;
+ Rcpp::NumericVector xab(nab);
+
+ Vec vab(xab.begin()), va(xa.begin()), vb(xb.begin()) ;
+
+ for (int i = 0; i < n_xa; i++)
+ for (int j = 0; j < n_xb; j++)
+ vab[i + j] += va[i] * vb[j];
+
+ return xab ;
+}
+
+#include "loopmacro.h"
+LOOPMACRO_CPP(convolve9cpp)
+
Modified: pkg/Rcpp/inst/examples/ConvolveBenchmarks/exampleRCode.r
===================================================================
--- pkg/Rcpp/inst/examples/ConvolveBenchmarks/exampleRCode.r 2010-09-24 08:29:15 UTC (rev 2154)
+++ pkg/Rcpp/inst/examples/ConvolveBenchmarks/exampleRCode.r 2010-09-24 09:04:42 UTC (rev 2155)
@@ -11,7 +11,9 @@
dyn.load("convolve4_cpp.so")
dyn.load("convolve5_cpp.so")
dyn.load("convolve7_c.so")
+
dyn.load("convolve8_cpp.so")
+dyn.load("convolve9_cpp.so")
## now run each one once for comparison of results,
## and define test functions
@@ -23,6 +25,7 @@
Rcpp_New_sugar <- function(n,a,b) .Call("convolve5cpp__loop", n, a, b)
R_API_naive <- function(n,a,b) .Call("convolve7__loop", n, a, b)
Rcpp_New_std_2 <- function(n,a,b) .Call("convolve8cpp__loop", n, a, b)
+Rcpp_New_std_3 <- function(n,a,b) .Call("convolve9cpp__loop", n, a, b)
v1 <- R_API_optimised(1L, a, b )
@@ -48,6 +51,7 @@
Rcpp_New_ptr(REPS,a,b),
Rcpp_New_sugar(REPS,a,b),
Rcpp_New_std_2(REPS,a,b),
+ Rcpp_New_std_3(REPS,a,b),
columns=c("test", "elapsed", "relative", "user.self", "sys.self"),
order="relative",
replications=1)
More information about the Rcpp-commits
mailing list