SlideShare a Scribd company logo
Turbocharge your R

                    Rob Zinkov


                   July 12th, 2011




Rob Zinkov ()       Turbocharge your R   July 12th, 2011   1 / 23
Outline



1   Introduction


2   .C


3   .Call


4   Rcpp




         Rob Zinkov ()   Turbocharge your R   July 12th, 2011   2 / 23
Introduction


What is the point of this talk?




Show you how to speed up your R code




     Rob Zinkov ()            Turbocharge your R   July 12th, 2011   3 / 23
Introduction


Caveats




  • Please try to optimize your R code first
  • Some of these mechanisms will make coding harder




     Rob Zinkov ()              Turbocharge your R     July 12th, 2011   4 / 23
.C




• This is the basic mechanism
• Explicitly copies the data into C
• Only accepts integer vectors




    Rob Zinkov ()            Turbocharge your R   July 12th, 2011   5 / 23
.C


Step 1. Put function in file (foo.c)



void foo(int *nin, double *x)
{
int n = nin[0];

int i;

for (i=0; i<n; i++)
x[i] = x[i] * x[i];
}




     Rob Zinkov ()       Turbocharge your R   July 12th, 2011   6 / 23
.C




• Note this is a void function
• Note arguments are passed in as pointers
• Try to limit one function per file




    Rob Zinkov ()            Turbocharge your R   July 12th, 2011   7 / 23
.C


Step 2. Compile file with R




$ R CMD SHLIB foo.c




     Rob Zinkov ()     Turbocharge your R   July 12th, 2011   8 / 23
.C


Step 3. Load into R




> dyn.load("foo.so")




     Rob Zinkov ()     Turbocharge your R   July 12th, 2011   9 / 23
.C


Step 4. Call your code




 .C("foo", n=as.integer(5), x=as.double(rnorm(5)))




     Rob Zinkov ()       Turbocharge your R    July 12th, 2011   10 / 23
.C




• Arguments to .C are name of function followed by arguments
• Arguments must be the right type
• Touching C code runs risks of segfaults




   Rob Zinkov ()            Turbocharge your R       July 12th, 2011   11 / 23
.Call


Why?




 • Less copying of data structures (lower memory)
 • Access more of R data structures
 • Access more kinds of R data
 • Do more in C




    Rob Zinkov ()            Turbocharge your R     July 12th, 2011   12 / 23
.Call


.Call code


#include <R.h>
#include <Rinternals.h>
#include <Rmath.h>

SEXP vecSum(SEXP Rvec){
  int i, n;
  double *vec, value = 0;
  vec = REAL(Rvec);
  n = length(Rvec);
  for (i = 0; i < n; i++) value += vec[i];
  printf("The value is: %4.6f n", value);
  return R_NilValue;
}


     Rob Zinkov ()        Turbocharge your R   July 12th, 2011   13 / 23
.Call




R CMD SHLIB vecSum.c
dyn.load("vecSum.so")
.Call("vecSum", rnorm(10))




     Rob Zinkov ()       Turbocharge your R   July 12th, 2011   14 / 23
.Call




SEXP ab(SEXP Ra, SEXP Rb){
   int i, a, b;
   SEXP Rval;
   Ra = coerceVector(Ra, INTSXP);
   Rb = coerceVector(Rb, INTSXP);
   a = INTEGER(Ra)[0];
   b = INTEGER(Rb)[0];
   PROTECT(Rval = allocVector(INTSXP, b - a + 1));
   for (i = a; i <= b; i++)
       INTEGER(Rval)[i - a] = i;
   UNPROTECT(1);
   return Rval;
}



     Rob Zinkov ()       Turbocharge your R    July 12th, 2011   15 / 23
.Call




Since memory is shared explicit care must be taken not to collide with R




      Rob Zinkov ()            Turbocharge your R         July 12th, 2011   16 / 23
Rcpp


Why?




 • Use C++ instead of C
 • Ability to use objects to represent R more naturally
 • Easier to load code




     Rob Zinkov ()            Turbocharge your R          July 12th, 2011   17 / 23
Rcpp




