h ave m o re th a n o n e? c pus - w hy d o w e...th e s eco n d : x[8] = x[7] = 7 c an' t u s...
TRANSCRIPT
![Page 1: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/1.jpg)
CPUs - why do wehave more than
one?W R ITIN G E FFIC IE N T R C OD E
Colin Gillespie
Jumping Rivers & Newcastle University
![Page 2: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/2.jpg)
WRITING EFFICIENT R CODE
CPUsCPU: brains of the computer
Speed has slowly
stabilized
CPUs were ge�ing too
hot
Multi-core CPUs
But R only uses 1 core :(
![Page 3: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/3.jpg)
WRITING EFFICIENT R CODE
Your CPUlibrary("parallel") detectCores()
8
library("benchmarkme") get_cpu()
# $vendor_id # "GenuineIntel" # # $model_name # "Intel(R) Core(TM) i7-4702HQ CPU # # $no_of_cores # 8
![Page 4: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/4.jpg)
Let's practice!W R ITIN G E FFIC IE N T R C OD E
![Page 5: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/5.jpg)
What sort ofproblems benefit
from parallelcomputing
W R ITIN G E FFIC IE N T R C OD E
Colin Gillespie
Jumping Rivers & Newcastle University
![Page 6: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/6.jpg)
WRITING EFFICIENT R CODE
CookingAN EXTRA HAND TOO MANY COOKS
![Page 7: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/7.jpg)
WRITING EFFICIENT R CODE
Running in parallelNot every analysis can make use of multiple cores
Many statistical algorithms can only use a single core
So where can parallel computing help?
![Page 8: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/8.jpg)
WRITING EFFICIENT R CODE
Monte-Carlo simulations
for(i in 1:8) + sims[i] <- monte_carlo()
combine(sims)
8 core machine
One simulation per core
Combine the results at
the end
Embarrassingly parallel
![Page 9: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/9.jpg)
WRITING EFFICIENT R CODE
Not everything runs in parallelx <- 1:8 for(i in 2:8) + x[i] <- x[i-1]
x[8] = x[7] = ... x[2] = x[1] = 1
Can we run this in parallel?
NO
But order of evaluation
in parallel computing
can't be predicted
We'll get the wrong
answer, since x[3]may get evaluated
before x[2]
![Page 10: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/10.jpg)
WRITING EFFICIENT R CODE
Rule of thumbCan the loop be run forward and backwards?
for(i in 1:8) + sim[i] <- monte_carlo_simulation() for(i in 8:1) + sim[i] <- monte_carlo_simulation()
Both loops give the same result
So we can run the loops in parallel
![Page 11: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/11.jpg)
WRITING EFFICIENT R CODE
Rule of thumbCan the loop be run forward and backwards?
x <- 1:8 for(i in 2:8) + x[i] <- x[i-1] for(i in 8:2) + x[i] <- x[i-1]
The loops give di�erent answers
The �rst: x[8] = x[7] = ... = 1
The second: x[8] = x[7] = 7
Can't use parallel computing
Remember: If you can run your loop in reverse, you can
probably use parallel computing.
![Page 12: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/12.jpg)
Let's practice!W R ITIN G E FFIC IE N T R C OD E
![Page 13: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/13.jpg)
The parallelpackage - parApply
W R ITIN G E FFIC IE N T R C OD E
Colin Gillespie
Jumping Rivers & Newcastle University
![Page 14: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/14.jpg)
WRITING EFFICIENT R CODE
The parallel packagePart of R since 2011
library("parallel")
Cross platform: Code works under Windows, Linux, Mac
Has parallel versions of standard functions
![Page 15: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/15.jpg)
WRITING EFFICIENT R CODE
The apply() functionapply() is similar to a for loop
We apply a function to each row/column of a matrix
A 10 column, 10,000 row matrix:
m <- matrix(rnorm(100000), ncol = 10)
apply is neater than a for loop
res <- apply(m, 1, median)
![Page 16: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/16.jpg)
WRITING EFFICIENT R CODE
Converting to parallelLoad the package
Specify the number of
cores
Create a cluster object
Swap to parApply()
Stop!
library("parallel")
copies_of_r <- 7
cl <- makeCluster(copies_of_r)
parApply(cl, m, 1, median)
stopCluster(cl)
![Page 17: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/17.jpg)
WRITING EFFICIENT R CODE
The bad newsAs Lewis Caroll said
The hurrier I go, the behinder I get.
Sometimes running in parallel is slower due to thread
communication
# Serial version apply(m, 1, median)
# Parallel version parApply(cl, m, 1, median)
Benchmark both solutions
![Page 18: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/18.jpg)
Let's practice!W R ITIN G E FFIC IE N T R C OD E
![Page 19: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/19.jpg)
The parallelpackage -parSapply
W R ITIN G E FFIC IE N T R C OD E
Colin Gillespie
Jumping Rivers & Newcastle University
![Page 20: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/20.jpg)
WRITING EFFICIENT R CODE
The apply familyThere are parallel versions of
apply() - parApply()
sapply() - parSapply()applying a function to a vector, i.e. a for loop
lapply() - parLapply()applying a function to a list
![Page 21: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/21.jpg)
WRITING EFFICIENT R CODE
The sapply() functionsapply() is just another way of writing a for loop
The loop
for(i in 1:10) + x[i] <- simulate(i)
Can be wri�en as
sapply(1:10, simulate)
We are applying a function to each value of a vector
![Page 22: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/22.jpg)
WRITING EFFICIENT R CODE
Switching to parSapply()It's the same recipe!
1. Load the package
2. Make a cluster
3. Switch to parSapply()
4. Stop!
![Page 23: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/23.jpg)
WRITING EFFICIENT R CODE
Example: Pokemon battlesplot(pokemon$Defense, pokemon$Attack) abline(lm(pokemon$Attack ~ pokemon$Defense), col = 2) cor(pokemon$Attack, pokemon$Defense)
0.437
![Page 24: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/24.jpg)
WRITING EFFICIENT R CODE
BootstrappingIn a perfect world, we would resample from the population; but
we can't
Instead, we assume the original sample is representative of the
population
1. Sample with replacement from your data
The same point could appear multiple times
2. Calculate the correlation statistics from your new sample
3. Repeat
![Page 25: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/25.jpg)
WRITING EFFICIENT R CODE
A single bootstrap
bootstrap <- function(data_set) { + # Sample with replacement + s <- sample(1:nrow(data_set), replace = TRUE) + new_data <- data_set[s,] + + # Calculate the correlation + cor(new_data$Attack, new_data$Defense) + }
# 100 independent bootstrap simulations sapply(1:100, function(i) bootstrap(pokemon))
![Page 26: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/26.jpg)
WRITING EFFICIENT R CODE
Converting to parallelLoad the package
Specify the number of cores
Create a cluster object
Export functions/data
Swap to parSapply()
Stop!
library("parallel")
no_of_cores <- 7
cl <- makeCluster(no_of_cores)
clusterExport(cl, c("bootstrap", "pokemon"))
parSapply(cl, 1:100, function(i) bootstrap(pokemon))
stopCluster(cl)
![Page 27: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/27.jpg)
WRITING EFFICIENT R CODE
Timings
![Page 28: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/28.jpg)
Let's practice!W R ITIN G E FFIC IE N T R C OD E
![Page 29: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/29.jpg)
Congratulations!W R ITIN G E FFIC IE N T R C OD E
Colin Gillespie
Jumping Rivers & Newcastle University
![Page 30: h ave m o re th a n o n e? C PUs - w hy d o w e...Th e s eco n d : x[8] = x[7] = 7 C an' t u s e p arallel co mp u t in g Re me mbe r : I f yo u can ru n yo u r lo o p in revers e,](https://reader035.vdocument.in/reader035/viewer/2022081616/5feac8b9c7ab772491606ac7/html5/thumbnails/30.jpg)
Final SlideW R ITIN G E FFIC IE N T R C OD E