forked from rstudio/webinars
-
Notifications
You must be signed in to change notification settings - Fork 0
/
log.cpp
53 lines (43 loc) · 1.18 KB
/
log.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
#include <Rcpp.h>
using namespace Rcpp;
struct Log {
double operator()(double value) { return log(value); }
};
struct LogWorker : public RcppParallel::Worker
{
RcppParallel::RVector<double> input, output;
// initialize inputs
LogWorker(Rcpp::NumericVector input, Rcpp::NumericVector output)
: input(input), output(output) {}
// define work (accepts a range of items to work on)
void operator()(std::size_t begin, std::size_t end) {
std::transform(input.begin() + begin,
input.begin() + end,
output.begin() + begin,
Log());
}
};
// [[Rcpp::export]]
NumericVector parallelLog(NumericVector input)
{
// allocate our output vector
NumericVector output = no_init(input.size());
// construct our worker
LogWorker worker(input, output);
// give 'parallelFor' the range of values + our worker
RcppParallel::parallelFor(0, input.size(), worker);
// return to R
return output;
}
/*** R
x <- as.numeric(1:1E7)
identical(log(x), parallelLog(x))
library(microbenchmark)
microbenchmark(
R = log(x),
RcppParallel = parallelLog(x),
times = 10
)
*/