This commit is contained in:
Gelieza K committed 2023-08-17 14:48:20 +02:00
commit fc5495986a
9 files changed
+23376 -280

No files matched your search

+1
View File
@@ -121,6 +121,7 @@ makedocs(;
"Julia Basics" => "notebooks/julia_basics.md",
"Tasks and channels" => "notebooks/julia_async.md",
"Remote calls and remote channels" => "notebooks/julia_distributed.md",
"MPI" => "notebooks/mpi_tutorial.md",
"Matrix Multiplication"=>"notebooks/matrix_matrix.md",
"Jacobi" => "notebooks/jacobi_method.md",
"Solutions" => "notebooks/solutions.md"
File diff suppressed because it is too large. Load diff

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.9 MiB

File diff suppressed because it is too large. Load diff

After

Width:  |  Height:  |  Size: 110 KiB

+18 -3
View File
@@ -56,13 +56,28 @@
"A new browser window will open. Navigate to the corresponding notebook and open it.\n",
"\n",
"<div class=\"alert alert-block alert-warning\">\n",
"<b>Warning:</b> Make sure that the notebook is using the same Julia version as the one you used to launch `IJulia`. If it is not the same, go to Kernel > Change Kernel and choose the right version.\n",
"<b>Warning:</b> Make sure that the notebook is using the same Julia version as the one you used to launch `IJulia`. If it is not the same, go to Kernel > Change Kernel and choose the right version (see figure below).\n",
"</div>\n",
"\n",
"\n",
"\n"
]
},
{
"attachments": {
"figkernel.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "928ae06c",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:figkernel.png\">\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "bcefe994",
@@ -1609,7 +1624,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.9.1",
"display_name": "Julia 1.9.0",
"language": "julia",
"name": "julia-1.9"
},
@@ -1617,7 +1632,7 @@
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.9.1"
"version": "1.9.0"
}
},
"nbformat": 4,
+2 -2
View File
@@ -1319,7 +1319,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.9.1",
"display_name": "Julia 1.9.0",
"language": "julia",
"name": "julia-1.9"
},
@@ -1327,7 +1327,7 @@
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.9.1"
"version": "1.9.0"
}
},
"nbformat": 4,
+1 -1
View File
@@ -507,7 +507,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.8.5",
"display_name": "Julia 1.8.4",
"language": "julia",
"name": "julia-1.8"
},
+2 -2
View File
@@ -1132,7 +1132,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.9.1",
"display_name": "Julia 1.9.0",
"language": "julia",
"name": "julia-1.9"
},
@@ -1140,7 +1140,7 @@
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.9.1"
"version": "1.9.0"
}
},
"nbformat": 4,
+365 -262
View File
@@ -2,85 +2,260 @@
"cells": [
{
"cell_type": "markdown",
"id": "8d800917",
"id": "7606d30a",
"metadata": {},
"source": [
"# Tutorial: Using MPI in Julia\n",
"Message Passing Interface (MPI) is a standardized and portable library specification for communication between parallel processes in distributed memory systems. Julia offers a convenient way to work with MPI for creating efficient parallel and distributed applications. In this tutorial, you will learn how to use MPI from Julia to perform parallel computing tasks.\n",
"<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021\" width=\"350\">\n",
"\n",
"## MPI launches separate Julia instances\n",
"When you run an MPI-enabled Julia script, MPI takes care of spawning multiple instances of the Julia executable, each acting as a separate process. These workers can communicate with each other using MPI communication functions. This enables parallel processing and distributed computation. Here's a summary of how it works:\n",
"\n",
"-- TODO: insert picture here --\n",
"\n",
"- **MPI Spawns Processes**: The `mpiexec` command launches multiple instances of the Julia executable, creating separate worker processes. In this example, 4 Julia workers are spawned.\n",
"\n",
"- **Worker Communication**: These workers can communicate with each other using MPI communication functions, allowing them to exchange data and coordinate actions.\n",
"\n",
"- **Parallel Tasks**: The workers execute parallel tasks simultaneously, working on different parts of the computation to potentially speed up the process.\n",
"### Programming large-scale parallel systems"
]
},
{
"cell_type": "markdown",
"id": "4ac1e5d9",
"metadata": {},
"source": [
"# Distributed computing with MPI"
]
},
{
"cell_type": "markdown",
"id": "a341be2e",
"metadata": {},
"source": [
"## Contents\n",
"\n",
"\n",
" \n",
"In this notebook, we will learn the basics of parallel computing using the Message Passing Interface (MPI) from Julia. In particular, we will learn:\n",
"\n",
"- How to run parallel MPI code in Julia\n",
"- How to use basic collective communication directives\n",
"- How to use basic point-to-point communication directives\n",
"\n",
"## Installing MPI.jl and MPIClusterManagers Packages\n",
"To use MPI in Julia, you'll need the MPI.jl package, and if you intend to run MPI programs in a Jupyter Notebook, you'll also need the MPIClusterManagers package. These packages provide the necessary bindings to the MPI library and cluster management capabilities. To install the packages, open a terminal and run the following commands:"
"For further information on how to use MPI from Julia see https://github.com/JuliaParallel/MPI.jl\n"
]
},
{
"cell_type": "markdown",
"id": "8862079b",
"metadata": {},
"source": [
"## What is MPI ?\n",
"\n",
"- MPI stands for the \"Message Passing Interface\"\n",
"- It is a standardized library specification for communication between parallel processes in distributed memory systems.\n",
"- It is the gold-standard for distributed computing in HPC systems since the 90s\n",
"- It is huge: the MPI standard has above 1k pages (see https://www.mpi-forum.org/docs/mpi-4.0/mpi40-report.pdf)\n",
"- There are several implementations of this standard (OpenMPI, MPICH, IntelMPI)\n",
"- The interface is in C and FORTRAN (C++ was deprecated)\n",
"- There are Julia bindings via the package MPI.jl https://github.com/JuliaParallel/MPI.jl"
]
},
{
"cell_type": "markdown",
"id": "133327e2",
"metadata": {},
"source": [
"### Hello-world example"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3cb5f151",
"id": "0b44409e",
"metadata": {},
"outputs": [],
"source": [
"using Pkg\n",
"Pkg.add(\"MPI\")\n",
"Pkg.add(\"MPIClusterManagers\")"
"] add MPI"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a154b55e",
"metadata": {},
"outputs": [],
"source": [
"using MPI\n",
"MPI.Init()\n",
"comm = MPI.COMM_WORLD\n",
"nranks = MPI.Comm_size(comm)\n",
"rank = MPI.Comm_rank(comm)\n",
"println(\"Hello, I am process $rank of $nranks processes!\")"
]
},
{
"cell_type": "markdown",
"id": "ed45a4b2",
"id": "e3901c57",
"metadata": {},
"source": [
"<div class=\"alert alert-block alert-info\">\n",
" <b>Tip:</b>\n",
"The package <code>MPI.jl</code> is the Julia interface to MPI. Note that it is not a MPI library by itself. It is just a thin wrapper between MPI and Julia. To use this interface, you need an actual MPI library installed in your system such as OpenMPI or MPICH. Julia downloads and installs a MPI library for you, but it is also possible to use a MPI library already available in your system. This is useful, e.g., when running on HPC clusters. See the documentation of <code>MPI.jl</code> for further details.\n",
"## Running MPI code"
]
},
{
"cell_type": "markdown",
"id": "8376135d",
"metadata": {},
"source": [
"### Creating MPI processes (aka ranks)\n",
"\n",
"- MPI processes are created with the driver program `mpiexec`\n",
"- `mpiexec` takes an application and runs it on different ranks\n",
"- The application calls MPI directives to communicate between these ranks\n",
"- The application can be Julia running your script in particular.\n"
]
},
{
"attachments": {
"fig23.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "a458c714",
"metadata": {},
"source": [
" <div>\n",
"<img src=\"attachment:fig23.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"id": "7a36916e",
"id": "044aaeec",
"metadata": {},
"source": [
"## Writing a HelloWorld MPI Program in Julia\n",
"Let's start by creating a simple MPI program that prints a message along with the rank of each worker. \n",
"### Execution model\n",
"\n",
"Create a new Julia script, for example, `mpi_hello_world.jl`:\n",
"- MPI programs are typically run with a Single Program Multiple Data (SPMD) model\n",
"- But the standard supports Multiple Program Multiple Data (MPMD)"
]
},
{
"cell_type": "markdown",
"id": "5f76fb65",
"metadata": {},
"source": [
"### Hello world\n",
"\n",
"```julia\n",
"Julia code typically needs to be in a file to run in with MPI. Let's us write our hello world in a file:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e03f35c5",
"metadata": {},
"outputs": [],
"source": [
"code = raw\"\"\"\n",
"using MPI\n",
"\n",
"# Initialize MPI\n",
"MPI.Init()\n",
"\n",
"# Get the default communicator (MPI_COMM_WORLD) for all processes\n",
"comm = MPI.COMM_WORLD\n",
"\n",
"# Get the number of processes in this communicator\n",
"nranks = MPI.Comm_size(comm)\n",
"\n",
"# Get the rank of the current process within the communicator\n",
"rank = MPI.Comm_rank(comm)\n",
"\n",
"# Print a message with the rank of the current process\n",
"println(\"Hello, I am process $rank of $nranks processes!\")\n",
"\"\"\"\n",
"filename = tempname()*\".jl\"\n",
"write(filename,code);"
]
},
{
"cell_type": "markdown",
"id": "f13946dd",
"metadata": {},
"source": [
"Now, we can run it"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dbe654dc",
"metadata": {},
"outputs": [],
"source": [
"using MPI\n",
"mpiexec(cmd->run(`$cmd -np 4 julia --project=. $filename`));"
]
},
{
"cell_type": "markdown",
"id": "651f26ae",
"metadata": {},
"source": [
"Note that function mpiexec provided by MPI.jl is a convenient way of accessing the mpiexec program that matches the MPI installation used my Julia."
]
},
{
"cell_type": "markdown",
"id": "8665c3ca",
"metadata": {},
"source": [
"### MPIClusterManagers \n",
"\n",
"# Finalize MPI\n",
"MPI.Finalize()\n",
"```"
"- This package allows you to create Julia workers that can call MPI functions\n",
"- This is useful to combine Distributed.jl and MPI.jl\n",
"- E.g., we can run MPI code interactively (from a notebook)\n",
"- Link: https://github.com/JuliaParallel/MPIClusterManagers.jl\n"
]
},
{
"attachments": {
"g1340.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "355155d8",
"metadata": {},
"source": [
" <div>\n",
"<img src=\"attachment:g1340.png\" align=\"left\" width=\"450\"/>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "28c68c9c",
"metadata": {},
"outputs": [],
"source": [
"] add MPIClusterManagers"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "84adeab3",
"metadata": {},
"outputs": [],
"source": [
"using MPIClusterManagers\n",
"using Distributed\n",
"if procs() == workers()\n",
" nranks = 3\n",
" manager = MPIWorkerManager(nranks)\n",
" addprocs(manager)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "612a7587",
"metadata": {},
"outputs": [],
"source": [
"@everywhere workers() begin\n",
" using MPI\n",
" MPI.Init()\n",
" comm = MPI.COMM_WORLD\n",
" nranks = MPI.Comm_size(comm)\n",
" rank = MPI.Comm_rank(comm)\n",
" println(\"Hello, I am process $rank of $nranks processes!\")\n",
"end"
]
},
{
@@ -88,290 +263,218 @@
"id": "6caa8d74",
"metadata": {},
"source": [
"### MPI Communicators\n",
"In MPI, a **communicator** is a context in which a group of processes can communicate with each other. `MPI_COMM_WORLD` is one of the MPI standard communicators, it represents all processes in the MPI program. Custom communicators can also be created to group processes based on specific requirements or logical divisions. \n",
"## MPI Communicators\n",
"\n",
"The **rank** of a processor is a unique identifier assigned to each process within a communicator. It allows processes to distinguish and address each other in communication operations. "
"In MPI, a **communicator** represents a group of processes that can communicate with each other. `MPI_COMM_WORLD` (`MPI.COMM_WORLD` from Julia) is a built-in communicator that represents all processes available in the MPI program. Custom communicators can also be created to group processes based on specific requirements or logical divisions. The **rank** of a processor is a unique identifier assigned to each process within a communicator. It allows processes to distinguish and address each other in communication operations.\n",
"\n",
"### Duplicating a communicator\n",
"\n",
"It is a good practice to not using the built-in communicators directly, and use a copy instead with `MPI.Comm_dup`. Different libraries using the same communicator can lead to unexpected interferences."
]
},
{
"cell_type": "markdown",
"id": "19f41e38",
"id": "c87b3c82",
"metadata": {},
"source": [
"## Running the HelloWorld MPI Program\n",
"## Collective communication\n",
"\n",
"To run MPI applications in parallel, you need a launcher like `mpiexec`. MPI codes written in Julia are not an exception to this rule. From the system terminal, you can run\n",
"```\n",
"$ mpiexec -np 4 mpi_hello_world.jl\n",
"```\n",
"In this command, `-np 4` specifies the desired number of processes. \n",
"But it will probably not work since the version of `mpiexec` needs to match with the MPI version we are using from Julia. You can find the path to the `mpiexec` binary you need to use with these commands\n",
"MPI provides collective communication functions for communication involving multiple processes. Some usual collective directives are:\n",
"\n",
"```julia\n",
"julia> using MPI\n",
"julia> MPI.mpiexec_path\n",
"```\n",
"- `MPI.Scatter`: Distributes data from one process to all processes.\n",
"- `MPI.Gather`: Gathers data from all processes to a single process.\n",
"- `MPI.Bcast`: Broadcasts data from one process to all processes.\n",
"- `MPI.Barrier`: Synchronizes all processes.\n",
"\n",
"and then try again\n",
"```\n",
"$ /path/to/my/mpiexec -np 4 julia mpi_hello_world.jl\n",
"```\n",
"with your particular path.\n",
"\n",
"However, this is not very convenient. Don't worry if you could not make it work! A more elegant way to run MPI code is from the Julia REPL directly, by using these commands:\n",
"```julia\n",
"julia> using MPI\n",
"julia> mpiexec(cmd->run(`$cmd -np 4 julia mpi_hello_world.jl`))\n",
"```\n",
"\n",
"Now, you should see output from 4 ranks.\n"
"See more collective directives available from Julia here: https://juliaparallel.org/MPI.jl/stable/reference/collective/\n"
]
},
{
"cell_type": "markdown",
"id": "0592e58c",
"id": "8b4254d1",
"metadata": {},
"source": [
"## Running MPI Programs in Jupyter Notebook with MPIClusterManagers\n",
"If you want to run your MPI code from a Jupyter Notebook, you can do so using the `MPIClusterManagers` package.\n",
"### Scatter\n",
"\n",
"1. Load the packages and start an MPI cluster with the desired number of workers:"
"TODO explain what this code does"
]
},
{
"attachments": {
"g13389.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "74d5b606",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g13389.png\" align=\"left\" width=\"350\"/>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cf66dd39",
"id": "5ea413fd",
"metadata": {},
"outputs": [],
"source": [
"using MPIClusterManagers\n",
"# Distributed package is needed for addprocs()\n",
"using Distributed\n",
"\n",
"manager = MPIWorkerManager(4)\n",
"addprocs(manager)"
]
},
{
"cell_type": "markdown",
"id": "d40fe3ee",
"metadata": {},
"source": [
"2. Run your MPI code inside a `@mpi_do` block to execute it on the cluster workers:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0a51d1f2",
"metadata": {},
"outputs": [],
"source": [
"@mpi_do manager begin\n",
" using MPI\n",
" comm = MPI.COMM_WORLD\n",
"@everywhere workers() begin\n",
" comm = MPI.Comm_dup(MPI.COMM_WORLD)\n",
" nranks = MPI.Comm_size(comm)\n",
" rank = MPI.Comm_rank(comm)\n",
" println(\"Hello from process $rank\")\n",
"end\n"
" root = 0\n",
" rcv = Ref(0) \n",
" if rank == root\n",
" snd = [10*(i+1) for i in 1:nranks]\n",
" println(\"I am sending: $snd\")\n",
" else\n",
" snd = nothing\n",
" end \n",
" MPI.Scatter!(snd,rcv,comm;root)\n",
" println(\"I have received: $(rcv[])\")\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "38ed88c1",
"id": "97dc2886",
"metadata": {},
"source": [
"MPI is automatically initialized and finalized within the `@mpi_do` block.\n",
"### Gather\n",
"\n",
"3. Remove processes when done:"
"TODO explain what this code does"
]
},
{
"attachments": {
"g13884.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "4bdf9c02",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g13884.png\" align=\"left\" width=\"350\"/>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0b53cc1",
"id": "1f8a70c6",
"metadata": {},
"outputs": [],
"source": [
"rmprocs(manager)"
"@everywhere workers() begin\n",
" comm = MPI.Comm_dup(MPI.COMM_WORLD)\n",
" nranks = MPI.Comm_size(comm)\n",
" rank = MPI.Comm_rank(comm)\n",
" root = 0\n",
" snd = 10*(rank+2)\n",
" println(\"I am sending $snd\")\n",
" rcv = MPI.Gather(snd,comm;root)\n",
" if rank == root\n",
" println(\"I have received: $rcv\")\n",
" end\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "5466a650",
"id": "ac9a5b52",
"metadata": {},
"source": [
"## Point-to-Point Communication with MPI\n",
"MPI provides point-to-point communication using blocking send and receiving functions `MPI.send`, `MPI.recv`; or their non-blocking versions `MPI.Isend`, and `MPI.Irecv!`. These functions allow individual processes to send and receive data between each other.\n",
"## Point-to-Point communication\n",
"\n",
"### Blocking communication\n",
"\n",
"Let's demonstrate how to send and receive with an example:\n",
"MPI also provides point-to-point communication directives for arbitrary communication between processes. Point-to-point communications are two-sided: there is a sender and a receiver. Here, we will discuss these basic directives:\n",
"\n",
"```julia\n",
"using MPI\n",
"- `MPI.Isend`, and `MPI.Irecv!`\n",
"\n",
"MPI.Init()\n",
"which are *non-blocking directives*.\n",
"\n",
"comm = MPI.COMM_WORLD\n",
"rank = MPI.Comm_rank(comm)\n",
"\n",
"# Send and receive messages using blocking MPI.send and MPI.recv\n",
"if rank == 0\n",
" data = \"Hello from process $rank !\"\n",
" MPI.send(data, comm, dest=1)\n",
"elseif rank == 1\n",
" received_data = MPI.recv(comm, source=0)\n",
" println(\"Process $rank received: $received_data\")\n",
"end\n",
"\n",
"MPI.Finalize()\n",
"```"
"MPI also offers *blocking* directives with different blocking behaviors (communication modes). Blocking communication will be discussed later in the course.\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "d4dfe654",
"id": "750fdacb",
"metadata": {},
"source": [
"In this example, process 0 sends a message using `MPI.send`, and process 1 receives it using `MPI.recv`.\n",
"### Example\n",
"\n",
"### Non-blocking communication\n",
"\n",
"To demonstrate asynchronous communication, let's modify the example using `MPI.Isend` and `MPI.Irecv!`:\n",
"\n",
"```julia\n",
"using MPI\n",
"\n",
"MPI.Init()\n",
"\n",
"comm = MPI.COMM_WORLD\n",
"rank = MPI.Comm_rank(comm)\n",
"\n",
"# Asynchronous communication using MPI.Isend and MPI.Irecv!\n",
"if rank == 0\n",
" data = \"Hello from process $rank !\"\n",
" request = MPI.Isend(data, comm, dest=1)\n",
" # Other computation can happen here\n",
" MPI.Wait(request)\n",
"elseif rank == 1\n",
" received_data = Array{UInt8}(undef, 50) # Preallocate buffer\n",
" request = MPI.Irecv!(received_data, comm, source=0)\n",
" # Other computation can happen here\n",
" MPI.Wait(request)\n",
" println(\"Process $rank received: $(String(received_data))\")\n",
"end\n",
"\n",
"MPI.Finalize()\n",
"```"
"The first rank generates a message and sends it to the last rank. The last rank receives the message and multiplies it by a coefficient. The last rank sends the result back to the first rank."
]
},
{
"attachments": {
"g5369.png": {
"image/png": "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 truncated
}
},
"cell_type": "markdown",
"id": "b479bbd4",
"metadata": {},
"source": [
"<div>\n",
"<img src=\"attachment:g5369.png\" align=\"left\" width=\"350\"/>\n",
"</div>\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dccc3f6a",
"metadata": {},
"outputs": [],
"source": [
"@everywhere workers() begin\n",
" comm = MPI.Comm_dup(MPI.COMM_WORLD)\n",
" rank = MPI.Comm_rank(comm)\n",
" nranks = MPI.Comm_size(comm)\n",
" snder = 0\n",
" rcver = nranks-1\n",
" buffer = Ref(0)\n",
" if rank == snder\n",
" msg = 10*(rank+2)\n",
" println(\"I am sending: $msg\")\n",
" buffer[] = msg\n",
" req = MPI.Isend(buffer,comm;dest=rcver,tag=0)\n",
" MPI.Wait(req)\n",
" req = MPI.Irecv!(buffer,comm,source=rcver,tag=0)\n",
" MPI.Wait(req)\n",
" msg = buffer[]\n",
" println(\"I have received: $msg\")\n",
" end\n",
" if rank == rcver\n",
" req = MPI.Irecv!(buffer,comm,source=snder,tag=0)\n",
" MPI.Wait(req)\n",
" msg = buffer[]\n",
" println(\"I have received: $msg\")\n",
" coef = (rank+2)\n",
" msg = msg*coef\n",
" println(\"I am sending: $msg\")\n",
" buffer[] = msg\n",
" req = MPI.Isend(buffer,comm;dest=snder,tag=0)\n",
" MPI.Wait(req)\n",
" end\n",
"end"
]
},
{
"cell_type": "markdown",
"id": "024db538",
"id": "162682c1",
"metadata": {},
"source": [
"In this example, process 0 uses `MPI.Isend` to send the message asynchronously. This function returns immediately, allowing the sender process to continue its execution. However, the actual sending of data is done asynchronously in the background. Similar to `MPI.Isend`, `MPI.Irecv!` returns immediately, allowing the receiver process to continue executing. \n",
"\n",
"<div class=\"alert alert-block alert-warning\">\n",
"<b>Important:</b> In asynchronous communication, always use <code>MPI.Wait()</code> to ensure the communication is finished before accessing the send or receive buffer.\n",
"</div>\n",
"\n",
"\n",
"## Collective Communication with MPI\n",
"MPI provides collective communication functions for communication involving multiple processes. Let's explore some of these functions:\n",
"\n",
"- MPI.Gather: Gathers data from all processes to a single process.\n",
"- MPI.Scatter: Distributes data from one process to all processes.\n",
"- MPI.Bcast: Broadcasts data from one process to all processes.\n",
"- MPI.Barrier: Synchronizes all processes.\n",
"\n",
"\n",
"Let's illustrate the use of `MPI.Gather` and `MPI.Scatter` with an example:\n",
"\n",
"```julia\n",
"# TODO: check if this runs correctly\n",
"using MPI\n",
"using Random\n",
"\n",
"MPI.Init()\n",
"\n",
"comm = MPI.COMM_WORLD\n",
"rank = MPI.Comm_rank(comm)\n",
"size = MPI.Comm_size(comm)\n",
"\n",
"# Root processor generates random data\n",
"data = rand(rank == 0 ? size * 2 : 0)\n",
"\n",
"# Scatter data to all processes\n",
"local_data = Vector{Float64}(undef, 2)\n",
"MPI.Scatter!(data, local_data, comm, root=0)\n",
"\n",
"# Compute local average\n",
"local_average = sum(local_data) / length(local_data)\n",
"\n",
"# Gather local averages at the root processor\n",
"gathered_averages = Vector{Float64}(undef, size)\n",
"MPI.Gather!(local_average, gathered_averages, comm, root=0)\n",
"\n",
"if rank == 0\n",
" # Compute global average of sub-averages\n",
" global_average = sum(gathered_averages) / size\n",
" println(\"Global average: $global_average\")\n",
"end\n",
"\n",
"MPI.Finalize()\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e65cb53f",
"metadata": {},
"outputs": [],
"source": [
"using MPI\n",
"using Random\n",
"\n",
"# TODO: check if this runs correctly\n",
"\n",
"MPI.Init()\n",
"\n",
"comm = MPI.COMM_WORLD\n",
"rank = MPI.Comm_rank(comm)\n",
"size = MPI.Comm_size(comm)\n",
"\n",
"# Root processor generates random data\n",
"data = rand(rank == 0 ? size * 2 : 0)\n",
"\n",
"# Scatter data to all processes\n",
"local_data = Vector{Float64}(undef, 2)\n",
"MPI.Scatter!(data, local_data, comm, root=0)\n",
"\n",
"# Compute local average\n",
"local_average = sum(local_data) / length(local_data)\n",
"\n",
"# Gather local averages at the root processor\n",
"gathered_averages = Vector{Float64}(undef, size)\n",
"MPI.Gather!(local_average, gathered_averages, comm, root=0)\n",
"\n",
"if rank == 0\n",
" # Compute global average of sub-averages\n",
" global_average = sum(gathered_averages) / size\n",
" println(\"Global average: $global_average\")\n",
"end\n",
"\n",
"MPI.Finalize()"
]
},
{
"cell_type": "markdown",
"id": "dfd5da9e",
"metadata": {},
"source": [
"In this example, the root processor generates random data and then scatters it to all processes using MPI.Scatter. Each process calculates the average of its local data, and then the local averages are gathered using MPI.Gather. The root processor computes the global average of all sub-averages and prints it."
"<b>Important:</b> In non-blocking communication, use <code>MPI.Wait()</code> before modifying the send buffer or using the receive buffer.\n",
"</div>"
]
},
{
@@ -397,7 +500,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.9.1",
"display_name": "Julia 1.9.0",
"language": "julia",
"name": "julia-1.9"
},
@@ -405,7 +508,7 @@
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.9.1"
"version": "1.9.0"
}
},
"nbformat": 4,
+2 -2
View File
@@ -314,7 +314,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.9.1",
"display_name": "Julia 1.9.0",
"language": "julia",
"name": "julia-1.9"
},
@@ -322,7 +322,7 @@
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.9.1"
"version": "1.9.0"
}
},
"nbformat": 4,