{"id":3079,"date":"2024-04-03T20:05:57","date_gmt":"2024-04-03T15:05:57","guid":{"rendered":"https:\/\/afzalbadshah.com\/?p=3079"},"modified":"2024-05-08T22:21:14","modified_gmt":"2024-05-08T17:21:14","slug":"mpi-with-python-calculating-squares-of-array-elements-using-multiple-processors","status":"publish","type":"post","link":"https:\/\/afzalbadshah.com\/index.php\/2024\/04\/03\/mpi-with-python-calculating-squares-of-array-elements-using-multiple-processors\/","title":{"rendered":"MPI with Python: Calculating Squares of Array Elements Using Multiple Processors"},"content":{"rendered":"\n<p>In this lab tutorial, we will explore how to utilize multiple processors to compute the squares of elements in an array concurrently using the MPI (Message Passing Interface) library in Python, specifically using the mpi4py module. MPI is a widely-used standard for parallel computing in distributed memory systems. We&#8217;ll create a master-worker model where the master process distributes tasks to worker processes, each responsible for computing the square of a subset of the array elements. <a href=\"https:\/\/afzalbadshah.com\/index.php\/category\/courses\/mpi-with-python\/\" target=\"_blank\" rel=\"noopener\" title=\"\">The detailed tutorial of MPI with a python can be visited here.<\/a> <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>from mpi4py import MPI\n\ncomm = MPI.COMM_WORLD  # Initialize MPI communicator\nrank = comm.Get_rank()  # Get the rank of the current process (0 for master, 1+ for workers)\nsize = comm.Get_size()  # Get the total number of processes\n\n# Define a simple task for each process (replace with your actual workload)\ndef calculate_square(number):\n    return number * number\n\nif rank == 0:  # Master process\n    data = &#91;2, 4]  # Sample data (modify with your data)\n    for i in range(1, size):  # Send data to worker processes (skip rank 0 - master)\n        comm.send(data&#91;i - 1], dest=i)\n\n    # Receive results from workers\n    results = &#91;]\n    for i in range(1, size):\n        result = comm.recv(source=i)\n        results.append(result)\n\n    print(\"Master received results:\", results)\nelse:  # Worker processes (rank 1+)\n    data = comm.recv(source=0)  # Receive data from master\n    result = calculate_square(data)\n    comm.send(result, dest=0)  # Send result back to master\n\nMPI.Finalize()  # Finalize MPI environment\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Parallel Computing with MPI4py || Calculating the Square\" width=\"640\" height=\"480\" src=\"https:\/\/www.youtube.com\/embed\/TaH3mvzLZNY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Code Explanation<\/h3>\n\n\n\n<p>Let&#8217;s go through each line of the provided code and understand its functionality:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from mpi4py import MPI<\/code><\/pre>\n\n\n\n<p>This line imports the necessary MPI functionality from the mpi4py library.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>comm = MPI.COMM_WORLD  # Initialize MPI communicator<\/code><\/pre>\n\n\n\n<p>Here, we initialize the MPI communicator <code>comm<\/code>, which will be used for communication between different processes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rank = comm.Get_rank()  # Get the rank of the current process (0 for master, 1+ for workers)<\/code><\/pre>\n\n\n\n<p>This line retrieves the rank of the current process within the communicator. The rank identifies each process uniquely, with rank 0 typically representing the master process.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>size = comm.Get_size()  # Get the total number of processes<\/code><\/pre>\n\n\n\n<p>This line obtains the total number of processes within the communicator.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def calculate_square(number):\n    return number * number<\/code><\/pre>\n\n\n\n<p>This function <code>calculate_square()<\/code> takes a number as input and returns its square. This is the task that each worker process will perform. I&#8217;ve two core system, therefore taking two values. You should know the number of processors to pass the same values (In Windows you can find the numbers of cores by &#8220;wmic cpu get NumberOfCores&#8221;).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if rank == 0:  # Master process\n    data = &#91;2, 4]  # Sample data (modify with your data)\n    for i in range(1, size):  # Send data to worker processes (skip rank 0 - master)\n        comm.send(data&#91;i - 1], dest=i)<\/code><\/pre>\n\n\n\n<p>In the master process (rank 0), we define the sample data <code>[2, 4]<\/code>. Then, we iterate over all worker processes (ranks 1 to <code>size-1<\/code>) and send each element of the data array to the corresponding worker process.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    results = &#91;]\n    for i in range(1, size):\n        result = comm.recv(source=i)\n        results.append(result)\n\n    print(\"Master received results:\", results)<\/code><\/pre>\n\n\n\n<p>After sending data to the worker processes, the master process waits to receive results from each worker process. It iterates over all worker processes, receives their results, and appends them to a list called <code>results<\/code>. Finally, it prints the received results.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>else:  # Worker processes (rank 1+)\n    data = comm.recv(source=0)  # Receive data from master\n    result = calculate_square(data)\n    comm.send(result, dest=0)  # Send result back to master<\/code><\/pre>\n\n\n\n<p>In worker processes (ranks 1+), each process receives data from the master process, computes the square using the <code>calculate_square()<\/code> function, and sends the result back to the master process.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MPI.Finalize()  # Finalize MPI environment<\/code><\/pre>\n\n\n\n<p>This line finalizes the MPI environment, releasing all resources associated with it.<\/p>\n\n\n\n<p>In this tutorial, we&#8217;ve learned how to use the mpi4py library to distribute computation tasks across multiple processes in Python. Specifically, we&#8217;ve implemented a master-worker model to calculate the squares of array elements concurrently using multiple processors. This approach can significantly speed up computation for large datasets and computationally intensive tasks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Material<\/h2>\n\n\n\n<p><a href=\"https:\/\/drive.google.com\/drive\/folders\/1vKaZIsBGLhzew2DKmmYfMCSrPAo4jXe-?usp=sharing\" target=\"_blank\" rel=\"noopener\" title=\"\">Download the programs (code), covering the MPI4Py.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this lab tutorial, we will explore how to utilize multiple processors to compute the squares of elements in an array concurrently using the MPI (Message Passing Interface) library in Python, specifically using the mpi4py module. MPI is a widely-used standard for parallel computing in distributed memory systems. We&#8217;ll create a master-worker model where the master process distributes tasks to worker processes, each responsible for computing the square of a subset of the array elements. The detailed tutorial of MPI&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/afzalbadshah.com\/index.php\/2024\/04\/03\/mpi-with-python-calculating-squares-of-array-elements-using-multiple-processors\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3084,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[506],"tags":[564,540,543,502],"class_list":["post-3079","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mpi-with-python","tag-jupyter","tag-mpi","tag-mpi4py","tag-python"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/afzalbadshah.com\/wp-content\/uploads\/2024\/04\/MPI-Python-jpg.webp?fit=1280%2C720&ssl=1","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pf3emP-NF","jetpack-related-posts":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/posts\/3079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/comments?post=3079"}],"version-history":[{"count":7,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/posts\/3079\/revisions"}],"predecessor-version":[{"id":3204,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/posts\/3079\/revisions\/3204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/media\/3084"}],"wp:attachment":[{"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/media?parent=3079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/categories?post=3079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afzalbadshah.com\/index.php\/wp-json\/wp\/v2\/tags?post=3079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}