<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://info.stat.cmu.edu/index.php?action=history&amp;feed=atom&amp;title=Parallelization_on_PSC%2FBridges-2</id>
	<title>Parallelization on PSC/Bridges-2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://info.stat.cmu.edu/index.php?action=history&amp;feed=atom&amp;title=Parallelization_on_PSC%2FBridges-2"/>
	<link rel="alternate" type="text/html" href="https://info.stat.cmu.edu/index.php?title=Parallelization_on_PSC/Bridges-2&amp;action=history"/>
	<updated>2026-11-05T22:52:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://info.stat.cmu.edu/index.php?title=Parallelization_on_PSC/Bridges-2&amp;diff=833&amp;oldid=prev</id>
		<title>Ajshen at 03:25, 29 June 2026</title>
		<link rel="alternate" type="text/html" href="https://info.stat.cmu.edu/index.php?title=Parallelization_on_PSC/Bridges-2&amp;diff=833&amp;oldid=prev"/>
		<updated>2026-06-29T03:25:43Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 03:25, 29 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Parallelization]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:PSC]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This document aims to outline the essential steps for getting up-and-running as quickly as possible on the Pittsburgh Supercomputing Center (PSC) and Bridges-2, with a particular focus on running parallel computation in Python and R.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This document aims to outline the essential steps for getting up-and-running as quickly as possible on the Pittsburgh Supercomputing Center (PSC) and Bridges-2, with a particular focus on running parallel computation in Python and R.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key infowiki:diff:1.41:old-42:rev-833:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Ajshen</name></author>
	</entry>
	<entry>
		<id>https://info.stat.cmu.edu/index.php?title=Parallelization_on_PSC/Bridges-2&amp;diff=42&amp;oldid=prev</id>
		<title>Skipper: Created page with &quot; This document aims to outline the essential steps for getting up-and-running as quickly as possible on the Pittsburgh Supercomputing Center (PSC) and Bridges-2, with a partic...&quot;</title>
		<link rel="alternate" type="text/html" href="https://info.stat.cmu.edu/index.php?title=Parallelization_on_PSC/Bridges-2&amp;diff=42&amp;oldid=prev"/>
		<updated>2024-03-30T00:10:12Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot; This document aims to outline the essential steps for getting up-and-running as quickly as possible on the Pittsburgh Supercomputing Center (PSC) and Bridges-2, with a partic...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