src <- ’
    IntegerVector tmp(clone(x));
    double rate = as< double >(y);
    int tmpsize = tmp.size();
    RNGScope scope;
    for (int ii =0; ii < tmpsize; ii++) {
        tmp(ii) = Rf_rbinom(tmp(ii), rate);
    };
    return tmp;
’
require(inline)
## compile the function, inspect the process with verbose=T
testfun2 = cxxfunction(signature(x=’integer’, y=’numeric’),
                       src, plugin=’Rcpp’, verbose=T)



     Rob Zinkov ()       Turbocharge your R    July 12th, 2011   18 / 23
Rcpp




require(inline)
testfun = cxxfunction(
    signature(x="numeric",
              i="integer"),
              body = ’
                        NumericVector xx(x);
                        int ii = as<int>(i);
                        xx = xx * ii;
                        return( xx );
                     ’, plugin="Rcpp")
testfun(1:5, 3)




     Rob Zinkov ()       Turbocharge your R    July 12th, 2011   19 / 23
Rcpp


Conclusions




It is fairly easy to make R faster




      Rob Zinkov ()              Turbocharge your R   July 12th, 2011   20 / 23
Rcpp


Conclusions




Now go make your R code faster




     Rob Zinkov ()          Turbocharge your R   July 12th, 2011   21 / 23
Rcpp


References



  • http://www.stat.umn.edu/ charlie/rc/
  • http://helmingstay.blogspot.com/2011/06/efficient-loops-in-r-
    complexity-versus.html
  • http://www.sfu.ca/ sblay/R-C-interface.ppt
  • http://www.biostat.jhsph.edu/ bcaffo/statcomp/files/dotCall.pdf
  • http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-
    quickref.pdf
  • http://www.jstatsoft.org/v40/i08/paper




     Rob Zinkov ()           Turbocharge your R        July 12th, 2011   22 / 23
Rcpp




                Questions?




Rob Zinkov ()     Turbocharge your R   July 12th, 2011   23 / 23

More Related Content

PDF
Integrating R with C++: Rcpp, RInside and RProtoBuf
Romain Francois
 
PDF
Rcpp
Ajay Ohri
 
PDF
Prepostinfix
MohitKumawat27
 
PDF
Detecting Deadlock, Double-Free and Other Abuses in a Million Lines of Linux ...
Peter Breuer
 
PDF
Kyrylo Cherneha "C++ & Python Interaction in Automotive Industry"
LogeekNightUkraine
 
PDF
Lisp 1.5 - Running history
Norman Richards
 
PDF
Git tips by symbols
DQNEO
 
DOCX
โจทย์ปัญหา Pbl 1
Jaruwank
 
Integrating R with C++: Rcpp, RInside and RProtoBuf
Romain Francois
 
Rcpp
Ajay Ohri
 
Prepostinfix
MohitKumawat27
 
Detecting Deadlock, Double-Free and Other Abuses in a Million Lines of Linux ...
Peter Breuer
 
Kyrylo Cherneha "C++ & Python Interaction in Automotive Industry"
LogeekNightUkraine
 
Lisp 1.5 - Running history
Norman Richards
 
Git tips by symbols
DQNEO
 
โจทย์ปัญหา Pbl 1
Jaruwank
 

What's hot (15)

PDF
LTO plugin
Wang Hsiangkai
 
PPTX
What's New in C# 6
Mikhail Shcherbakov
 
PPTX
Cobol, lisp, and python
Hoang Nguyen
 
PPTX
3.5 equivalence of pushdown automata and cfl
Sampath Kumar S
 
KEY
Debugging Your PHP Cake Application
Jose Diaz-Gonzalez
 
PPT
Pda to cfg h2
Rajendran
 
PPTX
2014.10 - Towards Description Set Profiles for RDF Using SPARQL as Intermedia...
Dr.-Ing. Thomas Hartmann
 
PDF
15CS664 Python Question Bank-3
Syed Mustafa
 
PDF
A Multi-theory Logic Language for the World Wide Web
gpiancastelli
 
PDF
Quines—Programming your way back to where you were
Jean-Baptiste Mazon
 
ODP
Debugging and Profiling Rails Application
David Paluy
 
PDF
Microsoft F# and functional programming
Radek Mika
 
PDF
「C++コンパイラアップデート」
Embarcadero Technologies
 
