parallelBasics.R

Plain text source: parallelBasics.R


# -*- Mode:R; Coding:utf-8; fill-column:160 -*-

################################################################################################################################################################
# @file      parallelBasics.R
# @author    Mitch Richling <https://www.mitchr.me>
# @Copyright Copyright 2015 by Mitch Richling.  All rights reserved.
# @brief     Basic use of the parallel package bundled with R.@EOL
# @Keywords  base r package cran parallel
#

################################################################################################################################################################
# Load up the library
library(parallel)

################################################################################################################################################################
# Calculate the number instances based on core count
instancesInMyComputeCluster <- detectCores() - 1

################################################################################################################################################################
# Start up the cluster (FORK only works on UNIX'ish OSes)
myComputeCluster <- makeCluster(instancesInMyComputeCluster, type="FORK")

################################################################################################################################################################
# Run a function in each instance (you can add arguments after the function name)
unlist(clusterCall(myComputeCluster, 'Sys.getpid'))
[1] 14721 14722 14723
################################################################################################################################################################
# Run an expression in each instance (not necessary for the code below -- just showing how to run something)
unlist(clusterEvalQ(myComputeCluster, Sys.getpid()))
[1] 14721 14722 14723
################################################################################################################################################################
# Create some data, and compute the sin of each element.  Notice aVar need not be exported.
aVar <- 1:10
parSapply(myComputeCluster, aVar, sin)
 [1]  0.8414710  0.9092974  0.1411200 -0.7568025 -0.9589243 -0.2794155  0.6569866  0.9893582  0.4121185 -0.5440211
parLapply(myComputeCluster, aVar, sin)
[[1]]
[1] 0.841471

[[2]]
[1] 0.9092974

[[3]]
[1] 0.14112

[[4]]
[1] -0.7568025

[[5]]
[1] -0.9589243

[[6]]
[1] -0.2794155

[[7]]
[1] 0.6569866

[[8]]
[1] 0.9893582

[[9]]
[1] 0.4121185

[[10]]
[1] -0.5440211
################################################################################################################################################################
# Create another vector.  Note that it must be exported as it is in the last arg of parSapply.
bVar <- 10
clusterExport(myComputeCluster, 'bVar')
parSapply(myComputeCluster, aVar, function (x) bVar*x)
 [1]  10  20  30  40  50  60  70  80  90 100
################################################################################################################################################################
# Create some big data data and put it in 'cVar'
cVar <- runif(1000)

################################################################################################################################################################
# Export 'cVar' to to each instance
clusterExport(myComputeCluster, "cVar")

################################################################################################################################################################
# Load microbenchmark in the 'master' instance -- it will not be in the other instances
library(microbenchmark)

################################################################################################################################################################
# Benchmark computing 'sin' on our vector.  We do it on the cluster vs just the master instance
microbenchmark(parSapply(myComputeCluster, cVar, sin),
               sapply(cVar, sin))
Unit: microseconds
                                   expr       min         lq       mean    median         uq       max neval cld
 parSapply(myComputeCluster, cVar, sin) 41180.368 79606.3440 80220.9884 80098.062 81424.2775 86624.845   100   b
                      sapply(cVar, sin)   323.698   745.4735   775.0425   761.273   798.6215   977.231   100  a 
################################################################################################################################################################
# Shut down cluster
stopCluster(myComputeCluster)

The R session information (including the OS info, R version and all packages used):

    options(width=80)
    sessionInfo()
R version 3.3.0 (2016-05-03)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 8 (jessie)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  graphics  grDevices datasets  utils     grid      stats    
[8] base     

other attached packages:
[1] microbenchmark_1.4-2.1 RColorBrewer_1.1-2     reshape2_1.4.1        
[4] ggplot2_2.1.0          dplyr_0.4.3            data.table_1.9.6      
[7] gridExtra_2.2.1        knitr_1.13             lattice_0.20-33       

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.5      magrittr_1.5     MASS_7.3-45      splines_3.3.0   
 [5] munsell_0.4.3    colorspace_1.2-6 R6_2.1.2         multcomp_1.4-5  
 [9] stringr_1.0.0    highr_0.6        plyr_1.8.3       tools_3.3.0     
[13] gtable_0.2.0     TH.data_1.0-7    DBI_0.4-1        survival_2.39-2 
[17] assertthat_0.1   Matrix_1.2-6     formatR_1.4      codetools_0.2-14
[21] evaluate_0.9     sandwich_2.3-4   stringi_1.0-1    methods_3.3.0   
[25] scales_0.4.0     mvtnorm_1.0-5    chron_2.3-47     zoo_1.7-13      
    Sys.time()
[1] "2016-07-09 20:06:43 CDT"