require(foreach)
require(multicore)
require(doMC)

MCInt <- function(Mv = 1000, fn){
    h <- function(m) {
      x<-runif(m)
      v<-fn(x)
      return(mean(v))
    }
    val <- h(Mv)
    return(val)
}


f<-function(x){return(sqrt(x))}

set.seed(123)
M<-1e8
system.time(Ival<-MCInt(Mv=M,fn=f))
print(Ival)


MCInt.par <- function(Mv = 1000, fn){
    h <- function(m) {
      x<-runif(m)
      v<-fn(x)
      return(mean(v))
    }
    nodes <- getDoParWorkers()
    print(paste('Number of nodes being used :',nodes))
    p <- foreach(m = rep(Mv/nodes, nodes),.combine = "c") %dopar% h(m)
    p <- mean(p)
    return(p)
  }

registerDoMC(cores=1)
set.seed(123)
M<-1e8
system.time(Ival<-MCInt.par(Mv=M,fn=f))
print(Ival)

registerDoMC(cores=2)
set.seed(123)
M<-1e8
system.time(Ival<-MCInt.par(Mv=M,fn=f))
print(Ival)