PDF
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Igalia
 
PPT
Unicode Cjk Compatible Variations
Joe Jiang
 
LTO plugin
Wang Hsiangkai
 
What's New in C# 6
Mikhail Shcherbakov
 
Cobol, lisp, and python
Hoang Nguyen
 
3.5 equivalence of pushdown automata and cfl
Sampath Kumar S
 
Debugging Your PHP Cake Application
Jose Diaz-Gonzalez
 
Pda to cfg h2
Rajendran
 
2014.10 - Towards Description Set Profiles for RDF Using SPARQL as Intermedia...
Dr.-Ing. Thomas Hartmann
 
15CS664 Python Question Bank-3
Syed Mustafa
 
A Multi-theory Logic Language for the World Wide Web
gpiancastelli
 
Quines—Programming your way back to where you were
Jean-Baptiste Mazon
 
Debugging and Profiling Rails Application
David Paluy
 
Microsoft F# and functional programming
Radek Mika
 
「C++コンパイラアップデート」
Embarcadero Technologies
 
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Igalia
 
Unicode Cjk Compatible Variations
Joe Jiang
 
Ad

Viewers also liked (13)

PPTX
Biblioteca del Congreso Nacional Argentino
martarure
 
PPTX
OOP Is More Then Cars and Dogs - Midwest PHP 2017
Chris Tankersley
 
PPT
OOP in Java
wiradikusuma
 
PPTX
Java 8 new features
Aniket Thakur
 
PPT
What does OOP stand for?
Colin Riley
 
PDF
Modern JavaScript Applications: Design Patterns
Volodymyr Voytyshyn
 
PPTX
Brain Computer Interface.ppt
Amal Sanjay
 
PPT
Object-oriented concepts
BG Java EE Course
 
PPT
Uml diagrams
barney92
 
PPT
Java OOP s concepts and buzzwords
Raja Sekhar
 
PPT
Object Oriented Programming Concepts
thinkphp
 
PPTX
Introduction to java
Veerabadra Badra
 
PPS
Jump start to OOP, OOAD, and Design Pattern
Nishith Shukla
 
Biblioteca del Congreso Nacional Argentino
martarure
 
OOP Is More Then Cars and Dogs - Midwest PHP 2017
Chris Tankersley
 
OOP in Java
wiradikusuma
 
Java 8 new features
Aniket Thakur
 
What does OOP stand for?
Colin Riley
 
Modern JavaScript Applications: Design Patterns
Volodymyr Voytyshyn
 
Brain Computer Interface.ppt
Amal Sanjay
 
Object-oriented concepts
BG Java EE Course
 
Uml diagrams
barney92
 
Java OOP s concepts and buzzwords
Raja Sekhar
 
Object Oriented Programming Concepts
thinkphp
 
Introduction to java
Veerabadra Badra
 
Jump start to OOP, OOAD, and Design Pattern
Nishith Shukla
 
Ad

Similar to Los Angeles R users group - July 12 2011 - Part 2 (20)

PDF
Dot Call interface
Hao Chai
 
PDF
Functional Programming in R
David Springate
 
PDF
Rcpp: Seemless R and C++
Romain Francois
 
PDF
Rcpp11 useR2014
Romain Francois
 
PPTX
F#3.0
Rodrigo Vidal
 
PDF
Rcpp: Seemless R and C++
Romain Francois
 
PDF
Rcpp11
Romain Francois
 
PDF
Native interfaces for R
Seth Falcon
 
KEY
Foreman - Process manager for applications with multiple components
Stoyan Zhekov
 
PPTX
Special topics in finance lecture 2
Dr. Muhammad Ali Tirmizi., Ph.D.
 
PDF
R/C++ talk at earl 2014
Romain Francois
 
PPT
Shift rotate
fika sweety
 
PDF
How to Begin to Develop Ruby Core
Hiroshi SHIBATA
 
PPTX
Iron Languages - NYC CodeCamp 2/19/2011
Jimmy Schementi
 
PDF
Rcpp: Seemless R and C++
Romain Francois
 
PDF
Building Web APIs that Scale
Salesforce Developers
 
PPT
8051assembly language
Hisham Mat Hussin
 