This document aims to outline the essential steps for getting up-and-running as quickly as possible on the Pittsburgh Supercomputing Center (PSC) and Bridges-2, with a particular focus on running parallel computation in Python and R.&lt;br /&gt;
&lt;br /&gt;
These notes should be treated as a specific application-focused complement to the&amp;amp;nbsp;[https://portal.xsede.org/psc-bridges-2#running-sbatch official documentation]&amp;amp;nbsp;rather than a substitute.&amp;amp;nbsp;This document is a work in progress. Please feel free to contribute to it!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Account Setup&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
XSEDE is now discontinued and the system has transitioned to ACCESS.&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TBD&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Running your first job&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Logging into Bridges2/PSC via&amp;amp;nbsp;&amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Start by&amp;amp;nbsp;&amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt;ing into the bridges2 server at port 2222:&lt;br /&gt;
&amp;lt;pre&amp;gt;ssh -p 2222 &amp;lt;username&amp;gt;@bridges2.psc.edu&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will be prompted for your XSEDE credentials. Use your XSEDE User Portal password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Creating a slurm job batch script ===&lt;br /&gt;
&lt;br /&gt;
Bridges-2 uses a job-scheduling system called &amp;quot;slurm&amp;quot;, providing a way for users like ourselves to request specific resources for our compute jobs and automatically launch jobs once said resources have become available.&lt;br /&gt;
&lt;br /&gt;
Jobs are submitted using the&amp;amp;nbsp;&amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;&amp;amp;nbsp;command along with a&amp;amp;nbsp;&amp;#039;&amp;#039;&amp;#039;batch script&amp;#039;&amp;#039;&amp;#039;&amp;amp;nbsp;which we must create. A batch script may look like the following.&lt;br /&gt;
&amp;lt;pre dir=&amp;quot;auto&amp;quot;&amp;gt;#!/bin/bash&lt;br /&gt;
#SBATCH -p EM&lt;br /&gt;
#SBATCH -N 1&lt;br /&gt;
#SBATCH -n 24&lt;br /&gt;
#SBATCH --mem 5GB&lt;br /&gt;
#SBATCH -t 00:01:00&lt;br /&gt;
#SBATCH --mail-type=ALL&lt;br /&gt;
&lt;br /&gt;
# Load Anaconda&lt;br /&gt;
module load anaconda3&lt;br /&gt;
conda activate&lt;br /&gt;
&lt;br /&gt;
python parallel.py&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above script requests the Extreme Memory (EM) partition, with one node, 24 cores, 5GB of memory, for 1 minute, and sends an email to the job runner once the script begins/finishes/fails/etc. This script then loads a&amp;amp;nbsp;&amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt;&amp;amp;nbsp;environment and runs a python script called&amp;amp;nbsp;&amp;lt;code&amp;gt;parallel.py&amp;lt;/code&amp;gt;&amp;amp;nbsp;which we will discuss in the&amp;amp;nbsp;[https://github.com/WannabeSmith/PSC-Bridges-resources#python python]&amp;amp;nbsp;example.&lt;br /&gt;
&lt;br /&gt;
More generally, these batch scripts take the following form.&lt;br /&gt;
&amp;lt;pre&amp;gt;#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
### REQUEST RESOURCES ###&lt;br /&gt;
#SBATCH -arg1 argument1&lt;br /&gt;
#SBATCH -arg2 argument2 &lt;br /&gt;
# .&lt;br /&gt;
# .&lt;br /&gt;
# .&lt;br /&gt;
#SBATCH -arg3 argument3&lt;br /&gt;
&lt;br /&gt;
### LOAD MODULES ###&lt;br /&gt;
module load some_module&lt;br /&gt;
&lt;br /&gt;
### RUN SCRIPTS ###&lt;br /&gt;
python myscript.py&lt;br /&gt;
Rscript myscript.R&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The area under &amp;quot;REQUEST RESOURCES&amp;quot; is where we request specific resources such as the partition of your allocation to run on (e.g. RM or EM for regular memory or extreme memory, respectively), the amount of compute time, the number of nodes, the number of cores, and so on.&lt;br /&gt;
&lt;br /&gt;
Some common options are given in the following table.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; style=&amp;quot;width: 686px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 194px;&amp;quot; | Argument&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 195px;&amp;quot; | Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 275px;&amp;quot; | Example&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 194px;&amp;quot; | &amp;lt;pre&amp;gt;-p &amp;lt;partition&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 195px;&amp;quot; | Partition&lt;br /&gt;
| style=&amp;quot;width: 275px;&amp;quot; | &amp;lt;pre&amp;gt;-p EM&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 194px;&amp;quot; | &amp;lt;pre&amp;gt;-t &amp;lt;HH:MM:SS&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 195px;&amp;quot; | Amount of compute time&lt;br /&gt;
| style=&amp;quot;width: 275px;&amp;quot; | &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;-t 00:01:00&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(equivalent to 1 hour)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 194px;&amp;quot; | &amp;lt;pre&amp;gt;-N &amp;lt;nodes&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 195px;&amp;quot; | Number of nodes&lt;br /&gt;
| style=&amp;quot;width: 275px;&amp;quot; | &amp;lt;pre&amp;gt;-N 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 194px;&amp;quot; | &amp;lt;pre&amp;gt;-n &amp;lt;cores&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 195px;&amp;quot; | Number of total cores&lt;br /&gt;
| style=&amp;quot;width: 275px;&amp;quot; | &amp;lt;pre&amp;gt;-n 25&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 194px;&amp;quot; | &amp;lt;pre&amp;gt;--mem=&amp;lt;memory in GB&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 195px;&amp;quot; | Amount of RAM in GB&lt;br /&gt;
| style=&amp;quot;width: 275px;&amp;quot; | &amp;lt;pre&amp;gt;--mem=10GB&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 194px;&amp;quot; | &amp;lt;pre&amp;gt;--mail-type=&amp;lt;type&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 195px;&amp;quot; | Type of mail to receive (one of&amp;amp;nbsp;&amp;lt;code&amp;gt;ALL&amp;lt;/code&amp;gt;,&amp;amp;nbsp;&amp;lt;code&amp;gt;FAIL&amp;lt;/code&amp;gt;,&amp;amp;nbsp;&amp;lt;code&amp;gt;START&amp;lt;/code&amp;gt;,&amp;amp;nbsp;&amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width: 275px;&amp;quot; | &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;--mail-type=ALL&amp;lt;/code&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;--mail-type=FAIL&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a comprehensive list, see&amp;amp;nbsp;[https://portal.xsede.org/psc-bridges-2#running-sbatch https://portal.xsede.org/psc-bridges-2#running-sbatch].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;LOAD MODULES&amp;quot; is where you load the required modules to run your scripts. For example, loading python often requires a conda environment. To see the list of all possible modules, you can run&amp;amp;nbsp;&amp;lt;code&amp;gt;module avail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;RUN SCRIPTS&amp;quot; is where you run your python/R/julia/etc. scripts. If executed correctly, these scripts will have access to the resources requested by the batch script.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s see some of these ideas used in a parallel computing example.&lt;br /&gt;
&lt;br /&gt;
=== Parallel computation ===&lt;br /&gt;
&lt;br /&gt;
In this section, we will perform parallel computations using the examples in&amp;amp;nbsp;[https://github.com/WannabeSmith/PSC-Bridges-resources/blob/main/examples examples]&amp;amp;nbsp;with implementations in both Python and R, alongside an appropriately designed slurm job batch script.&lt;br /&gt;
&lt;br /&gt;
Clone this repository wherever you keep your projects on bridges2.psc.edu.&lt;br /&gt;
&amp;lt;pre dir=&amp;quot;auto&amp;quot;&amp;gt;# After logging into bridges2.psc.edu.&lt;br /&gt;
# In my/projects/folder&lt;br /&gt;
&lt;br /&gt;
git clone https://github.com/WannabeSmith/PSC-Bridges-resources.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using either Python or R, we will be running a function&amp;amp;nbsp;&amp;lt;code&amp;gt;slow_successor(i)&amp;lt;/code&amp;gt;&amp;amp;nbsp;which simply returns&amp;amp;nbsp;&amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;&amp;amp;nbsp;but with a time delay. We will run this function on the integers 0 through 99, using parallel and non-parallel implementations to see the difference in computation time.&lt;br /&gt;
&lt;br /&gt;
To use Python, continue on to the next section. To use R, jump to&amp;amp;nbsp;[https://github.com/WannabeSmith/PSC-Bridges-resources#r R].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
We will recreate the example from&amp;amp;nbsp;[https://github.com/WannabeSmith/PSC-Bridges-resources/blob/main/examples/python/python_parallel examples/python/python_parallel].&lt;br /&gt;
&lt;br /&gt;
Enter the folder&amp;amp;nbsp;&amp;lt;code&amp;gt;examples/python/python_parallel&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;cd examples/python/python_parallel&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We will be running a rather simple function&amp;amp;nbsp;&amp;lt;code&amp;gt;slow_successor(i)&amp;lt;/code&amp;gt;&amp;amp;nbsp;which simply returns&amp;amp;nbsp;&amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt;&amp;amp;nbsp;but with a time delay. We will run this function on the integers 0 through 99, using parallel and non-parallel implementations to see the difference in computation time.&lt;br /&gt;
&lt;br /&gt;
Our slurm batch script&amp;amp;nbsp;&amp;lt;code&amp;gt;jobscript.job&amp;lt;/code&amp;gt;&amp;amp;nbsp;is written as the following.&lt;br /&gt;
&amp;lt;pre&amp;gt;# jobscript.job&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p EM&lt;br /&gt;
#SBATCH -N 1&lt;br /&gt;
#SBATCH -n 24&lt;br /&gt;
#SBATCH --mem 5GB&lt;br /&gt;
#SBATCH -t 00:01:00&lt;br /&gt;
#SBATCH --mail-type=ALL&lt;br /&gt;
&lt;br /&gt;
# Load Anaconda&lt;br /&gt;
module load anaconda3&lt;br /&gt;
conda activate&lt;br /&gt;
&lt;br /&gt;
python parallel.py&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above batch script requests several resources, loads a&amp;amp;nbsp;&amp;lt;code&amp;gt;conda&amp;lt;/code&amp;gt;&amp;amp;nbsp;environment, and runs a python file&amp;amp;nbsp;&amp;lt;code&amp;gt;parallel.py&amp;lt;/code&amp;gt;. This file&amp;amp;nbsp;&amp;lt;code&amp;gt;parallel.py&amp;lt;/code&amp;gt;&amp;amp;nbsp;is written as follows.&lt;br /&gt;
&amp;lt;pre&amp;gt;# parallel.py&lt;br /&gt;
&lt;br /&gt;
import multiprocessing&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def slow_successor(i):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    An intentionally slow function that we wish to parallelize&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    time.sleep(0.1)&lt;br /&gt;
    return i + 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# We will run `slow_successor` on the numbers 0 through num_iterations-1.&lt;br /&gt;
num_iterations = 100&lt;br /&gt;
&lt;br /&gt;
# Non-parallel implementation:&lt;br /&gt;
start_time = time.time()&lt;br /&gt;
result = list(map(slow_successor, range(num_iterations)))&lt;br /&gt;
end_time = time.time()&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Non-parallel compute time: &amp;quot; + str(end_time - start_time) + &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parallel implementation:&lt;br /&gt;
n_cores = multiprocessing.cpu_count()&lt;br /&gt;
start_time = time.time()&lt;br /&gt;
with multiprocessing.Pool(n_cores) as p:&lt;br /&gt;
    result = p.map(slow_successor, range(num_iterations))&lt;br /&gt;
end_time = time.time()&lt;br /&gt;
&lt;br /&gt;
print(&lt;br /&gt;
    &amp;quot;Parallel compute time on &amp;quot;&lt;br /&gt;
    + str(n_cores)&lt;br /&gt;
    + &amp;quot; cores: &amp;quot;&lt;br /&gt;
    + str(end_time - start_time)&lt;br /&gt;
    + str(&amp;quot; seconds&amp;quot;)&lt;br /&gt;
)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can now run&amp;amp;nbsp;&amp;lt;code&amp;gt;parallel.py&amp;lt;/code&amp;gt;&amp;amp;nbsp;using the resources allocated via&amp;amp;nbsp;&amp;lt;code&amp;gt;jobscript.job&amp;lt;/code&amp;gt;&amp;amp;nbsp;with the&amp;amp;nbsp;&amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;&amp;amp;nbsp;command.&lt;br /&gt;
&amp;lt;pre&amp;gt;sbatch jobscript.job&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Running&amp;amp;nbsp;&amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;&amp;amp;nbsp;will submit a job with particular job ID (e.g. 1234567). The output from the job will then be written to&amp;amp;nbsp;&amp;lt;code&amp;gt;slurm-&amp;lt;jobid&amp;gt;.out&amp;lt;/code&amp;gt;&amp;amp;nbsp;(e.g.&amp;amp;nbsp;&amp;lt;code&amp;gt;slurm-1234567.out&amp;lt;/code&amp;gt;). The output from&amp;amp;nbsp;&amp;lt;code&amp;gt;jobscript.job&amp;lt;/code&amp;gt;&amp;amp;nbsp;should look something like&lt;br /&gt;
&amp;lt;pre&amp;gt;Non-parallel compute time: 10.018450498580933 seconds.&lt;br /&gt;
Parallel compute time on 96 cores: 0.3378734588623047 seconds&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== R ====&lt;br /&gt;
&lt;br /&gt;
We will recreate the example from&amp;amp;nbsp;[https://github.com/WannabeSmith/PSC-Bridges-resources/blob/main/examples/R/R_parallel examples/R/R_parallel].&lt;br /&gt;
&lt;br /&gt;
Enter the folder&amp;amp;nbsp;&amp;lt;code&amp;gt;examples/R/R_parallel&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;cd examples/R/R_parallel&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Our slurm batch script&amp;amp;nbsp;&amp;lt;code&amp;gt;jobscript.job&amp;lt;/code&amp;gt;&amp;amp;nbsp;is written as the following.&lt;br /&gt;
&amp;lt;pre&amp;gt;# jobscript.job&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH -p EM&lt;br /&gt;
#SBATCH -N 1&lt;br /&gt;
#SBATCH -n 24&lt;br /&gt;
#SBATCH --mem 5GB&lt;br /&gt;
#SBATCH -t 00:01:00&lt;br /&gt;
#SBATCH --mail-type=ALL&lt;br /&gt;
&lt;br /&gt;
Rscript parallel.R&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above batch script requests several resources, and runs an R script&amp;amp;nbsp;&amp;lt;code&amp;gt;parallel.R&amp;lt;/code&amp;gt;. This file&amp;amp;nbsp;&amp;lt;code&amp;gt;parallel.R&amp;lt;/code&amp;gt;&amp;amp;nbsp;is written as follows.&lt;br /&gt;
&amp;lt;pre&amp;gt;# parallel.R&lt;br /&gt;
&lt;br /&gt;
library(parallel)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# An intentionally slow function that we wish to parallelize&lt;br /&gt;
slow_successor &amp;lt;- function(i)&lt;br /&gt;
{&lt;br /&gt;
  Sys.sleep(0.1)&lt;br /&gt;
  return(i + 1)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# We will run `slow_successor` on the numbers 0 through num_iterations-1.&lt;br /&gt;
num_iterations &amp;lt;- 100&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Non-parallel implementation:&lt;br /&gt;
start_time &amp;lt;- Sys.time()&lt;br /&gt;
result &amp;lt;- unlist(lapply(1:num_iterations, slow_successor))&lt;br /&gt;
end_time &amp;lt;- Sys.time()&lt;br /&gt;
&lt;br /&gt;
time_elapsed &amp;lt;- difftime(end_time, start_time, units = &amp;quot;secs&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print(paste(&amp;quot;Non-parallel compute time:&amp;quot;, time_elapsed, &amp;quot;seconds.&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Parallel implementation:&lt;br /&gt;
n_cores &amp;lt;- detectCores()&lt;br /&gt;
&lt;br /&gt;
start_time &amp;lt;- Sys.time()&lt;br /&gt;
result &amp;lt;- unlist(mclapply(0:(num_iterations-1), slow_successor, mc.cores=n_cores))&lt;br /&gt;
end_time &amp;lt;- Sys.time()&lt;br /&gt;
&lt;br /&gt;
time_elapsed &amp;lt;- difftime(end_time, start_time, units = &amp;quot;secs&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print(paste(&amp;quot;Parallel compute time on&amp;quot;, n_cores, &amp;quot;cores:&amp;quot;, time_elapsed, &amp;quot;seconds.&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Running the Python or R script via&amp;amp;nbsp;&amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
We can now run our Python or R script using the resources allocated via&amp;amp;nbsp;&amp;lt;code&amp;gt;jobscript.job&amp;lt;/code&amp;gt;&amp;amp;nbsp;with the&amp;amp;nbsp;&amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;&amp;amp;nbsp;command.&lt;br /&gt;
&amp;lt;pre&amp;gt;sbatch jobscript.job&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Running&amp;amp;nbsp;&amp;lt;code&amp;gt;sbatch&amp;lt;/code&amp;gt;&amp;amp;nbsp;will submit a job with particular job ID (e.g. 1234567). The output from the job will then be written to&amp;amp;nbsp;&amp;lt;code&amp;gt;slurm-&amp;lt;jobid&amp;gt;.out&amp;lt;/code&amp;gt;&amp;amp;nbsp;(e.g.&amp;amp;nbsp;&amp;lt;code&amp;gt;slurm-1234567.out&amp;lt;/code&amp;gt;). The output from&amp;amp;nbsp;&amp;lt;code&amp;gt;jobscript.job&amp;lt;/code&amp;gt;&amp;amp;nbsp;should look something like&lt;br /&gt;
&amp;lt;pre&amp;gt;Non-parallel compute time: 10.018450498580933 seconds.&lt;br /&gt;
Parallel compute time on 96 cores: 0.3378734588623047 seconds&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Skipper</name></author>
	</entry>
</feed>