<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-AU" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Apologies for bumping a post, but I still remain frustrated.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I have not been able to find a sufficient solution to this in the Achieves that isn’t preceded with “Use Google perftools”. So I assume lack of response is not due to my ignorance of an easily discoverable solution  in
 the Achieves.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Surely we should be able to profile Rcpp code with other profilers out there, and not limit people to use of Google Perftools. Again, any help with the following would be appreciated.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> Hi All,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> I am trying to profile some Rcpp code, and have tried using Solaris Studios and Intel Vtune with little success.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> I have found the info re. Google perftools here http://dirk.eddelbuettel.com/papers/ismNov2009introHPCwithR.pdf and here http://stackoverflow.com/questions/13224322/profiling-rcpp-code-on-os-x but would prefer to find
 a more generic solution applicable to a number of profiler products (note: I have not tried the perftools solution yet, if nobody has an alternative solution I'll will install and try perftools) .<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> We have compiled a version of R 3.0.2 with both debug+profiling flags (i.e. -g -pg) and profiling only (i.e. -pg).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> Solarise Studio can  profile with only the debugger information. While vtune relies on a profiling compilation I believe.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> As an example, take:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> $:> cat ProfilingTest.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> #include <math.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> #include <Rcpp.h><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> void shortFunc(Rcpp::NumericVector x,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>                Rcpp::NumericVector y) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     Rcpp::NumericVector temp(x.size());<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     for (unsigned int j = 0; j < x.size(); j++) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>         temp[j]=sqrt(x[j]/y[j]);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> void lengthyFunc(Rcpp::NumericVector x,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>                  Rcpp::NumericVector y) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     Rcpp::NumericVector temp(x.size());<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     for (unsigned int i = 0; i < 1000; i++) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>         for (unsigned int j = 0; j < x.size(); j++) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>             temp[j]=sqrt(x[j]/y[j]);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>         }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> // [[Rcpp::export]]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> void testfunc(SEXP x, SEXP y){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     Rcpp::NumericVector v1(x);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     Rcpp::NumericVector v2(y);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     for (unsigned int i=0; i<100; i++){<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>         shortFunc(v1,v2);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>         lengthyFunc(v1,v2);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">>     }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> To get a profile (and similarly debug) version of the Rcpp code using either sourceCpp or cxxfunction I do the following in R run through the profiler product's interrogation process:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > require(Rcpp)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > Sys.setenv("-pg")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > sourceCpp("ProfilingTest.cpp")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > testfunc(rnorm(10000),rnorm(10000))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > q("no")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> OR<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > require(inline)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > require(Rcpp)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > myplugin=getPlugin("Rcpp")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > myplugin$env$PKG_CXXFLAGS<-"-pg"<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > testfunc<-cxxfunction(signature(x="numeric",y="numeric"), includes=readLines("ProfilingTest.cpp"), body="testfunc(x,y);", settings=myplugin)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > testfunc(rnorm(10000),rnorm(10000))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> > q("no")<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> When viewing the profiler results however, both profilers I tried give a single, non descriptive, entry for the call to testfunc(), where the functions names would otherwise be listed. Something along the lines of:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <sourceCpp_XXXX.so> - No functions found<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> and similarly for the file produced by cxxfunction . This gives you no more information than running the code with Rprof(), which assigns all the C++ time to the <Anonymous> tag/function.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> With Solaris Studios I even used "collect -A copy R" to automatically copy and archive the loaded ".so" files of the program together with the raw profile results, so that the temporary sourceCPP_xxxx.so with profiling
 file should be available during the analysis/viewing stage (analyzer program), but no luck.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> Can anyone see something obvious the I am doing wrong here? Could it be that functions inside the Rcpp source are simply being optimized out in favour of inlined code? Surely you would at least see the one entry point
 function to the .so file.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> Any help from someone who has done this successfully would be appreciated.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> Cheers,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> Luke Domanski.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>