PPTX
Building native Android applications with Mirah and Pindah
Nick Plante
 
ODP
IIUG 2016 Gathering Informix data into R
Kevin Smith
 
PPT
Best corporate-r-programming-training-in-mumbai
Unmesh Baile
 
Dot Call interface
Hao Chai
 
Functional Programming in R
David Springate
 
Rcpp: Seemless R and C++
Romain Francois
 
Rcpp11 useR2014
Romain Francois
 
Rcpp: Seemless R and C++
Romain Francois
 
Native interfaces for R
Seth Falcon
 
Foreman - Process manager for applications with multiple components
Stoyan Zhekov
 
Special topics in finance lecture 2
Dr. Muhammad Ali Tirmizi., Ph.D.
 
R/C++ talk at earl 2014
Romain Francois
 
Shift rotate
fika sweety
 
How to Begin to Develop Ruby Core
Hiroshi SHIBATA
 
Iron Languages - NYC CodeCamp 2/19/2011
Jimmy Schementi
 
Rcpp: Seemless R and C++
Romain Francois
 
Building Web APIs that Scale
Salesforce Developers
 
8051assembly language
Hisham Mat Hussin
 
Building native Android applications with Mirah and Pindah
Nick Plante
 
IIUG 2016 Gathering Informix data into R
Kevin Smith
 
Best corporate-r-programming-training-in-mumbai
Unmesh Baile
 

More from rusersla (11)

PDF
LA R meetup - Nov 2013 - Eric Klusman
rusersla
 
PDF
useR2011 - Whitcher
rusersla
 
PDF
useR2011 - Rougier
rusersla
 
PDF
useR2011 - Huber
rusersla
 
PDF
useR2011 - Gromping
rusersla
 
PDF
useR2011 - Edlefsen
rusersla
 
PDF
Los Angeles R users group - July 12 2011 - Part 1
rusersla
 
PDF
Los Angeles R users group - Nov 17 2010 - Part 2
rusersla
 
PDF
Los Angeles R users group - Dec 14 2010 - Part 1
rusersla
 
PDF
Los Angeles R users group - Dec 14 2010 - Part 3
rusersla
 
PDF
Los Angeles R users group - Dec 14 2010 - Part 2
rusersla
 
LA R meetup - Nov 2013 - Eric Klusman
rusersla
 
useR2011 - Whitcher
rusersla
 
useR2011 - Rougier
rusersla
 
useR2011 - Huber
rusersla
 
useR2011 - Gromping
rusersla
 
useR2011 - Edlefsen
rusersla
 
Los Angeles R users group - July 12 2011 - Part 1
rusersla
 
Los Angeles R users group - Nov 17 2010 - Part 2
rusersla
 
Los Angeles R users group - Dec 14 2010 - Part 1
rusersla
 
Los Angeles R users group - Dec 14 2010 - Part 3
rusersla
 
Los Angeles R users group - Dec 14 2010 - Part 2
rusersla
 

Recently uploaded (20)

PDF
Maximize Savings with the Spirit Airlines Low Fare Calendar
skyrobort68
 
PDF
India Today - Three is a Crowd News Article
mailfromshankar
 
PDF
Discover the Mystical Kailash Mansarovar Pilgrimage.pdf
EpicYatra
 
PDF
Hunza Autumn tours. Pakistan Autumn Tour
Hunzaadventuretours
 
PPTX
2 bedroom cottage rentals Rincon PR.pptx
Rincon PR Rentals
 
PPTX
axi Services in Chandigarh Safe & Reliable City Travel
cabexpresschandigarh
 
PPTX
Baku Travel Package – 4 Days of Adventure, Culture & Nature | From 1399 AED
gotripairseo
 
PDF
How Difficult Would It Be to Visit Kailash in Your Lifetime.pdf
EpicYatra
 
PDF
Chennai to Char Dham Yatra – Travel Tips
EpicYatra
 
PDF
Local AZ Tour Routing Plan for New Royals
ksherwin
 
PDF
Automated Bus Ticketing and Reservation Systems.pdf
cwticketingsystem
 
PPSX
Yangmei Ancient Town, Nanning, Guangxi, CN (中國 廣西南寧 揚美古鎮).ppsx
Chung Yen Chang
 
