One follow up point that I thought of during the RUG meeting: One of my favorite packages, data.table, does parallelization under the hood. So, e.g.: DT <- data.table(expand.grid(paramA = ..., paramB = ..., paramC=...)) # i.e., get all the combinations of params A, B, C DT[, serial := 1:.N] DT[, result := someFunction(paramA, paramB, paramC), by=serial] ...is automatically parallelized. The bit with the `serial` manages when someFunction isn't vectorized.