#include #include #if RCPP_PARALLEL_USE_TBB // TBB support turned on #include #include #include extern "C" SEXP setThreadOptions(SEXP numThreadsSEXP, SEXP stackSizeSEXP) { static tbb::task_scheduler_init* s_pTaskScheduler = NULL; int numThreads = Rf_asInteger(numThreadsSEXP); int stackSize = Rf_asInteger(stackSizeSEXP); try { if (!s_pTaskScheduler) { s_pTaskScheduler = new tbb::task_scheduler_init(numThreads, stackSize); } else { s_pTaskScheduler->terminate(); s_pTaskScheduler->initialize(numThreads, stackSize); } } catch(const std::exception& e) { Rf_error(("Error loading TBB: " + std::string(e.what())).c_str()); } catch(...) { Rf_error("Error loading TBB: (Unknown error)"); } return R_NilValue; } extern "C" SEXP defaultNumThreads() { SEXP threadsSEXP = Rf_allocVector(INTSXP, 1); INTEGER(threadsSEXP)[0] = tbb::task_scheduler_init::default_num_threads(); return threadsSEXP; } #else // TBB support not turned on #include extern "C" SEXP setThreadOptions(SEXP numThreadsSEXP, SEXP stackSizeSEXP) { return R_NilValue; } extern "C" SEXP defaultNumThreads() { SEXP threadsSEXP = Rf_allocVector(INTSXP, 1); INTEGER(threadsSEXP)[0] = tthread::thread::hardware_concurrency(); return threadsSEXP; } #endif