PPTX
3 bedroom condo rentals Bucerias august.pptx
Casa Bucerias
 
PPTX
How Does Avianca Name Change Policy Work?
Flying Rules
 
PPTX
Travel Tips for a Smooth Chandigarh–Amritsar Trip | Expert Guide
cabexpresschandigarh
 
PDF
Best & Top Travel Agency In Ahmedabad nikol
Rivera Holidays
 
PPTX
A Visual Journey Through the Wonders of South Korea
prajapatisarjuprasad
 
PDF
10-Day_Japan_Itinerary_for_First-Timers.pdf
varundv720
 
PPTX
Connecting-the-Future-The-Chenab-Bridge-Story.pptx
vedantbhatt077
 
PDF
Edneil Bonet_ Family, Freight & Dedication
Edneil Bonet
 
Maximize Savings with the Spirit Airlines Low Fare Calendar
skyrobort68
 
India Today - Three is a Crowd News Article
mailfromshankar
 
Discover the Mystical Kailash Mansarovar Pilgrimage.pdf
EpicYatra
 
Hunza Autumn tours. Pakistan Autumn Tour
Hunzaadventuretours
 
2 bedroom cottage rentals Rincon PR.pptx
Rincon PR Rentals
 
axi Services in Chandigarh Safe & Reliable City Travel
cabexpresschandigarh
 
Baku Travel Package – 4 Days of Adventure, Culture & Nature | From 1399 AED
gotripairseo
 
How Difficult Would It Be to Visit Kailash in Your Lifetime.pdf
EpicYatra
 
Chennai to Char Dham Yatra – Travel Tips
EpicYatra
 
Local AZ Tour Routing Plan for New Royals
ksherwin
 
Automated Bus Ticketing and Reservation Systems.pdf
cwticketingsystem
 
Yangmei Ancient Town, Nanning, Guangxi, CN (中國 廣西南寧 揚美古鎮).ppsx
Chung Yen Chang
 
3 bedroom condo rentals Bucerias august.pptx
Casa Bucerias
 
How Does Avianca Name Change Policy Work?
Flying Rules
 
Travel Tips for a Smooth Chandigarh–Amritsar Trip | Expert Guide
cabexpresschandigarh
 
Best & Top Travel Agency In Ahmedabad nikol
Rivera Holidays
 
A Visual Journey Through the Wonders of South Korea
prajapatisarjuprasad
 
10-Day_Japan_Itinerary_for_First-Timers.pdf
varundv720
 
Connecting-the-Future-The-Chenab-Bridge-Story.pptx
vedantbhatt077
 
Edneil Bonet_ Family, Freight & Dedication
Edneil Bonet
 

