{smcl} {* *! version 0.2.0 26feb2021}{...} {title:Title} {p2colset 5 21 21 2}{...} {p2col :{cmd:parallel_map} {hline 2}}Run Stata commands in parallel (wrapper of {help parallel} package){p_end} {p2colreset}{...} {marker syntax}{...} {title:Syntax} {pstd}Run many parallel instances of a command, in separate Stata instances:{p_end} {phang2} {cmd:parallel_map} {cmd:,} {opth val:ues(numlist)} [{opt max:processes(#)}] [{it:options}] {cmd::} {it:cmd} {synoptset 21 tabbed}{...} {synopthdr} {synoptline} {syntab:Parallel:} {p2coldent:* {opth val:ues(numlist)}}each of these values will end up as the $task_id global in its own Stata process (so we will launch in total as many processes as values here){p_end} {synopt :{opt max:processes(#)}}maximum number of Stata processes that will be open {it:at the same time}. Default: {it:(total cores / cores per process)}{p_end} {synopt :{opt core:s_per_process(#)}}number of CPU cores that each process will take. Default is {help " creturn##values":{it:c(processors)}}{p_end} {synopt :{opt force}}to avoid slowing down total execution, we reduce {it:maxproc} if {it:(maxprocesses X cores per process)} exceeds the total number of cores available in the computer. {it:force} disables this{p_end} {syntab:Execution options:} {synopt :{opt v:erbose}}show more information{p_end} {synopt :{opt nolog:table}}supress table linking to log-files of all processes{p_end} {synopt :{opth pr:ograms(namelist)}}list of programs that will be exported to the worker processes{p_end} {syntab:Internals:} {synopt :{opt id(#)}}identifier of the {it:boss} process. Used as part the temporary folder names. Default: a pseudo-random number based on {it:runiform()}{p_end} {synopt :{opt stata:_path(string)}}path of the Stata binary to be used. Default is based on the {it:parallel} package{p_end} {synopt :{opt tmp:_path(string)}}folder where temporary files will be stored (they are stored in a sub-folder of this). Default is {help " creturn##directories":{it:c(tmpdir)}}{p_end} {synoptline} {p2colreset}{...} {p 4 6 2}* {opth val:ues(numlist)} is required.{p_end} {title:Description} {pstd} parallel_map is a wrapper of the {browse "https://github.com/gvegayon/parallel":parallel} package, with a slightly different syntax. {p_end} {marker examples}{...} {title:Examples} {pstd}Compute three different random numbers (view them in the log):{p_end} {phang2}{cmd:. parallel_map, val(1/3) verbose: di runiform()}{p_end} {pstd}Run a program that accesses the three globals that we can use to load/save data from/to disk:{p_end} {hline} {phang2}{cmd: program define MyExample}{p_end} {phang2}{cmd: di "$parallel_dir" // we can save load/stuff here and then delete it}{p_end} {phang2}{cmd: di "The task ID we can use to save results is: $task_id"}{p_end} {phang2}{cmd: di "Also useful: $padded_task_id"}{p_end} {phang2}{cmd: end}{p_end} {phang2}{space 4}{p_end} {phang2}{cmd: parallel_map, val(1/3) verbose program(MyExample): MyExample}{p_end} {hline}