Los Angeles R users group - July 12 2011 - Part 2

  • 1. Turbocharge your R Rob Zinkov July 12th, 2011 Rob Zinkov () Turbocharge your R July 12th, 2011 1 / 23
  • 2. Outline 1 Introduction 2 .C 3 .Call 4 Rcpp Rob Zinkov () Turbocharge your R July 12th, 2011 2 / 23
  • 3. Introduction What is the point of this talk? Show you how to speed up your R code Rob Zinkov () Turbocharge your R July 12th, 2011 3 / 23
  • 4. Introduction Caveats • Please try to optimize your R code first • Some of these mechanisms will make coding harder Rob Zinkov () Turbocharge your R July 12th, 2011 4 / 23
  • 5. .C • This is the basic mechanism • Explicitly copies the data into C • Only accepts integer vectors Rob Zinkov () Turbocharge your R July 12th, 2011 5 / 23
  • 6. .C Step 1. Put function in file (foo.c) void foo(int *nin, double *x) { int n = nin[0]; int i; for (i=0; i<n; i++) x[i] = x[i] * x[i]; } Rob Zinkov () Turbocharge your R July 12th, 2011 6 / 23
  • 7. .C • Note this is a void function • Note arguments are passed in as pointers • Try to limit one function per file Rob Zinkov () Turbocharge your R July 12th, 2011 7 / 23
  • 8. .C Step 2. Compile file with R $ R CMD SHLIB foo.c Rob Zinkov () Turbocharge your R July 12th, 2011 8 / 23
  • 9. .C Step 3. Load into R > dyn.load("foo.so") Rob Zinkov () Turbocharge your R July 12th, 2011 9 / 23
  • 10. .C Step 4. Call your code .C("foo", n=as.integer(5), x=as.double(rnorm(5))) Rob Zinkov () Turbocharge your R July 12th, 2011 10 / 23
  • 11. .C • Arguments to .C are name of function followed by arguments • Arguments must be the right type • Touching C code runs risks of segfaults Rob Zinkov () Turbocharge your R July 12th, 2011 11 / 23
  • 12. .Call Why? • Less copying of data structures (lower memory) • Access more of R data structures • Access more kinds of R data • Do more in C Rob Zinkov () Turbocharge your R July 12th, 2011 12 / 23
  • 13. .Call .Call code #include <R.h> #include <Rinternals.h> #include <Rmath.h> SEXP vecSum(SEXP Rvec){ int i, n; double *vec, value = 0; vec = REAL(Rvec); n = length(Rvec); for (i = 0; i < n; i++) value += vec[i]; printf("The value is: %4.6f n", value); return R_NilValue; } Rob Zinkov () Turbocharge your R July 12th, 2011 13 / 23
  • 14. .Call R CMD SHLIB vecSum.c dyn.load("vecSum.so") .Call("vecSum", rnorm(10)) Rob Zinkov () Turbocharge your R July 12th, 2011 14 / 23
  • 15. .Call SEXP ab(SEXP Ra, SEXP Rb){ int i, a, b; SEXP Rval; Ra = coerceVector(Ra, INTSXP); Rb = coerceVector(Rb, INTSXP); a = INTEGER(Ra)[0]; b = INTEGER(Rb)[0]; PROTECT(Rval = allocVector(INTSXP, b - a + 1)); for (i = a; i <= b; i++) INTEGER(Rval)[i - a] = i; UNPROTECT(1); return Rval; } Rob Zinkov () Turbocharge your R July 12th, 2011 15 / 23
  • 16. .Call Since memory is shared explicit care must be taken not to collide with R Rob Zinkov () Turbocharge your R July 12th, 2011 16 / 23
  • 17. Rcpp Why? • Use C++ instead of C • Ability to use objects to represent R more naturally • Easier to load code Rob Zinkov () Turbocharge your R July 12th, 2011 17 / 23
  • 18. Rcpp src <- ’ IntegerVector tmp(clone(x)); double rate = as< double >(y); int tmpsize = tmp.size(); RNGScope scope; for (int ii =0; ii < tmpsize; ii++) { tmp(ii) = Rf_rbinom(tmp(ii), rate); }; return tmp; ’ require(inline) ## compile the function, inspect the process with verbose=T testfun2 = cxxfunction(signature(x=’integer’, y=’numeric’), src, plugin=’Rcpp’, verbose=T) Rob Zinkov () Turbocharge your R July 12th, 2011 18 / 23
  • 19. Rcpp require(inline) testfun = cxxfunction( signature(x="numeric", i="integer"), body = ’ NumericVector xx(x); int ii = as<int>(i); xx = xx * ii; return( xx ); ’, plugin="Rcpp") testfun(1:5, 3) Rob Zinkov () Turbocharge your R July 12th, 2011 19 / 23
  • 20. Rcpp Conclusions It is fairly easy to make R faster Rob Zinkov () Turbocharge your R July 12th, 2011 20 / 23
  • 21. Rcpp Conclusions Now go make your R code faster Rob Zinkov () Turbocharge your R July 12th, 2011 21 / 23
  • 22. Rcpp References • http://www.stat.umn.edu/ charlie/rc/ • http://helmingstay.blogspot.com/2011/06/efficient-loops-in-r- complexity-versus.html • http://www.sfu.ca/ sblay/R-C-interface.ppt • http://www.biostat.jhsph.edu/ bcaffo/statcomp/files/dotCall.pdf • http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp- quickref.pdf • http://www.jstatsoft.org/v40/i08/paper Rob Zinkov () Turbocharge your R July 12th, 2011 22 / 23
  • 23. Rcpp Questions? Rob Zinkov () Turbocharge your R July 12th, 2011 23 / 23