From f6bbaf436649b107b7f9976bf5dbb0b45886f7eb Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Thu, 19 Feb 2015 08:00:45 -0500 Subject: [PATCH 001/108] disclaimer about amazon affiliate links --- recommended-books.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/recommended-books.md b/recommended-books.md index 7bb6542..4f89a04 100644 --- a/recommended-books.md +++ b/recommended-books.md @@ -5,6 +5,8 @@ title: Recommended Books Here are the books that helped me out the most when learning MPI. Most of these are written by the primary designers of the Message Passing Interface. Some also include tutorials on how to use OpenMP with MPI. The very first book is a compilation of the beginner tutorials of this site as well and helps support mpitutorial.com. +> **Disclaimer** - The links on this page are Amazon affiliate links. If you click on the links and purchase books, the primary author (Wes Kendall) receives commission. + ## Beginning MPI (An Introduction in C) This book is a compilation of all of the beginner tutorials on this site. It goes over everything from installing MPI on an Amazon EC2 cluster to the basics of sending and receiving with MPI to performing collective operations and reductions. If you have enjoyed the tutorials on this site and wish to have a copy of it in book format (while also supporting mpitutorial.com), then [click here for more info](http://www.amazon.com/gp/product/B00HM7O0M8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B00HM7O0M8&linkCode=as2&tag=softengiintet-20). From b110804dfc045686d07eb1490412b8ef7a1df27a Mon Sep 17 00:00:00 2001 From: Marcelo Sardelich Date: Sun, 8 Mar 2015 15:32:31 +0000 Subject: [PATCH 002/108] "amont" typo fix --- .../code/check_status.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c index b051601..9d868f2 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c @@ -27,7 +27,7 @@ int main(int argc, char** argv) { int numbers[MAX_NUMBERS]; int number_amount; if (world_rank == 0) { - // Pick a random amont of integers to send to process one + // Pick a random amount of integers to send to process one srand(time(NULL)); number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS; // Send the amount of integers to process one From 0cb717d67896d1d091e049d882cffe545ff2728c Mon Sep 17 00:00:00 2001 From: Gabriel Date: Sat, 18 Apr 2015 23:14:28 -0500 Subject: [PATCH 003/108] Update index.md just an 'h' --- tutorials/mpi-send-and-receive/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-send-and-receive/index.md b/tutorials/mpi-send-and-receive/index.md index b8d5b68..e436411 100644 --- a/tutorials/mpi-send-and-receive/index.md +++ b/tutorials/mpi-send-and-receive/index.md @@ -9,7 +9,7 @@ redirect_from: '/mpi-send-and-receive/' Sending and receiving are the two foundational concepts of MPI. Almost every single function in MPI can be implemented with basic send and receive calls. In this lesson, I will discuss how to use MPI's blocking sending and receiving functions, and I will also overview other basic concepts associated with transmitting data using MPI. -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). +> **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). ## Overview of sending and receiving with MPI MPI's send and receive calls operate in the following manner. First, process *A* decides a message needs to be sent to process *B*. Process A then packs up all of its necessary data into a buffer for process B. These buffers are often referred to as *envelopes* since the data is being packed into a single message before transmission (similar to how letters are packed into envelopes before transmission to the post office). After the data is packed into a buffer, the communication device (which is often a network) is responsible for routing the message to the proper location. The location of the message is defined by the process's rank. @@ -199,4 +199,4 @@ As we can see, process zero first sends a value of negative one to process one. Now that you have a basic understanding of `MPI_Send` and `MPI_Recv`, it is now time to go a little bit deeper into these functions. In the next lesson, I cover [how to probe and dynamically receive messages]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/). Feel free to also examine the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) for a complete reference of all of the beginning MPI lessons. -Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. \ No newline at end of file +Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. From 62be7ff7322b014458c1effc6658c6e1ad832a91 Mon Sep 17 00:00:00 2001 From: spicydonkey Date: Tue, 9 Jun 2015 20:29:03 +1200 Subject: [PATCH 004/108] Fix uniform RNG seeding seeding RNG with world_rank creates a problem since 0 and 1 produce equivalent behaviour --- tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c b/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c index 0b84599..11c04a8 100644 --- a/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c +++ b/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c @@ -30,8 +30,6 @@ int main(int argc, char** argv) { } int num_elements_per_proc = atoi(argv[1]); - // Seed the random number generator to get different results each time - srand(time(NULL)); MPI_Init(NULL, NULL); @@ -41,7 +39,7 @@ int main(int argc, char** argv) { MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Create a random array of elements on all processes. - srand(world_rank); + srand(time(NULL)*world_rank); // Seed the random number generator to get different results each time for each processor float *rand_nums = NULL; rand_nums = create_rand_nums(num_elements_per_proc); From bd314c3b8ae8a3862a47a9efa218ec869e6a9287 Mon Sep 17 00:00:00 2001 From: spicydonkey Date: Tue, 9 Jun 2015 20:44:23 +1200 Subject: [PATCH 005/108] Fix uniform RNG seeding --- tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c b/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c index c360167..54bb6cc 100644 --- a/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c +++ b/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c @@ -31,8 +31,6 @@ int main(int argc, char** argv) { } int num_elements_per_proc = atoi(argv[1]); - // Seed the random number generator to get different results each time - srand(time(NULL)); MPI_Init(NULL, NULL); @@ -42,7 +40,7 @@ int main(int argc, char** argv) { MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Create a random array of elements on all processes. - srand(world_rank); + srand(time(NULL)*world_rank); // Seed the random number generator of processes uniquely float *rand_nums = NULL; rand_nums = create_rand_nums(num_elements_per_proc); From 19325d0252931f3cb819f0aeb203d97190011fa8 Mon Sep 17 00:00:00 2001 From: Basheer Subei Date: Fri, 19 Jun 2015 00:37:31 -0500 Subject: [PATCH 006/108] adds instructions for mpich2 plugin for starcluster Without the mpich2 plugin for Starcluster, running mpirun on the EC2 instance results in only a single process running separately on each node (world_size ends up being 1 for all nodes). See [here](http://stackoverflow.com/questions/24246733/mpi-on-an-aws-cluster/24308435) for a detailed error. --- tutorials/launching-an-amazon-ec2-mpi-cluster/index.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index 512e1c6..f37ad43 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -113,6 +113,9 @@ To determine the cost of running your cluster, multiply the number of nodes by t > **Note** - Although t1.micro instances are the cheapest, they hang indefinitely for me when starting a cluster with StarCluster. +### Enable mpich2 plugin for Starcluster +Lastly, before launching Starcluster, enable the `mpich2` plugin for Starcluster by following [these steps](http://star.mit.edu/cluster/docs/0.93.3/plugins/mpich2.html). + ## Starting, accessing, and stopping your cluster After your StarCluster is configured, type the following to start a cluster called "mpicluster." The default config uses "smallcluster" as the default cluster type: @@ -157,4 +160,4 @@ starcluster terminate mpicluster The difference between a "stopped" and "terminated" cluster is that stopped clusters still reside as images on Amazon's Elastic Block Store (EBS). If you will not be starting your cluster again in the foreseeable future, it is recommended to go ahead and terminate the cluster since Amazon EBS payment rates apply to stored instances. As always, educate yourself on [Amazon EC2 Pricing](http://aws.amazon.com/ec2/pricing/) before getting started. ## Ready to run MPI programs on your cluster? -Now that you have your very own cluster, it's time to start running MPI programs. To get started, check out how to compile and run an [MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/). For all beginner lessons, check out the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). If you had any trouble with the lesson, please leave your comment below so that we can try to figure out what went wrong. Happy coding! \ No newline at end of file +Now that you have your very own cluster, it's time to start running MPI programs. To get started, check out how to compile and run an [MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/). For all beginner lessons, check out the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). If you had any trouble with the lesson, please leave your comment below so that we can try to figure out what went wrong. Happy coding! From 481969cc5a2db3cec034d39e41ed6ce4d0b7c505 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Fri, 3 Jul 2015 17:43:36 -0500 Subject: [PATCH 007/108] Rename MPI_Rank function to TMPI_Rank The MPI Standard forbids users from creating their own MPI_* functions to prevent confusion with functions in the standard itself. This commit renames the MPI_Rank example to use the TMPI_ prefix to avoid confusion. --- .../code/makefile | 8 ++--- .../code/random_rank.c | 7 ++-- .../code/{mpi_rank.c => tmpi_rank.c} | 6 ++-- .../code/{mpi_rank.h => tmpi_rank.h} | 4 +-- .../index.md | 32 +++++++++---------- 5 files changed, 29 insertions(+), 28 deletions(-) rename tutorials/performing-parallel-rank-with-mpi/code/{mpi_rank.c => tmpi_rank.c} (95%) rename tutorials/performing-parallel-rank-with-mpi/code/{mpi_rank.h => tmpi_rank.h} (75%) diff --git a/tutorials/performing-parallel-rank-with-mpi/code/makefile b/tutorials/performing-parallel-rank-with-mpi/code/makefile index d5aee62..51d4237 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/makefile +++ b/tutorials/performing-parallel-rank-with-mpi/code/makefile @@ -3,11 +3,11 @@ MPICC?=mpicc all: ${EXECS} -mpi_rank.o: mpi_rank.c - ${MPICC} -c mpi_rank.c +tmpi_rank.o: tmpi_rank.c + ${MPICC} -c tmpi_rank.c -random_rank: mpi_rank.o random_rank.c - ${MPICC} -o random_rank random_rank.c mpi_rank.o +random_rank: tmpi_rank.o random_rank.c + ${MPICC} -o random_rank random_rank.c tmpi_rank.o clean: rm -f ${EXECS} *.o diff --git a/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c b/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c index 526b849..72d4105 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c +++ b/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c @@ -4,12 +4,13 @@ // free to modify it for your own use. Any distribution of the code must // either provide a link to www.mpitutorial.com or keep this header in tact. // -// Runs the MPI_Rank function with random input. +// Runs the TMPI_Rank function with random input. // #include #include #include -#include "mpi_rank.h" +#include "tmpi_rank.h" +#include int main(int argc, char** argv) { MPI_Init(NULL, NULL); @@ -24,7 +25,7 @@ int main(int argc, char** argv) { float rand_num = rand() / (float)RAND_MAX; int rank; - MPI_Rank(&rand_num, &rank, MPI_FLOAT, MPI_COMM_WORLD); + TMPI_Rank(&rand_num, &rank, MPI_FLOAT, MPI_COMM_WORLD); printf("Rank for %f on process %d - %d\n", rand_num, world_rank, rank); MPI_Barrier(MPI_COMM_WORLD); diff --git a/tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.c b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c similarity index 95% rename from tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.c rename to tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c index c9b5be5..6dd61aa 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.c +++ b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c @@ -21,7 +21,7 @@ typedef struct { } number; } CommRankNumber; -// Gathers numbers for MPI_Rank to process zero. Allocates enough space given the MPI datatype and +// Gathers numbers for TMPI_Rank to process zero. Allocates enough space given the MPI datatype and // returns a void * buffer to process 0. It returns NULL to all other processes. void *gather_numbers_to_root(void *number, MPI_Datatype datatype, MPI_Comm comm) { int comm_rank, comm_size; @@ -105,8 +105,8 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, MPI_Datatype d } // Gets the rank of the recv_data, which is of type datatype. The rank is returned -// in send_data and is of type datatype. -int MPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { +// in send_data and is of type datatype. +int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { // Check base cases first - Only support MPI_INT and MPI_FLOAT for this function. if (datatype != MPI_INT && datatype != MPI_FLOAT) { return MPI_ERR_TYPE; diff --git a/tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.h b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h similarity index 75% rename from tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.h rename to tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h index abe5880..ce21670 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.h +++ b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h @@ -4,11 +4,11 @@ // free to modify it for your own use. Any distribution of the code must // either provide a link to www.mpitutorial.com or keep this header in tact. // -// Header file for MPI_Rank +// Header file for TMPI_Rank // #ifndef __PARALLEL_RANK_H #define __PARALLEL_RANK_H 1 -int MPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm); +int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm); #endif diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index 264ece1..60a0dce 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -24,24 +24,24 @@ The processes in the illustration (labeled 0 through 3) start with four numbers Before we dive into solving the parallel rank problem, let's first decide on how our function is going to behave. Our function needs to take a number on each process and return its associated rank with respect to all of the other numbers across all processes. Along with this, we will need other miscellaneous information, such as the communicator that is being used, and the datatype of the number being ranked. Given this function definition, our prototype for the rank function looks like this: ```cpp -MPI_Rank( +TMPI_Rank( void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) ``` -`MPI_Rank` takes a `send_data` buffer that contains one number of `datatype` type. The `recv_data` receives exactly one integer on each process that contains the rank value for `send_data`. The `comm` variable is the communicator in which ranking is taking place. +`TMPI_Rank` takes a `send_data` buffer that contains one number of `datatype` type. The `recv_data` receives exactly one integer on each process that contains the rank value for `send_data`. The `comm` variable is the communicator in which ranking is taking place. -> **Note** - `MPI_Rank` is not part of the MPI standard. We are just making it look like all of the other MPI functions for consistency. +> **Note** - The MPI standard explicitly says that users should not name their own functions `MPI_` to avoid confusing user functions with functions in the MPI standard itself. Thus, we will prefix functions in these tutorials with `T`. ## Solving the parallel rank problem -Now that we have our API definition, we can dive into how the parallel rank problem is solved. The first step in solving the parallel rank problem is ordering all of the numbers across all of the processes. This has to be accomplished so that we can find the rank of each number in the entire set of numbers. There are quite a few ways how we could accomplish this. The easiest way is gathering all of the numbers to one process and sorting the numbers. In the example code ([mpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/mpi_rank.c)), the `gather_numbers_to_root` function is responsible for gathering all of the numbers to the root process. +Now that we have our API definition, we can dive into how the parallel rank problem is solved. The first step in solving the parallel rank problem is ordering all of the numbers across all of the processes. This has to be accomplished so that we can find the rank of each number in the entire set of numbers. There are quite a few ways how we could accomplish this. The easiest way is gathering all of the numbers to one process and sorting the numbers. In the example code ([tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c)), the `gather_numbers_to_root` function is responsible for gathering all of the numbers to the root process. ```cpp -// Gathers numbers for MPI_Rank to process zero. Allocates space for -// the MPI datatype and returns a void * buffer to process 0. +// Gathers numbers for TMPI_Rank to process zero. Allocates space for +// the MPI datatype and returns a void * buffer to process 0. // It returns NULL to all other processes. void *gather_numbers_to_root(void *number, MPI_Datatype datatype, MPI_Comm comm) { @@ -74,7 +74,7 @@ Sorting numbers is not necessarily a difficult problem in our ranking function. In order to facilitate attaching the owning process to the numbers, we create a struct in the code that holds this information. Our struct definition is as follows: ```cpp -// Holds the communicator rank of a process along with the +// Holds the communicator rank of a process along with the // corresponding number. This struct is used for sorting // the values and keeping the owning process information // in tact. @@ -108,7 +108,7 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, int i; for (i = 0; i < gathered_number_count; i++) { comm_rank_numbers[i].comm_rank = i; - memcpy(&(comm_rank_numbers[i].number), + memcpy(&(comm_rank_numbers[i].number), gathered_numbers + (i * datatype_size), datatype_size); } @@ -136,19 +136,19 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, } ``` -The `get_ranks` function first creates an array of `CommRankNumber` structs and attaches the communicator rank of the process that owns the number. If the datatype is `MPI_FLOAT`, `qsort` is called with a special sorting function for our array of structs (see [mpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code) for the code). Likewise, we use a different sorting function if the datatype is `MPI_INT`. +The `get_ranks` function first creates an array of `CommRankNumber` structs and attaches the communicator rank of the process that owns the number. If the datatype is `MPI_FLOAT`, `qsort` is called with a special sorting function for our array of structs (see [tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code) for the code). Likewise, we use a different sorting function if the datatype is `MPI_INT`. After the numbers are sorted, we must create an array of ranks in the proper order so that they can be scattered back to the requesting processes. This is accomplished by making the `ranks` array and filling in the proper rank values for each of the sorted `CommRankNumber` structs. ## Putting it all together -Now that we have our two primary functions, we can put them all together into our `MPI_Rank` function. This function gathers the numbers to the root process, sorts the numbers to determine their ranks, and then scatters the ranks back to the requesting processes. The code is shown below: +Now that we have our two primary functions, we can put them all together into our `TMPI_Rank` function. This function gathers the numbers to the root process, sorts the numbers to determine their ranks, and then scatters the ranks back to the requesting processes. The code is shown below: ```cpp // Gets the rank of the recv_data, which is of type datatype. The rank // is returned in send_data and is of type datatype. -int MPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, +int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { - // Check base cases first - Only support MPI_INT and MPI_FLOAT for + // Check base cases first - Only support MPI_INT and MPI_FLOAT for // this function. if (datatype != MPI_INT && datatype != MPI_FLOAT) { return MPI_ERR_TYPE; @@ -158,7 +158,7 @@ int MPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm_size(comm, &comm_size); MPI_Comm_rank(comm, &comm_rank); - // To calculate the rank, we must gather the numbers to one + // To calculate the rank, we must gather the numbers to one // process, sort the numbers, and then scatter the resulting rank // values. Start by gathering the numbers on process 0 of comm. void *gathered_numbers = gather_numbers_to_root(send_data, datatype, @@ -181,7 +181,7 @@ int MPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, } ``` -The `MPI_Rank` function uses the two functions we just created, `gather_numbers_to_root` and `get_ranks`, to get the ranks of the numbers. The function then performs the final `MPI_Scatter` to scatter the resulting ranks back to the processes. +The `TMPI_Rank` function uses the two functions we just created, `gather_numbers_to_root` and `get_ranks`, to get the ranks of the numbers. The function then performs the final `MPI_Scatter` to scatter the resulting ranks back to the processes. If you have had trouble following the solution to the parallel rank problem, I have included an illustration of the entire data flow of our problem using an example set of data: @@ -192,7 +192,7 @@ Have any questions about how the parallel rank algorithm works? Leave them below ## Running our parallel rank algorithm I have included a small program in the example code to help test out our parallel rank algorithm. The code can be viewed in the [random_rank.c file]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c) file in the [lesson code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code). -The example application simply creates a random number on each process and calls `MPI_Rank` to get the rank of each number. If you run the random_rank program from the *tutorials* directory of the [repo]({{ site.github.code }}), the output should look similar to this. +The example application simply creates a random number on each process and calls `TMPI_Rank` to get the rank of each number. If you run the random_rank program from the *tutorials* directory of the [repo]({{ site.github.code }}), the output should look similar to this. ``` >>> cd tutorials @@ -207,4 +207,4 @@ Rank for 0.684195 on process 3 - 1 ## Up next In our next lesson, we start covering advanced collective communication. The next lesson is about [using MPI_Reduce and MPI_Allreduce to perform number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/). -For all beginner lessons, go the the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). \ No newline at end of file +For all beginner lessons, go the the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). From 48d94b9c245fdcaa4d6ac11d4aeac49829d2106a Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Wed, 12 Aug 2015 11:08:40 +0530 Subject: [PATCH 008/108] Changed Introduction and Hello World --- tutorials/installing-mpich2/index.md | 14 +++++++------- tutorials/mpi-hello-world/code/mpi_hello_world.c | 1 - tutorials/mpi-hello-world/index.md | 13 +++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index a7cd9f5..8553aae 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -22,10 +22,10 @@ The latest version of MPICH2 is available [here](http://www.mcs.anl.gov/research Once doing this, you should be able to configure your installation by performing `./configure`. I added a couple of parameters to my configuration to avoid building the MPI Fortran library. If you need to install MPICH2 to a local directory (for example, if you don't have root access to your machine), type `./configure --prefix=/installation/directory/path` For more information about possible configuration parameters, type `./configure --help` ``` ->>> ./configure --disable-f77 --disable-fc +>>> ./configure --disable-fortran Configuring MPICH2 version 1.4 with '--disable-f77' '--disable-fc' Running on system: Darwin Wes-Kendalls-Macbook-Pro.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu1504.9.37~1/RELEASE_I386 i386 -checking for gcc... gcc +checking for gcc... gcc ``` When configuration is done, it should say *"Configuration completed."* Once this is through, it is time to build and install MPICH2 with `make; sudo make install`. @@ -39,9 +39,9 @@ Using variables CC='gcc' CFLAGS=' -O2' LDFLAGS=' ' F77='' FFLAGS=' ' FC='' FCF If your build was successful, you should be able to type `mpich2version` and see something similar to this. ``` ->>> mpich2version -MPICH2 Version: 1.4 -MPICH2 Release date: Thu Jun 16 16:41:08 CDT 2011 +>>> mpiexec --version +MPICH2 Version: 3.1.4 +MPICH2 Release date: Fri Feb 20 15:02:56 CST 2015 MPICH2 Device: ch3:nemesis MPICH2 configure: --disable-f77 --disable-fc MPICH2 CC: gcc -O2 @@ -50,7 +50,7 @@ MPICH2 F77: MPICH2 FC: ``` -Hopefully your build finished successfully. If not, you may have issues with missing dependencies. For any issue, I highly recommend copying and pasting the error message directly into Google. +Hopefully your build finished successfully. If not, you may have issues with missing dependencies. For any issue, I highly recommend copying and pasting the error message directly into Google. ## Up next -Now that you have built MPICH2 locally, you have a couple options of where you can proceed on this site. If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you already have your own cluster or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. \ No newline at end of file +Now that you have built MPICH2 locally, you have a couple options of where you can proceed on this site. If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you already have your own cluster or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. diff --git a/tutorials/mpi-hello-world/code/mpi_hello_world.c b/tutorials/mpi-hello-world/code/mpi_hello_world.c index fe131d4..5bd3032 100644 --- a/tutorials/mpi-hello-world/code/mpi_hello_world.c +++ b/tutorials/mpi-hello-world/code/mpi_hello_world.c @@ -9,7 +9,6 @@ // #include #include -#include int main(int argc, char** argv) { // Initialize the MPI environment. The two arguments to MPI Init are not diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index 6799630..b8085a1 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -9,13 +9,14 @@ redirect_from: '/mpi-hello-world/' In this lesson, I will show you a basic MPI hello world application and also discuss how to run an MPI program. The lesson will cover the basics of initializing MPI and running an MPI job across several processes. This lesson is intended to work with installations of MPICH2 (specifically 1.4). If you have not installed MPICH2, please refer back to the [installing MPICH2 lesson]({{ site.baseurl }}/tutorials/installing-mpich2/). -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-hello-world/code). +> **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-hello-world/code). ## Hello world code examples Let's dive right into the code from this lesson located in [mpi_hello_world.c]({{ site.github.code }}/tutorials/mpi-hello-world/code/mpi_hello_world.c). Below are some excerpts from the code. ```cpp -#include ; +#include +#include int main(int argc, char** argv) { // Initialize the MPI environment @@ -44,7 +45,7 @@ int main(int argc, char** argv) { } ``` -You will notice that the first step to building an MPI program is including the MPI header files with `#include ;`. After this, the MPI environment must be initialized with: +You will notice that the first step to building an MPI program is including the MPI header files with `#include `. After this, the MPI environment must be initialized with: ```cpp MPI_Init( @@ -68,7 +69,7 @@ MPI_Comm_size( MPI_Comm_rank( MPI_Comm communicator, int* rank) -``` +``` `MPI_Comm_rank` returns the rank of a process in a communicator. Each process inside of a communicator is assigned an incremental rank starting from zero. The ranks of the processes are primarily used for identification purposes when sending and receiving messages. @@ -107,7 +108,7 @@ clean: rm ${EXECS} ``` -My makefile looks for the MPICC environment variable. If you installed MPICH2 to a local directory, set your MPICC environment variable to point to your mpicc binary. The mpicc program in your installation is really just a wrapper around gcc, and it makes compiling and linking all of the necessary MPI routines much easier. +My makefile looks for the MPICC environment variable. If you installed MPICH2 to a local directory, set your MPICC environment variable to point to your mpicc binary. The mpicc program in your installation is really just a wrapper around gcc, and it makes compiling and linking all of the necessary MPI routines much easier. ``` >>> export MPICC=/home/kendall/bin/mpicc @@ -171,4 +172,4 @@ Hello world from processor cetus1, rank 1 out of 4 processors ## Up next Now that you have a basic understanding of how an MPI program is executed, it is now time to learn fundamental point-to-point communication routines. In the next lesson, I cover [basic sending and receiving routines in MPI]({{ site.baseurl }}/tutorials/mpi-send-and-receive/). Feel free to also examine the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) for a complete reference of all of the beginning MPI lessons. -Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. \ No newline at end of file +Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. From 3b64842a05ba934ede11853c876ac7c2308fb0dd Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Fri, 14 Aug 2015 00:10:51 +0530 Subject: [PATCH 009/108] New Tutorial Page --- beginner-mpi-tutorial.md | 3 +- .../running-a-mpi-cluster-within-lan/index.md | 148 ++++++++++++++++++ 2 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 tutorials/running-a-mpi-cluster-within-lan/index.md diff --git a/beginner-mpi-tutorial.md b/beginner-mpi-tutorial.md index 1d47370..5e07959 100644 --- a/beginner-mpi-tutorial.md +++ b/beginner-mpi-tutorial.md @@ -12,6 +12,7 @@ This beginner tutorial assumes that the reader has a basic knowledge of C, some * [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) * [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) +* [Running a MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-a-mpi-cluster-within-lan) ## Blocking point-to-point communication * [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) @@ -24,4 +25,4 @@ This beginner tutorial assumes that the reader has a basic knowledge of C, some * [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) ## Advanced collective communication -* [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) \ No newline at end of file +* [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) diff --git a/tutorials/running-a-mpi-cluster-within-lan/index.md b/tutorials/running-a-mpi-cluster-within-lan/index.md new file mode 100644 index 0000000..de21c8e --- /dev/null +++ b/tutorials/running-a-mpi-cluster-within-lan/index.md @@ -0,0 +1,148 @@ +--- +layout: post +title: Running MPI cluster within a LAN +author: Dwaraka Nath +categories: Beginner MPI +tags: MPI, Cluster, LAN +redirect_from: '/running-a-mpi-cluster-within-lan' +--- + +Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same to more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. + +As with other tutorials, I am assuming you run Linux machines. The following tutorial was tested with Ubuntu, but it should be the same with any other distribution. And also, let's consider your machine to be **master** and the other one as **client** + +## Pre-requisite + +If you have not installed MPICH2 in each of the machines, follow the steps [here]({{ site.baseurl }}/tutorials/installing-mpich2/). + +## Step 1: Configure your ```hosts``` file + +You are gonna need to communicate between the computers and you don't want to type in the IP addresses every so often. Instead, you can give a name to the various nodes in the network that you wish to communicate with. ```hosts``` file is used by your device operating system to map hostnames to IP addresses. + +```bash + +$ cat /etc/hosts + +127.0.0.1 localhost +172.50.88.34 client +``` +The ```client``` here is the machine you'd like to do your computation with. + +## Step 2: Create a new user + +Though you can operate your cluster with your existing user account, I'd recommend you to create a new one to keep our configurations simple. Let us create a new user ```mpiuser```. Create new user accounts with the same username in all the machines to keep things simple. + +```bash +$ sudo useradd mpiuser +``` +Follow prompts and you will be good. Please don't use ```adduser``` command to create a new user as that doesn't create a separate home for new users. + +## Step 3: Setting up SSH + +Your machines are gonna be talking over the network via SSH and share data via [NFS](#step-4-setting-up-nfs), about which we'll talk a little later. + +```bash +$ sudo apt­-get install openssh-server +``` + +And right after that, login with your newly created account + +```bash +$ su - mpiuser +``` +Since the ```ssh``` server is already installed, you must be able to login to other machines by ```ssh username@hostname```, at which you will be prompted to enter the password of the ```username```. To enable more easier login, we generate keys and copy them to other machines' list of ```authorized_keys```. + +```bash +$ ssh-keygen -t dsa +``` + +You can as well generate RSA keys. But again, it is totally up to you. If you want more security, go with RSA. Else, DSA should do just fine. Now, add the generated key to each of the other computers. In our case, the client machine. + +```bash +$ ssh-copy-id client #ip-address may also be used +``` + +Do the above step for each of the client machines and your own user (localhost). + +This will setup ```openssh-server``` for you to securely communicate with the client machines. ```ssh``` all machines once, so they get added to your list of ```known_hosts```. This is a very simple but essential step failing which passwordless ```ssh``` will be a trouble. + +Now, to enable passwordless ssh, + +```bash +$ eval `ssh-agent` +$ ssh-add ~/.ssh/id_dsa +``` +Now, assuming you've properly added your keys to other machines, you must be able to login to other machines without any password prompt. + +```bash +$ ssh client +``` + +> **Note** - Since I've assumed that you've created ```mpiuser``` as the common user account in all of the client machines, this should just work fine. If you've created user accounts with different names in master and client machines, you'll need to work around that. + +## Step 4: Setting up NFS + +You share a directory via NFS in **master** which the **client** mounts to exchange data. + +### NFS-Server + +Install the required packages by + +```bash +$ sudo apt-get install nfs-kernel-server +``` + +Now, (assuming you are still logged into ```mpiuser```), let's create a folder by the name ```cloud``` that we will share across in the network. + +```bash +$ mkdir cloud +``` + +To export the ```cloud``` directory, you create an entry in ```/etc/exports``` + +```bash +$ cat /etc/exports +/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check) +``` +Here, instead of ```*``` you can specifically give out the IP address to which you want to share this folder to. But, this will just make our job easier. + +* **rw**: This is to enable both read and write option. **ro** is for read-only. +* **sync**: This applies changes to the shared directory only after changes are committed. +* **no_subtree_check**: This option prevents the subtree checking. When a shared directory is the subdirectory of a larger filesystem, nfs performs scans of every directory above it, in order to verify its permissions and details. Disabling the subtree check may increase the reliability of NFS, but reduce security. +* **no_root_squash**: This allows root account to connect to the folder. + +> Thanks to [Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-12-04) for help with tutorial and explanations. Content re-used on account of Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. For information, read [here](https://creativecommons.org/licenses/by-nc-sa/4.0/). + +After you have made the entry, run the following. + +``bash +$ exportfs -a +``` + +Run the above command, every time you make a change to ```/etc/exports```. + +### NFS-Client + +Install the required packages + +```bash +$ sudo apt-get install nfs-common +``` + +Create a directory in the client's machine with the samename ```cloud``` + +```bash +$ mkdir cloud +``` + +And now, mount the shared directory like + +```bash +$ sudo mount -t nfs master:/home/mpiuser/cloud ~/cloud +``` + +To check the mounted directories, + +```bash +$ df -h +``` From 172cdce026c0736bbda0f14c2433b7ff8708f4fe Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Fri, 14 Aug 2015 01:33:06 +0530 Subject: [PATCH 010/108] MPI within LAN - Running MPI --- .../running-a-mpi-cluster-within-lan/index.md | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/tutorials/running-a-mpi-cluster-within-lan/index.md b/tutorials/running-a-mpi-cluster-within-lan/index.md index de21c8e..3498e30 100644 --- a/tutorials/running-a-mpi-cluster-within-lan/index.md +++ b/tutorials/running-a-mpi-cluster-within-lan/index.md @@ -26,7 +26,7 @@ $ cat /etc/hosts 127.0.0.1 localhost 172.50.88.34 client ``` -The ```client``` here is the machine you'd like to do your computation with. +The ```client``` here is the machine you'd like to do your computation with. Likewise, do the same about ```master``` in the client. ## Step 2: Create a new user @@ -115,12 +115,18 @@ Here, instead of ```*``` you can specifically give out the IP address to which y After you have made the entry, run the following. -``bash +```bash $ exportfs -a ``` Run the above command, every time you make a change to ```/etc/exports```. +If required, restart the ```nfs``` server + +```bash +$ sudo service nfs-kernel-server restart +``` + ### NFS-Client Install the required packages @@ -145,4 +151,46 @@ To check the mounted directories, ```bash $ df -h +Filesystem Size Used Avail Use% Mounted on +master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud +``` + +## Step 5: Running MPI Programs + +For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. + +If you want to compile your own code, + +```bash +$ mpicc -o mpi_sample mpi_sample.c +``` + +First copy your executable into the shared directory ```cloud``` or better yet, compile your code within the NFS shared directory. + +```bash +$ cd cloud/ +$ pwd +/home/mpiuser/cloud ``` + +To run it only in your machine, you do + +```bash +$ mpirun -np 2 ./cpi # No. of processes = 2 +``` + +Now, to run it within a cluster, + +```bash +$ mpirun -np 5 -hosts client,localhost ./cpi +#hostnames can also be substituted with ip addresses. +``` + +Or specify the same in a hostfile and + +```bash +$ mpirun -np 5 --hostfile mpi_file ./cpi +``` + +This should spin up your program in all of the machines that your **master** is connected to. + From c1c05c5d0746e57b83920d61cd71beebbc45be48 Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Wed, 19 Aug 2015 09:11:03 +0530 Subject: [PATCH 011/108] Update About section, few links, header and footnotes --- about.md | 6 ++++++ beginner-mpi-tutorial.md | 2 +- tutorials/installing-mpich2/index.md | 2 +- tutorials/running-a-mpi-cluster-within-lan/index.md | 11 ++++++++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/about.md b/about.md index 0454158..fce32d6 100644 --- a/about.md +++ b/about.md @@ -23,3 +23,9 @@ For those that have never used Github or may feel overwhelmed about contributing Wes Kendall is the original author of mpitutorial.com. As a graduate student at the University of Tennessee, Knoxville, Wes earned his PhD under Jian Huang. His research revolved around large-scale data analysis and visualization, and he worked with the biggest supercomputers in the world. As a graduate student, he interned at Google, Oak Ridge National Labs, and Argonne National Labs. His research also earned him the Supercomputing 2011 Best Student Paper Award. He is currently co-founder and CTO of [Ambition](http://ambition.com), a data-analytics startup funded by YCombinator, Google Ventures, and several other top investment firms. Disappointed with the amount of freely-available content on parallel programming and MPI, Wes started releasing tutorials on the subject after graduate school. Once his startup consumed most of his time, he opened up mpitutorial.com to the public on github.com so that others could start contributing high-quality content. + +### Dwaraka Nath + +Dwaraka Nath is a masters graduate from Birla Institute of Technology and Science, Pilani, India. He loves blogging and occasionally does some code contributions as well. + +You can find more about him on his [personal website](https://www.dwarak.in) and follow him on Github at [@dtsdwarak](https://github.com/dtsdwarak). diff --git a/beginner-mpi-tutorial.md b/beginner-mpi-tutorial.md index 5e07959..73183c1 100644 --- a/beginner-mpi-tutorial.md +++ b/beginner-mpi-tutorial.md @@ -11,8 +11,8 @@ This beginner tutorial assumes that the reader has a basic knowledge of C, some * [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) * [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) -* [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) * [Running a MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-a-mpi-cluster-within-lan) +* [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) ## Blocking point-to-point communication * [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index 8553aae..86613f0 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -53,4 +53,4 @@ MPICH2 FC: Hopefully your build finished successfully. If not, you may have issues with missing dependencies. For any issue, I highly recommend copying and pasting the error message directly into Google. ## Up next -Now that you have built MPICH2 locally, you have a couple options of where you can proceed on this site. If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you already have your own cluster or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. +Now that you have built MPICH2 locally, you have some options of where you can proceed on this site. If you already have the hardware and resources to setup a local cluster, I suggest you proceed to the tutorial about [running a MPI cluster in LAN]({{ site.baseurl }}/tutorials/running-a-mpi-cluster-within-lan/). If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you have built a cluster in either way or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. diff --git a/tutorials/running-a-mpi-cluster-within-lan/index.md b/tutorials/running-a-mpi-cluster-within-lan/index.md index 3498e30..bbad96b 100644 --- a/tutorials/running-a-mpi-cluster-within-lan/index.md +++ b/tutorials/running-a-mpi-cluster-within-lan/index.md @@ -7,7 +7,7 @@ tags: MPI, Cluster, LAN redirect_from: '/running-a-mpi-cluster-within-lan' --- -Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same to more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. +Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same from more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. As with other tutorials, I am assuming you run Linux machines. The following tutorial was tested with Ubuntu, but it should be the same with any other distribution. And also, let's consider your machine to be **master** and the other one as **client** @@ -157,9 +157,9 @@ master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud ## Step 5: Running MPI Programs -For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. +For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. -If you want to compile your own code, +Or if you want to compile your own code, the name of which let's say is ```mpi_sample.c```, you will compile it the way given below, to generate an executable ```mpi_sample```. ```bash $ mpicc -o mpi_sample mpi_sample.c @@ -194,3 +194,8 @@ $ mpirun -np 5 --hostfile mpi_file ./cpi This should spin up your program in all of the machines that your **master** is connected to. +##So, what's next? + +Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. + +Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. \ No newline at end of file From 9a155cb3f65379f51ec4019040bd61d3bf732123 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Wed, 19 Aug 2015 06:43:28 -0700 Subject: [PATCH 012/108] Update beginner-mpi-tutorial.md Updated title of tutorial to be consistent with other titles --- beginner-mpi-tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beginner-mpi-tutorial.md b/beginner-mpi-tutorial.md index 73183c1..8e7d73b 100644 --- a/beginner-mpi-tutorial.md +++ b/beginner-mpi-tutorial.md @@ -11,7 +11,7 @@ This beginner tutorial assumes that the reader has a basic knowledge of C, some * [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) * [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) -* [Running a MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-a-mpi-cluster-within-lan) +* [Running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan/) * [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) ## Blocking point-to-point communication From d8b603e887d6e5faf0c613b5ee27b75d007ca58a Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Wed, 19 Aug 2015 06:46:33 -0700 Subject: [PATCH 013/108] fixed capitalization of title and also location of tutorial --- .../running-a-mpi-cluster-within-lan/index.md | 201 ------------------ 1 file changed, 201 deletions(-) delete mode 100644 tutorials/running-a-mpi-cluster-within-lan/index.md diff --git a/tutorials/running-a-mpi-cluster-within-lan/index.md b/tutorials/running-a-mpi-cluster-within-lan/index.md deleted file mode 100644 index bbad96b..0000000 --- a/tutorials/running-a-mpi-cluster-within-lan/index.md +++ /dev/null @@ -1,201 +0,0 @@ ---- -layout: post -title: Running MPI cluster within a LAN -author: Dwaraka Nath -categories: Beginner MPI -tags: MPI, Cluster, LAN -redirect_from: '/running-a-mpi-cluster-within-lan' ---- - -Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same from more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. - -As with other tutorials, I am assuming you run Linux machines. The following tutorial was tested with Ubuntu, but it should be the same with any other distribution. And also, let's consider your machine to be **master** and the other one as **client** - -## Pre-requisite - -If you have not installed MPICH2 in each of the machines, follow the steps [here]({{ site.baseurl }}/tutorials/installing-mpich2/). - -## Step 1: Configure your ```hosts``` file - -You are gonna need to communicate between the computers and you don't want to type in the IP addresses every so often. Instead, you can give a name to the various nodes in the network that you wish to communicate with. ```hosts``` file is used by your device operating system to map hostnames to IP addresses. - -```bash - -$ cat /etc/hosts - -127.0.0.1 localhost -172.50.88.34 client -``` -The ```client``` here is the machine you'd like to do your computation with. Likewise, do the same about ```master``` in the client. - -## Step 2: Create a new user - -Though you can operate your cluster with your existing user account, I'd recommend you to create a new one to keep our configurations simple. Let us create a new user ```mpiuser```. Create new user accounts with the same username in all the machines to keep things simple. - -```bash -$ sudo useradd mpiuser -``` -Follow prompts and you will be good. Please don't use ```adduser``` command to create a new user as that doesn't create a separate home for new users. - -## Step 3: Setting up SSH - -Your machines are gonna be talking over the network via SSH and share data via [NFS](#step-4-setting-up-nfs), about which we'll talk a little later. - -```bash -$ sudo apt­-get install openssh-server -``` - -And right after that, login with your newly created account - -```bash -$ su - mpiuser -``` -Since the ```ssh``` server is already installed, you must be able to login to other machines by ```ssh username@hostname```, at which you will be prompted to enter the password of the ```username```. To enable more easier login, we generate keys and copy them to other machines' list of ```authorized_keys```. - -```bash -$ ssh-keygen -t dsa -``` - -You can as well generate RSA keys. But again, it is totally up to you. If you want more security, go with RSA. Else, DSA should do just fine. Now, add the generated key to each of the other computers. In our case, the client machine. - -```bash -$ ssh-copy-id client #ip-address may also be used -``` - -Do the above step for each of the client machines and your own user (localhost). - -This will setup ```openssh-server``` for you to securely communicate with the client machines. ```ssh``` all machines once, so they get added to your list of ```known_hosts```. This is a very simple but essential step failing which passwordless ```ssh``` will be a trouble. - -Now, to enable passwordless ssh, - -```bash -$ eval `ssh-agent` -$ ssh-add ~/.ssh/id_dsa -``` -Now, assuming you've properly added your keys to other machines, you must be able to login to other machines without any password prompt. - -```bash -$ ssh client -``` - -> **Note** - Since I've assumed that you've created ```mpiuser``` as the common user account in all of the client machines, this should just work fine. If you've created user accounts with different names in master and client machines, you'll need to work around that. - -## Step 4: Setting up NFS - -You share a directory via NFS in **master** which the **client** mounts to exchange data. - -### NFS-Server - -Install the required packages by - -```bash -$ sudo apt-get install nfs-kernel-server -``` - -Now, (assuming you are still logged into ```mpiuser```), let's create a folder by the name ```cloud``` that we will share across in the network. - -```bash -$ mkdir cloud -``` - -To export the ```cloud``` directory, you create an entry in ```/etc/exports``` - -```bash -$ cat /etc/exports -/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check) -``` -Here, instead of ```*``` you can specifically give out the IP address to which you want to share this folder to. But, this will just make our job easier. - -* **rw**: This is to enable both read and write option. **ro** is for read-only. -* **sync**: This applies changes to the shared directory only after changes are committed. -* **no_subtree_check**: This option prevents the subtree checking. When a shared directory is the subdirectory of a larger filesystem, nfs performs scans of every directory above it, in order to verify its permissions and details. Disabling the subtree check may increase the reliability of NFS, but reduce security. -* **no_root_squash**: This allows root account to connect to the folder. - -> Thanks to [Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-12-04) for help with tutorial and explanations. Content re-used on account of Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. For information, read [here](https://creativecommons.org/licenses/by-nc-sa/4.0/). - -After you have made the entry, run the following. - -```bash -$ exportfs -a -``` - -Run the above command, every time you make a change to ```/etc/exports```. - -If required, restart the ```nfs``` server - -```bash -$ sudo service nfs-kernel-server restart -``` - -### NFS-Client - -Install the required packages - -```bash -$ sudo apt-get install nfs-common -``` - -Create a directory in the client's machine with the samename ```cloud``` - -```bash -$ mkdir cloud -``` - -And now, mount the shared directory like - -```bash -$ sudo mount -t nfs master:/home/mpiuser/cloud ~/cloud -``` - -To check the mounted directories, - -```bash -$ df -h -Filesystem Size Used Avail Use% Mounted on -master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud -``` - -## Step 5: Running MPI Programs - -For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. - -Or if you want to compile your own code, the name of which let's say is ```mpi_sample.c```, you will compile it the way given below, to generate an executable ```mpi_sample```. - -```bash -$ mpicc -o mpi_sample mpi_sample.c -``` - -First copy your executable into the shared directory ```cloud``` or better yet, compile your code within the NFS shared directory. - -```bash -$ cd cloud/ -$ pwd -/home/mpiuser/cloud -``` - -To run it only in your machine, you do - -```bash -$ mpirun -np 2 ./cpi # No. of processes = 2 -``` - -Now, to run it within a cluster, - -```bash -$ mpirun -np 5 -hosts client,localhost ./cpi -#hostnames can also be substituted with ip addresses. -``` - -Or specify the same in a hostfile and - -```bash -$ mpirun -np 5 --hostfile mpi_file ./cpi -``` - -This should spin up your program in all of the machines that your **master** is connected to. - -##So, what's next? - -Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. - -Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. \ No newline at end of file From 68d2072069d26523a644afc18a90de4276c68829 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Wed, 19 Aug 2015 06:49:39 -0700 Subject: [PATCH 014/108] improperly renamed github tutorial. Renamed it to its final address --- .../index.md | 201 ++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 tutorials/running-an-mpi-cluster-within-a-lan/index.md diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md new file mode 100644 index 0000000..f1b62d5 --- /dev/null +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -0,0 +1,201 @@ +--- +layout: post +title: Running an MPI Cluster within a LAN +author: Dwaraka Nath +categories: Beginner MPI +tags: MPI, Cluster, LAN +redirect_from: '/running-a-mpi-cluster-within-lan' +--- + +Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same from more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. + +As with other tutorials, I am assuming you run Linux machines. The following tutorial was tested with Ubuntu, but it should be the same with any other distribution. And also, let's consider your machine to be **master** and the other one as **client** + +## Pre-requisite + +If you have not installed MPICH2 in each of the machines, follow the steps [here]({{ site.baseurl }}/tutorials/installing-mpich2/). + +## Step 1: Configure your ```hosts``` file + +You are gonna need to communicate between the computers and you don't want to type in the IP addresses every so often. Instead, you can give a name to the various nodes in the network that you wish to communicate with. ```hosts``` file is used by your device operating system to map hostnames to IP addresses. + +```bash + +$ cat /etc/hosts + +127.0.0.1 localhost +172.50.88.34 client +``` +The ```client``` here is the machine you'd like to do your computation with. Likewise, do the same about ```master``` in the client. + +## Step 2: Create a new user + +Though you can operate your cluster with your existing user account, I'd recommend you to create a new one to keep our configurations simple. Let us create a new user ```mpiuser```. Create new user accounts with the same username in all the machines to keep things simple. + +```bash +$ sudo useradd mpiuser +``` +Follow prompts and you will be good. Please don't use ```adduser``` command to create a new user as that doesn't create a separate home for new users. + +## Step 3: Setting up SSH + +Your machines are gonna be talking over the network via SSH and share data via [NFS](#step-4-setting-up-nfs), about which we'll talk a little later. + +```bash +$ sudo apt­-get install openssh-server +``` + +And right after that, login with your newly created account + +```bash +$ su - mpiuser +``` +Since the ```ssh``` server is already installed, you must be able to login to other machines by ```ssh username@hostname```, at which you will be prompted to enter the password of the ```username```. To enable more easier login, we generate keys and copy them to other machines' list of ```authorized_keys```. + +```bash +$ ssh-keygen -t dsa +``` + +You can as well generate RSA keys. But again, it is totally up to you. If you want more security, go with RSA. Else, DSA should do just fine. Now, add the generated key to each of the other computers. In our case, the client machine. + +```bash +$ ssh-copy-id client #ip-address may also be used +``` + +Do the above step for each of the client machines and your own user (localhost). + +This will setup ```openssh-server``` for you to securely communicate with the client machines. ```ssh``` all machines once, so they get added to your list of ```known_hosts```. This is a very simple but essential step failing which passwordless ```ssh``` will be a trouble. + +Now, to enable passwordless ssh, + +```bash +$ eval `ssh-agent` +$ ssh-add ~/.ssh/id_dsa +``` +Now, assuming you've properly added your keys to other machines, you must be able to login to other machines without any password prompt. + +```bash +$ ssh client +``` + +> **Note** - Since I've assumed that you've created ```mpiuser``` as the common user account in all of the client machines, this should just work fine. If you've created user accounts with different names in master and client machines, you'll need to work around that. + +## Step 4: Setting up NFS + +You share a directory via NFS in **master** which the **client** mounts to exchange data. + +### NFS-Server + +Install the required packages by + +```bash +$ sudo apt-get install nfs-kernel-server +``` + +Now, (assuming you are still logged into ```mpiuser```), let's create a folder by the name ```cloud``` that we will share across in the network. + +```bash +$ mkdir cloud +``` + +To export the ```cloud``` directory, you create an entry in ```/etc/exports``` + +```bash +$ cat /etc/exports +/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check) +``` +Here, instead of ```*``` you can specifically give out the IP address to which you want to share this folder to. But, this will just make our job easier. + +* **rw**: This is to enable both read and write option. **ro** is for read-only. +* **sync**: This applies changes to the shared directory only after changes are committed. +* **no_subtree_check**: This option prevents the subtree checking. When a shared directory is the subdirectory of a larger filesystem, nfs performs scans of every directory above it, in order to verify its permissions and details. Disabling the subtree check may increase the reliability of NFS, but reduce security. +* **no_root_squash**: This allows root account to connect to the folder. + +> Thanks to [Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-12-04) for help with tutorial and explanations. Content re-used on account of Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. For information, read [here](https://creativecommons.org/licenses/by-nc-sa/4.0/). + +After you have made the entry, run the following. + +```bash +$ exportfs -a +``` + +Run the above command, every time you make a change to ```/etc/exports```. + +If required, restart the ```nfs``` server + +```bash +$ sudo service nfs-kernel-server restart +``` + +### NFS-Client + +Install the required packages + +```bash +$ sudo apt-get install nfs-common +``` + +Create a directory in the client's machine with the samename ```cloud``` + +```bash +$ mkdir cloud +``` + +And now, mount the shared directory like + +```bash +$ sudo mount -t nfs master:/home/mpiuser/cloud ~/cloud +``` + +To check the mounted directories, + +```bash +$ df -h +Filesystem Size Used Avail Use% Mounted on +master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud +``` + +## Step 5: Running MPI Programs + +For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. + +Or if you want to compile your own code, the name of which let's say is ```mpi_sample.c```, you will compile it the way given below, to generate an executable ```mpi_sample```. + +```bash +$ mpicc -o mpi_sample mpi_sample.c +``` + +First copy your executable into the shared directory ```cloud``` or better yet, compile your code within the NFS shared directory. + +```bash +$ cd cloud/ +$ pwd +/home/mpiuser/cloud +``` + +To run it only in your machine, you do + +```bash +$ mpirun -np 2 ./cpi # No. of processes = 2 +``` + +Now, to run it within a cluster, + +```bash +$ mpirun -np 5 -hosts client,localhost ./cpi +#hostnames can also be substituted with ip addresses. +``` + +Or specify the same in a hostfile and + +```bash +$ mpirun -np 5 --hostfile mpi_file ./cpi +``` + +This should spin up your program in all of the machines that your **master** is connected to. + +##So, what's next? + +Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. + +Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. From 49a1cd31e4718ef14eceb8358f99afa4ef807801 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Wed, 19 Aug 2015 06:50:18 -0700 Subject: [PATCH 015/108] updated the redirection to match the new directory for the LAN tutorial --- tutorials/running-an-mpi-cluster-within-a-lan/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index f1b62d5..70c486d 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -4,7 +4,7 @@ title: Running an MPI Cluster within a LAN author: Dwaraka Nath categories: Beginner MPI tags: MPI, Cluster, LAN -redirect_from: '/running-a-mpi-cluster-within-lan' +redirect_from: '/running-an-mpi-cluster-within-a-lan' --- Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same from more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. From 63b12dbcd08244341151b2cdab80721d61816238 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Wed, 19 Aug 2015 06:53:02 -0700 Subject: [PATCH 016/108] fixed capitalization of a subtitle to make it consistent with rest of site --- tutorials/running-an-mpi-cluster-within-a-lan/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index 70c486d..db61102 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -155,7 +155,7 @@ Filesystem Size Used Avail Use% Mounted on master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud ``` -## Step 5: Running MPI Programs +## Step 5: Running MPI programs For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. @@ -194,7 +194,7 @@ $ mpirun -np 5 --hostfile mpi_file ./cpi This should spin up your program in all of the machines that your **master** is connected to. -##So, what's next? +## So, what's next? Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. From 71e5d017f14385ab3278f7270c8d7b861b6e673e Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Thu, 20 Aug 2015 09:02:01 +0530 Subject: [PATCH 017/108] Fix broken links --- tutorials/installing-mpich2/index.md | 19 +++++++++---------- .../index.md | 4 ++-- .../index.md | 10 +++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index 86613f0..ba1ab05 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -36,21 +36,20 @@ Beginning make Using variables CC='gcc' CFLAGS=' -O2' LDFLAGS=' ' F77='' FFLAGS=' ' FC='' FCFLAGS=' ' CXX='c++' CXXFLAGS=' -O2' AR='ar' CPP='gcc-E' CPP ``` -If your build was successful, you should be able to type `mpich2version` and see something similar to this. +If your build was successful, you should be able to type `mpiexec --version` and see something similar to this. ``` >>> mpiexec --version -MPICH2 Version: 3.1.4 -MPICH2 Release date: Fri Feb 20 15:02:56 CST 2015 -MPICH2 Device: ch3:nemesis -MPICH2 configure: --disable-f77 --disable-fc -MPICH2 CC: gcc -O2 -MPICH2 CXX: c++ -O2 -MPICH2 F77: -MPICH2 FC: +HYDRA build details: + Version: 3.1.4 + Release Date: Fri Feb 20 15:02:56 CST 2015 + CC: gcc + CXX: g++ + F77: + F90: ``` Hopefully your build finished successfully. If not, you may have issues with missing dependencies. For any issue, I highly recommend copying and pasting the error message directly into Google. ## Up next -Now that you have built MPICH2 locally, you have some options of where you can proceed on this site. If you already have the hardware and resources to setup a local cluster, I suggest you proceed to the tutorial about [running a MPI cluster in LAN]({{ site.baseurl }}/tutorials/running-a-mpi-cluster-within-lan/). If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you have built a cluster in either way or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. +Now that you have built MPICH2 locally, you have some options of where you can proceed on this site. If you already have the hardware and resources to setup a local cluster, I suggest you proceed to the tutorial about [running an MPI cluster in LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan). If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you have built a cluster in either way or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index f37ad43..e5878d9 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -82,7 +82,7 @@ This creates a "mykey" key on your machine under `~/.ssh/mykey.rsa` and also cre ``` >>> Successfully created keypair: mykey >>> fingerprint: ... ->>> contents: +>>> contents: -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- @@ -160,4 +160,4 @@ starcluster terminate mpicluster The difference between a "stopped" and "terminated" cluster is that stopped clusters still reside as images on Amazon's Elastic Block Store (EBS). If you will not be starting your cluster again in the foreseeable future, it is recommended to go ahead and terminate the cluster since Amazon EBS payment rates apply to stored instances. As always, educate yourself on [Amazon EC2 Pricing](http://aws.amazon.com/ec2/pricing/) before getting started. ## Ready to run MPI programs on your cluster? -Now that you have your very own cluster, it's time to start running MPI programs. To get started, check out how to compile and run an [MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/). For all beginner lessons, check out the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). If you had any trouble with the lesson, please leave your comment below so that we can try to figure out what went wrong. Happy coding! +Now that you have your very own cluster, it's time to start running MPI programs. To get started, check out how to compile and run an [MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/). If you want to try the same by building a local cluster, go through [running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan) tutorial. For all beginner lessons, check out the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). If you had any trouble with the lesson, please leave your comment below so that we can try to figure out what went wrong. Happy coding! diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index db61102..e927042 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -179,23 +179,23 @@ To run it only in your machine, you do $ mpirun -np 2 ./cpi # No. of processes = 2 ``` -Now, to run it within a cluster, +Now, to run it within a cluster, ```bash -$ mpirun -np 5 -hosts client,localhost ./cpi +$ mpirun -np 5 -hosts client,localhost ./cpi #hostnames can also be substituted with ip addresses. ``` -Or specify the same in a hostfile and +Or specify the same in a hostfile and ```bash $ mpirun -np 5 --hostfile mpi_file ./cpi ``` -This should spin up your program in all of the machines that your **master** is connected to. +This should spin up your program in all of the machines that your **master** is connected to. ## So, what's next? Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. -Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. +Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. From 8a320d5d905cafa9d9be9a2c58edaa174b2b0c1f Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Tue, 8 Sep 2015 02:23:07 +0530 Subject: [PATCH 018/108] User Account error, add NFS mount, add Common errors and tips --- .../running-a-mpi-cluster-within-lan/index.md | 78 +++++++++++++++++-- 1 file changed, 70 insertions(+), 8 deletions(-) diff --git a/tutorials/running-a-mpi-cluster-within-lan/index.md b/tutorials/running-a-mpi-cluster-within-lan/index.md index bbad96b..492fc49 100644 --- a/tutorials/running-a-mpi-cluster-within-lan/index.md +++ b/tutorials/running-a-mpi-cluster-within-lan/index.md @@ -33,9 +33,9 @@ The ```client``` here is the machine you'd like to do your computation with. Lik Though you can operate your cluster with your existing user account, I'd recommend you to create a new one to keep our configurations simple. Let us create a new user ```mpiuser```. Create new user accounts with the same username in all the machines to keep things simple. ```bash -$ sudo useradd mpiuser +$ sudo adduser mpiuser ``` -Follow prompts and you will be good. Please don't use ```adduser``` command to create a new user as that doesn't create a separate home for new users. +Follow prompts and you will be good. Please don't use ```useradd``` command to create a new user as that doesn't create a separate home for new users. ## Step 3: Setting up SSH @@ -155,6 +155,14 @@ Filesystem Size Used Avail Use% Mounted on master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud ``` +To make the mount permanent so you don't have to manually mount the shared directory everytime you do a system reboot, you can create an entry in your file systems table - i.e., ```/etc/fstab``` file like this: + +```bash +$ cat /etc/fstab +#MPI CLUSTER SETUP +master:/home/mpiuser/cloud /home/mpiuser/cloud nfs +``` + ## Step 5: Running MPI Programs For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. @@ -179,23 +187,77 @@ To run it only in your machine, you do $ mpirun -np 2 ./cpi # No. of processes = 2 ``` -Now, to run it within a cluster, +Now, to run it within a cluster, ```bash -$ mpirun -np 5 -hosts client,localhost ./cpi +$ mpirun -np 5 -hosts client,localhost ./cpi #hostnames can also be substituted with ip addresses. ``` -Or specify the same in a hostfile and +Or specify the same in a hostfile and ```bash $ mpirun -np 5 --hostfile mpi_file ./cpi ``` -This should spin up your program in all of the machines that your **master** is connected to. +This should spin up your program in all of the machines that your **master** is connected to. + +##Common errors and tips + +* Make sure all the machines you are trying to run the executable on, has the same version of MPI. Recommended is [MPICH2](http://www.mpich.org/downloads/). +* The ```hosts``` file of ```master``` should contain the local network IP address entries of ```master``` and all of the slave nodes. For each of the slave, you need to have the IP address entry of ```master``` and the corresponding slave node. + +For e.g. a sample hostfile entry of a ```master``` node can be, + +```bash +$ cat /etc/hosts +127.0.0.1 localhost +#127.0.1.1 1944 + +#MPI CLUSTER SETUP +172.50.88.22 master +172.50.88.56 slave1 +172.50.88.34 slave2 +172.50.88.54 slave3 +172.50.88.60 slave4 +172.50.88.46 slave5 +``` +A sample hostfile entry of ```slave3``` node can be, + +```bash +$ cat /etc/hosts +127.0.0.1 localhost +#127.0.1.1 1947 + +#MPI CLUSTER SETUP +172.50.88.22 master +172.50.88.54 slave3 +``` +* Whenever you try to run a process parallely using MPI, you can either run the process locally or run it as a combination of local and remote nodes. You **cannot** invoke a process **only on other nodes**. + +To make this more clear, from ```master``` node, this script can be invoked. + +```bash +$ mpirun -np 10 --hosts master ./cpi +# To run the program only on the same master node +``` + +So can this be. The following will also run perfectly. + +```bash +$ mpirun - np 10 --hosts master,slave1,slave2 ./cpi +# To run the program on master and slave nodes. +``` + +But, the following is **not correct** and will result in an error if invoked from ```master```. + +```bash +$ mpirun -np 10 --hosts slave1 ./cpi +# Trying to run the program only on remote slave +``` ##So, what's next? -Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. +Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. -Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. \ No newline at end of file +Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. From 30ef0fb62d40f8ccb8972859c252f3ec7dc13991 Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Tue, 8 Sep 2015 02:46:56 +0530 Subject: [PATCH 019/108] Revert "User Account error, add NFS mount, add Common errors and tips" This reverts commit 8a320d5d905cafa9d9be9a2c58edaa174b2b0c1f. --- .../running-a-mpi-cluster-within-lan/index.md | 78 ++----------------- 1 file changed, 8 insertions(+), 70 deletions(-) diff --git a/tutorials/running-a-mpi-cluster-within-lan/index.md b/tutorials/running-a-mpi-cluster-within-lan/index.md index 492fc49..bbad96b 100644 --- a/tutorials/running-a-mpi-cluster-within-lan/index.md +++ b/tutorials/running-a-mpi-cluster-within-lan/index.md @@ -33,9 +33,9 @@ The ```client``` here is the machine you'd like to do your computation with. Lik Though you can operate your cluster with your existing user account, I'd recommend you to create a new one to keep our configurations simple. Let us create a new user ```mpiuser```. Create new user accounts with the same username in all the machines to keep things simple. ```bash -$ sudo adduser mpiuser +$ sudo useradd mpiuser ``` -Follow prompts and you will be good. Please don't use ```useradd``` command to create a new user as that doesn't create a separate home for new users. +Follow prompts and you will be good. Please don't use ```adduser``` command to create a new user as that doesn't create a separate home for new users. ## Step 3: Setting up SSH @@ -155,14 +155,6 @@ Filesystem Size Used Avail Use% Mounted on master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud ``` -To make the mount permanent so you don't have to manually mount the shared directory everytime you do a system reboot, you can create an entry in your file systems table - i.e., ```/etc/fstab``` file like this: - -```bash -$ cat /etc/fstab -#MPI CLUSTER SETUP -master:/home/mpiuser/cloud /home/mpiuser/cloud nfs -``` - ## Step 5: Running MPI Programs For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. @@ -187,77 +179,23 @@ To run it only in your machine, you do $ mpirun -np 2 ./cpi # No. of processes = 2 ``` -Now, to run it within a cluster, +Now, to run it within a cluster, ```bash -$ mpirun -np 5 -hosts client,localhost ./cpi +$ mpirun -np 5 -hosts client,localhost ./cpi #hostnames can also be substituted with ip addresses. ``` -Or specify the same in a hostfile and +Or specify the same in a hostfile and ```bash $ mpirun -np 5 --hostfile mpi_file ./cpi ``` -This should spin up your program in all of the machines that your **master** is connected to. - -##Common errors and tips - -* Make sure all the machines you are trying to run the executable on, has the same version of MPI. Recommended is [MPICH2](http://www.mpich.org/downloads/). -* The ```hosts``` file of ```master``` should contain the local network IP address entries of ```master``` and all of the slave nodes. For each of the slave, you need to have the IP address entry of ```master``` and the corresponding slave node. - -For e.g. a sample hostfile entry of a ```master``` node can be, - -```bash -$ cat /etc/hosts -127.0.0.1 localhost -#127.0.1.1 1944 - -#MPI CLUSTER SETUP -172.50.88.22 master -172.50.88.56 slave1 -172.50.88.34 slave2 -172.50.88.54 slave3 -172.50.88.60 slave4 -172.50.88.46 slave5 -``` -A sample hostfile entry of ```slave3``` node can be, - -```bash -$ cat /etc/hosts -127.0.0.1 localhost -#127.0.1.1 1947 - -#MPI CLUSTER SETUP -172.50.88.22 master -172.50.88.54 slave3 -``` -* Whenever you try to run a process parallely using MPI, you can either run the process locally or run it as a combination of local and remote nodes. You **cannot** invoke a process **only on other nodes**. - -To make this more clear, from ```master``` node, this script can be invoked. - -```bash -$ mpirun -np 10 --hosts master ./cpi -# To run the program only on the same master node -``` - -So can this be. The following will also run perfectly. - -```bash -$ mpirun - np 10 --hosts master,slave1,slave2 ./cpi -# To run the program on master and slave nodes. -``` - -But, the following is **not correct** and will result in an error if invoked from ```master```. - -```bash -$ mpirun -np 10 --hosts slave1 ./cpi -# Trying to run the program only on remote slave -``` +This should spin up your program in all of the machines that your **master** is connected to. ##So, what's next? -Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. +Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. -Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. +Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. \ No newline at end of file From ac0d6afda1f7a7b6dc06f3aa7610806391b087dd Mon Sep 17 00:00:00 2001 From: Dwaraka Nath Date: Tue, 8 Sep 2015 03:11:30 +0530 Subject: [PATCH 020/108] User Account error, add NFS mount, add Common errors and tips --- .../index.md | 71 +++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index e927042..59f95b3 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -33,9 +33,9 @@ The ```client``` here is the machine you'd like to do your computation with. Lik Though you can operate your cluster with your existing user account, I'd recommend you to create a new one to keep our configurations simple. Let us create a new user ```mpiuser```. Create new user accounts with the same username in all the machines to keep things simple. ```bash -$ sudo useradd mpiuser +$ sudo adduser mpiuser ``` -Follow prompts and you will be good. Please don't use ```adduser``` command to create a new user as that doesn't create a separate home for new users. +Follow prompts and you will be good. Please don't use ```useradd``` command to create a new user as that doesn't create a separate home for new users. ## Step 3: Setting up SSH @@ -155,7 +155,15 @@ Filesystem Size Used Avail Use% Mounted on master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud ``` -## Step 5: Running MPI programs +To make the mount permanent so you don't have to manually mount the shared directory everytime you do a system reboot, you can create an entry in your file systems table - i.e., ```/etc/fstab``` file like this: + +```bash +$ cat /etc/fstab +#MPI CLUSTER SETUP +master:/home/mpiuser/cloud /home/mpiuser/cloud nfs +``` + +## Step 5: Running MPI Programs For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. @@ -194,8 +202,63 @@ $ mpirun -np 5 --hostfile mpi_file ./cpi This should spin up your program in all of the machines that your **master** is connected to. +##Common errors and tips + +* Make sure all the machines you are trying to run the executable on, has the same version of MPI. Recommended is [MPICH2](http://www.mpich.org/downloads/). +* The ```hosts``` file of ```master``` should contain the local network IP address entries of ```master``` and all of the slave nodes. For each of the slave, you need to have the IP address entry of ```master``` and the corresponding slave node. + +For e.g. a sample hostfile entry of a ```master``` node can be, + +```bash +$ cat /etc/hosts +127.0.0.1 localhost +#127.0.1.1 1944 + +#MPI CLUSTER SETUP +172.50.88.22 master +172.50.88.56 slave1 +172.50.88.34 slave2 +172.50.88.54 slave3 +172.50.88.60 slave4 +172.50.88.46 slave5 +``` +A sample hostfile entry of ```slave3``` node can be, + +```bash +$ cat /etc/hosts +127.0.0.1 localhost +#127.0.1.1 1947 + +#MPI CLUSTER SETUP +172.50.88.22 master +172.50.88.54 slave3 +``` +* Whenever you try to run a process parallely using MPI, you can either run the process locally or run it as a combination of local and remote nodes. You **cannot** invoke a process **only on other nodes**. + +To make this more clear, from ```master``` node, this script can be invoked. + +```bash +$ mpirun -np 10 --hosts master ./cpi +# To run the program only on the same master node +``` + +So can this be. The following will also run perfectly. + +```bash +$ mpirun - np 10 --hosts master,slave1,slave2 ./cpi +# To run the program on master and slave nodes. +``` + +But, the following is **not correct** and will result in an error if invoked from ```master```. + +```bash +$ mpirun -np 10 --hosts slave1 ./cpi +# Trying to run the program only on remote slave +``` + ## So, what's next? -Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. +Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. + From 801aed5d75c5372f8ec05e4471f3452b54ed26b2 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Mon, 7 Sep 2015 21:05:20 -0500 Subject: [PATCH 021/108] Create new tutorial for groups and communicators This creates a new tutorial covering groups and communicators, including how they are created, manipulated, and freed. --- CONTRIBUTORS.md | 3 +- about.md | 5 +- advanced-mpi-tutorial.md | 10 + beginner-mpi-tutorial.md | 3 + index.md | 3 + .../code/groups.c | 53 +++++ .../code/split.c | 38 ++++ .../comm_split.png | Bin 0 -> 74904 bytes .../comm_split.pptx | Bin 0 -> 50286 bytes .../groups.png | Bin 0 -> 43737 bytes .../index.md | 203 ++++++++++++++++++ tutorials/run.py | 4 + 12 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 advanced-mpi-tutorial.md create mode 100644 tutorials/introduction-to-groups-and-communicators/code/groups.c create mode 100644 tutorials/introduction-to-groups-and-communicators/code/split.c create mode 100644 tutorials/introduction-to-groups-and-communicators/comm_split.png create mode 100644 tutorials/introduction-to-groups-and-communicators/comm_split.pptx create mode 100644 tutorials/introduction-to-groups-and-communicators/groups.png create mode 100644 tutorials/introduction-to-groups-and-communicators/index.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a11e5aa..57aa16b 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1 +1,2 @@ -Wes Kendall (wesleykendall@gmail.com) \ No newline at end of file +Wes Kendall (wesleykendall@gmail.com) +Wesley Bland (wesley@wesbland.com) diff --git a/about.md b/about.md index fce32d6..0c1bd79 100644 --- a/about.md +++ b/about.md @@ -26,6 +26,9 @@ Disappointed with the amount of freely-available content on parallel programming ### Dwaraka Nath -Dwaraka Nath is a masters graduate from Birla Institute of Technology and Science, Pilani, India. He loves blogging and occasionally does some code contributions as well. +Dwaraka Nath is a masters graduate from Birla Institute of Technology and Science, Pilani, India. He loves blogging and occasionally does some code contributions as well. You can find more about him on his [personal website](https://www.dwarak.in) and follow him on Github at [@dtsdwarak](https://github.com/dtsdwarak). + +### Wesley Bland +Wesley Bland is a researcher in High Performance Computing and a contributor to both MPICH and Open MPI. He graduated from the University of Tennessee, Knoxville with his PhD under Dr. Jack Dongarra. His research involved fault tolerance at scale using MPI. After leaving the university, he went to Argonne National Laboratory where he worked under Dr. Pavan Balaji as a postdoctoral appointee and continued his fault tolerance research while working on MPICH directly. He currently works at Intel Corporation on high performance runtimes, including MPI. diff --git a/advanced-mpi-tutorial.md b/advanced-mpi-tutorial.md new file mode 100644 index 0000000..225b4b3 --- /dev/null +++ b/advanced-mpi-tutorial.md @@ -0,0 +1,10 @@ +--- +layout: page +title: Advanced MPI Tutorial +--- + +Welcome to the advanced MPI tutorial! In this tutorial, you will learn some of the more advanced concepts of MPI. Below are the available lessons, each of which contain example code. + +This tutorial assumes that the reader understands the topics in the basic tutorial. + +* [Introduction to Groups and Communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) diff --git a/beginner-mpi-tutorial.md b/beginner-mpi-tutorial.md index 8e7d73b..b821182 100644 --- a/beginner-mpi-tutorial.md +++ b/beginner-mpi-tutorial.md @@ -26,3 +26,6 @@ This beginner tutorial assumes that the reader has a basic knowledge of C, some ## Advanced collective communication * [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) + +## Groups and Communicators +* [Introduction to Groups and Communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) diff --git a/index.md b/index.md index b298745..097ce61 100644 --- a/index.md +++ b/index.md @@ -8,6 +8,9 @@ Welcome to mpitutorial.com, a website dedicated to providing useful tutorials ab ## Beginner Tutorial Wanting to get started learning MPI? Head over to the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). +## Advanced Tutorial +Ready to dive into something more advanced? Check out the [advanced MPI tutorial]({{ site.baseurl }}/advanced-mpi-tutorial/). + ## Recommended Books Recommended books for learning MPI are located [here]({{ site.baseurl }}/recommended-books/). diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups.c b/tutorials/introduction-to-groups-and-communicators/code/groups.c new file mode 100644 index 0000000..c6b46fb --- /dev/null +++ b/tutorials/introduction-to-groups-and-communicators/code/groups.c @@ -0,0 +1,53 @@ +// Author: Wesley Bland +// Copyright 2015 www.mpitutorial.com +// This code is provided freely with the tutorials on mpitutorial.com. Feel +// free to modify it for your own use. Any distribution of the code must +// either provide a link to www.mpitutorial.com or keep this header in tact. +// +// Example using MPI_Comm_split to divide a communicator into subcommunicators +// + +#include "mpi.h" +#include +#include + +int main(int argc, char **argv) { + MPI_Init(NULL, NULL); + + // Get the rank and size in the original communicator + int world_rank, world_size; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + // Get the group of processes in MPI_COMM_WORLD + MPI_Group world_group; + MPI_Comm_group(MPI_COMM_WORLD, &world_group); + + int n = 7; + const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; + + // Construct a group containing all of the prime ranks in world_group + MPI_Group prime_group; + MPI_Group_incl(world_group, 7, ranks, &prime_group); + + // Create a new communicator based on the group + MPI_Comm prime_comm; + MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); + + int prime_rank = -1, prime_size = -1; + // If this rank isn't in the new communicator, it will be MPI_COMM_NULL + // Using MPI_COMM_NULL for MPI_Comm_rank or MPI_Comm_size is erroneous + if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_rank(prime_comm, &prime_rank); + MPI_Comm_size(prime_comm, &prime_size); + } + + printf("WORLD RANK/SIZE: %d/%d \t PRIME RANK/SIZE: %d/%d\n", + world_rank, world_size, prime_rank, prime_size); + + MPI_Group_free(&world_group); + MPI_Group_free(&prime_group); + MPI_Comm_free(&prime_comm); + + MPI_Finalize(); +} diff --git a/tutorials/introduction-to-groups-and-communicators/code/split.c b/tutorials/introduction-to-groups-and-communicators/code/split.c new file mode 100644 index 0000000..9566911 --- /dev/null +++ b/tutorials/introduction-to-groups-and-communicators/code/split.c @@ -0,0 +1,38 @@ +// Author: Wesley Bland +// Copyright 2015 www.mpitutorial.com +// This code is provided freely with the tutorials on mpitutorial.com. Feel +// free to modify it for your own use. Any distribution of the code must +// either provide a link to www.mpitutorial.com or keep this header in tact. +// +// Example using MPI_Comm_split to divide a communicator into subcommunicators +// + +#include "mpi.h" +#include +#include + +int main(int argc, char **argv) { + MPI_Init(NULL, NULL); + + // Get the rank and size in the original communicator + int world_rank, world_size; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + int color = world_rank / 4; // Determine color based on row + + // Split the communicator based on the color and use the original rank for ordering + MPI_Comm row_comm; + MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); + + int row_rank, row_size; + MPI_Comm_rank(row_comm, &row_rank); + MPI_Comm_size(row_comm, &row_size); + + printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", + world_rank, world_size, row_rank, row_size); + + MPI_Comm_free(&row_comm); + + MPI_Finalize(); +} diff --git a/tutorials/introduction-to-groups-and-communicators/comm_split.png b/tutorials/introduction-to-groups-and-communicators/comm_split.png new file mode 100644 index 0000000000000000000000000000000000000000..ed55ef74ead1b800ab132560814b27e65e7b92fa GIT binary patch literal 74904 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 !;eSlLA68iiUrS9tJumv@anKpO8TYQ4#56 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≦Ln!xsi0Mv_2HU?s(4A8G4Cw_o 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

eQ>|{G+*6$|VAE>(7K=yWN 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 literal 0 HcmV?d00001 diff --git a/tutorials/introduction-to-groups-and-communicators/comm_split.pptx b/tutorials/introduction-to-groups-and-communicators/comm_split.pptx new file mode 100644 index 0000000000000000000000000000000000000000..151692527c9e423f3e2e6d04f70d6f44e9185436 GIT binary patch literal 50286 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 **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/introduction-to-groups-and-communicators/code]({{ site.github.code }}/tutorials/introduction-to-groups-and-communicators/code). + +## Overview of Communicators +As we have seen when learning about collective routines, MPI allows you to talk to all processes in a communicator at once to do things like distribute data from one process to many processes using `MPI_Scatter` or perform a data reduction using `MPI_Reduce`. However, up to now, we have only used the default communicator, `MPI_COMM_WORLD`. + +For simple applications, it's not unusual to do everything using `MPI_COMM_WORLD`, but for more complex use cases, it might be helpful to have more communicators. An example might be if you wanted to perform calculations on a subset of the processes in a grid. For instance, all processes in each row might want to sum a value. This brings us to the first and most common function used to create new communicators: + +```cpp +MPI_Comm_split( + MPI_Comm comm, + int color, + int key, + MPI_Comm* newcomm) +``` + +As the name implies, `MPI_Comm_split` creates new communicators by "splitting" a communicator into a group of sub-communicators based on the input values `color` and `key`. It's important to note here that the original communicator doesn't go away, but a new communicator is created on each process. The first argument, `comm`, is the communicator that will be used as the basis for the new communicators. This could be `MPI_COMM_WORLD`, but it could be any other communicator as well. The second argument, `color`, determines to which new communicator each processes will belong. All processes which pass in the same value for `color` are assigned to the same communicator. If the `color` is `MPI_UNDEFINED`, that process won't be included in any of the new communicators. The third argument, `key`, determines the ordering (rank) within each new communicator. The process which passes in the smallest value for `color` will be rank 0, the next smallest will be rank 1, and so on. If there is a tie, the process that had the lower rank in the original communicator will be first. The final argument, `newcomm` is how MPI returns the new communicator back to the user. + +## Example of Using Multiple Communicators + +Now let's look at a simple example where we attempt to split a single global communicator into a set of smaller communicators. In this example, we'll imagine that we've logically laid out our original communicator into a 4x4 grid of 16 processes and we want to divide the grid by row. To do this, each row will get its own color. In the image below, you can see how each group of processes with the same color on the left ends up in its own communicator on the right. + +![MPI_Comm_split example](comm_split.png) + +Let's look at the code for this. + +```cpp +// Get the rank and size in the original communicator +int world_rank, world_size; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +int color = world_rank / 4; // Determine color based on row + +// Split the communicator based on the color and use the original rank for ordering +MPI_Comm row_comm; +MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); + +int row_rank, row_size; +MPI_Comm_rank(row_comm, &row_rank); +MPI_Comm_size(row_comm, &row_size); + +printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", + world_rank, world_size, row_rank, row_size); + +MPI_Comm_free(&row_comm); +``` + +The first few lines get the rank and size for the original communicator, `MPI_COMM_WORLD`. The next line does the important operation of determining the "color" of the local process. Remember that color decides to which communciator the process will belong after the split. Next, we see the all important split operation. The new thing here is that we're using the orignal rank (`world_rank`) as the key for the split operation. Since we want all of the processes in the new communicator to be in the same order that they were in the original communicator, using the original rank value makes the most sense here as it will already be ordered correctly. After that, we print out the new rank and size just to make sure it works. Your output should look something like this: + +``` +WORLD RANK/SIZE: 0/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 1/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 2/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 3/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 4/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 5/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 6/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 7/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 8/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 9/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 10/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 11/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 12/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 13/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 14/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 15/16 ROW RANK/SIZE: 3/4 +``` + +Don't be alarmed if your's isn't in the right order. When you print things out in an MPI program, each process has to send its output back to the place where you launched your MPI job before it can be printed to the screen. This tends to mean that the ordering gets jumbled so you can't ever assume that just because you print things in a specific rank order, that the output will actually end up in the same order you expect. The output was just rearranged here to look nice. + +Finally, we free the communicator with `MPI_Comm_free`. This seems like it's not an important step, but it's just as important as freeing your memory when you're done with it in any other program. When an MPI object will no longer be used, it should be freed so it can be reused later. MPI has a limited number of objects that it can create at a time and not freeing your objects could result in a runtime error if MPI runs out of allocatable objects. + +## Other Communicator Creation Functions + +While `MPI_Comm_split` is the most common communicator creation function, there are many others. `MPI_Comm_dup` is the most basic and creates a duplicate of a communicator. It may seem odd that there would exist a function that only creates a copy, but this is very useful for applications which use libraries to perform specialized functions, such as mathematical libraries. In these kinds of applications, it's important that user codes and library codes do not interfere with each other. To avoid this, the first thing every application should do is to create a duplicate of `MPI_COMM_WORLD`, which will avoid the problem of other libraries also using `MPI_COMM_WORLD`. The libraries themselves should also make duplicates of `MPI_COMM_WORLD` to avoid the same problem. + +Another function is `MPI_Comm_create`. At first glance, this function looks very similar to `MPI_Comm_create_group`. Its signature is almost identical: + +```cpp +MPI_Comm_create( + MPI_Comm comm, + MPI_Group group, + MPI_Comm* newcomm) +``` +The key difference however (besides the lack of the `tag` argument), is that `MPI_Comm_create_group` is only collective over the group of processes contained in `group`, where `MPI_Comm_create` is collective over every process in `comm`. This is an important distinction as the size of communicators grows very large. If trying to create a subset of `MPI_COMM_WORLD` when running with 1,000,000 processes, it's important to perform the operation with as few processes as possible as the collective becomes very expensive at large sizes. + +There are other more advanced features of communicators that we do not cover here, such as the differences between inter-communicators and intra-communicators and other advanced communicator creation functions. These are only used in very specific kinds of applications which may be covered in a future tutorial. + +## Overview of Groups + +While `MPI_Comm_split` is the simplest way to create a new communicator, it isn't the only way to do so. There are more flexible ways to create communicators, but they use a new kind of MPI object, `MPI_Group`. Before going into lots of detail about groups, let's look a little more at what a communicator actually is. Internally, MPI has to keep up with (among other things) two major parts of a communicator, the context (or ID) that differentiates one communicator from another and the group of processes contained by the communicator. The context is what prevents an operation on one communicator from matching with a similar operation on another communicator. MPI keeps an ID for each communicator internally to prevent the mixups. The group is a little simpler to understand since it is just the set of all processes in the communicator. For `MPI_COMM_WORLD`, this is all of the processes that were started by `mpiexec`. For other communicators, the group will be different. In the example code above, the group is all of the processes which passed in the same `color` to `MPI_Comm_split`. + +MPI uses these groups in the same way that set theory generally works. You don't have to be familiar with all of set theory to understand things, but it's helpful to know what a two operations mean. Here, instead of referring to "sets", we'll use the term "groups" as it aplies to MPI. First, the union operation creates a new, (potentially) bigger set from two other sets. The new set includes all of the members of the first two sets (without duplicates). Second, the intersection operation creates a new, (potentially) smaller set from two other sets. The new set includes all of the members that are present in both of the original sets. You can see examples of both of these operations graphically below. + +![Group Operation Examples](groups.png) + +In the first example, the union of the two groups `{0, 1, 2, 3}` and `{2, 3, 4, 5}` is `{0, 1, 2, 3, 4, 5}` because each of those items appears in each group. In the second example, the intersection of the two groups `{0, 1, 2, 3}`, and `{2, 3, 4, 5}` is `{2, 3}` because only those items appear in each group. + +## Using MPI Groups + +Now that we understand the fundamentals of how groups work, let's see how they can be applied to MPI operations. In MPI, it's easy to get the group of processes in a communicator with the API call, `MPI_Comm_group`. + +```cpp +MPI_Comm_group( + MPI_Comm comm, + MPI_Group* group) +``` + +As mentioned above, a communicator contains a context, or ID, and a group. Calling `MPI_Comm_group` gets a reference to that group object. The group object works the same way as a communicator object except that you can't use it to communicate with other ranks (because it doesn't have that context attached). You can still get the rank and size for the group (`MPI_Group_rank` and `MPI_Group_size`, respectively). However, what you can do with groups that you can't do with communicators is use it to construct new groups locally. It's important to remember here the difference between a local operation and a remote one. A remote operation involves communication with other ranks where a local operation does not. Creating a new communicator is a remote operation because all processes need to decide on the same context and group, where creating a group is local because it isn't used for communication and therefore doesn't need to have the same context for each process. You can manipulate a group all you like without performing any communication at all. + +Once you have a group or two, performing operations on them is straightforward. Getting the union looks like this: + +```cpp +MPI_Group_union( + MPI_Group group1, + MPI_Group group2, + MPI_Group* newgroup) +``` + +And you can probably guess that the intersection looks like this: + +```cpp +MPI_Group_intersection( + MPI_Group group1, + MPI_Group group2, + MPI_Group* newgroup) +``` + +In both cases, the operation is performed on `group1` and `group2` and the result is stored in `newgroup`. + +There are many uses of groups in MPI. You can compare groups to see if they are the same, subtract one group from another, exclude specific ranks from a group, or use a group to translate the ranks of one group to another group. However, one of the recent additions to MPI that tends to be most useful is `MPI_Comm_create_group`. This is a function to create a new communicator, but instead of doing calculations on the fly to decide the makeup, like `MPI_Comm_split`, this function takes an `MPI_Group` object and creates a new communicator that has all of the same processes as the group. + +```cpp +MPI_Comm_create_group( + MPI_Comm comm, + MPI_Group group, + int tag, + MPI_Comm* newcomm) +) + +## Example of Using Groups + +Let's look at a quick example of what using groups looks like. Here, we'll use another new function which allows you to pick specific ranks in a group and construct a new group containing only those ranks, `MPI_Group_incl`. + +```cpp +MPI_Group_incl( + MPI_Group group, + int n, + const int ranks[], + MPI_Group* newgroup) +``` + +With this function, `newgroup` contains the processes in `group` with ranks contained in `ranks`, which is of size `n`. Want to see how that works? Let's try creating a communicator which contains the prime ranks from `MPI_COMM_WORLD`. + +```cpp +// Get the rank and size in the original communicator +int world_rank, world_size; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +// Get the group of processes in MPI_COMM_WORLD +MPI_Group world_group; +MPI_Comm_group(MPI_COMM_WORLD, &world_group); + +int n = 7; +const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; + +// Construct a group containing all of the prime ranks in world_group +MPI_Group prime_group; +MPI_Group_incl(world_group, 7, ranks, &prime_group); + +// Create a new communicator based on the group +MPI_Comm prime_comm; +MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); + +int prime_rank = -1, prime_size = -1; +// If this rank isn't in the new communicator, it will be MPI_COMM_NULL +// Using MPI_COMM_NULL for MPI_Comm_rank or MPI_Comm_size is erroneous +if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_rank(prime_comm, &prime_rank); + MPI_Comm_size(prime_comm, &prime_size); +} + +printf("WORLD RANK/SIZE: %d/%d \t PRIME RANK/SIZE: %d/%d\n", + world_rank, world_size, prime_rank, prime_size); + +MPI_Group_free(&world_group); +MPI_Group_free(&prime_group); +MPI_Comm_free(&prime_comm); +``` + +In this example, we construct a communicator by selecting only the prime ranks in `MPI_COMM_WORLD`. This is done with `MPI_Group_incl` and results in `prime_group`. Next, we pass that group to `MPI_Comm_create_group` to create `prime_comm`. At the end, we have to be careful to not use `prime_comm` on processes which don't have it, therefore we check to ensure that the communicator is not `MPI_COMM_NULL`, which is returned from `MPI_Comm_create_group` on the ranks not included in `ranks`. diff --git a/tutorials/run.py b/tutorials/run.py index 4b9002d..83afd7c 100755 --- a/tutorials/run.py +++ b/tutorials/run.py @@ -35,6 +35,10 @@ # From the mpi-reduce-and-allreduce tutorial 'reduce_avg': ('mpi-reduce-and-allreduce', 4, ['100']), 'reduce_stddev': ('mpi-reduce-and-allreduce', 4, ['100']), + + # From the groups-and-communicators tutorial + 'split': ('introduction-to-groups-and-communciators', 16), + 'groups': ('introduction-to-groups-and-communciators', 16) } program_to_run = sys.argv[1] if len(sys.argv) > 1 else None From 78f733194ca7e61e3025f0aee8e44c29a763d914 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Mon, 14 Sep 2015 07:58:44 -0700 Subject: [PATCH 022/108] removed the beginner mpit tutorial section and replaced it with the tutorials section --- _config.yml | 2 +- _layouts/post.html | 1 + index.md | 7 ++----- beginner-mpi-tutorial.md => tutorials.md | 11 +++++----- .../index.md | 21 +++++++++++-------- .../index.md | 2 +- .../index.md | 4 ++-- tutorials/mpi-hello-world/index.md | 2 +- tutorials/mpi-reduce-and-allreduce/index.md | 4 ++-- .../mpi-scatter-gather-and-allgather/index.md | 2 +- tutorials/mpi-send-and-receive/index.md | 4 ++-- .../index.md | 2 +- .../index.md | 2 +- .../index.md | 6 +++--- 14 files changed, 36 insertions(+), 34 deletions(-) rename beginner-mpi-tutorial.md => tutorials.md (80%) diff --git a/_config.yml b/_config.yml index 7050a57..dff06a2 100644 --- a/_config.yml +++ b/_config.yml @@ -26,6 +26,6 @@ github: repo: https://github.com/wesleykendall/mpitutorial code: https://github.com/wesleykendall/mpitutorial/tree/gh-pages pages_list: - Beginner Tutorial: 'beginner-mpi-tutorial' + Tutorials: 'tutorials' Recommended Books: 'recommended-books' About: 'about' diff --git a/_layouts/post.html b/_layouts/post.html index 30eb60d..5157bda 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -4,6 +4,7 @@

{{ page.title }}

+ Author: {{ page.author }}
{{ content }} diff --git a/index.md b/index.md index 097ce61..35d5150 100644 --- a/index.md +++ b/index.md @@ -5,11 +5,8 @@ title: A Comprehensive MPI Tutorial Resource Welcome to mpitutorial.com, a website dedicated to providing useful tutorials about the Message Passing Interface (MPI). -## Beginner Tutorial -Wanting to get started learning MPI? Head over to the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). - -## Advanced Tutorial -Ready to dive into something more advanced? Check out the [advanced MPI tutorial]({{ site.baseurl }}/advanced-mpi-tutorial/). +## Tutorials +Wanting to get started learning MPI? Head over to the [MPI tutorials]({{ site.baseurl }}/tutorials/). ## Recommended Books Recommended books for learning MPI are located [here]({{ site.baseurl }}/recommended-books/). diff --git a/beginner-mpi-tutorial.md b/tutorials.md similarity index 80% rename from beginner-mpi-tutorial.md rename to tutorials.md index b821182..cb6db9f 100644 --- a/beginner-mpi-tutorial.md +++ b/tutorials.md @@ -1,11 +1,12 @@ --- layout: page -title: Beginner MPI Tutorial +title: Tutorials +redirect_from: '/beginner-mpi-tutorial/' --- -Welcome to the MPI tutorial for beginners! In this tutorial, you will learn the basic concepts of MPI. Below are the available lessons, each of which contain example code. +Welcome to the MPI tutorials! In these tutorials, you will learn a wide array of concepts about MPI. Below are the available lessons, each of which contain example code. -This beginner tutorial assumes that the reader has a basic knowledge of C, some C++, and Linux. +The tutorials assume that the reader has a basic knowledge of C, some C++, and Linux. ## Introduction and MPI installation * [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) @@ -27,5 +28,5 @@ This beginner tutorial assumes that the reader has a basic knowledge of C, some ## Advanced collective communication * [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) -## Groups and Communicators -* [Introduction to Groups and Communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) +## Groups and communicators +* [Introduction to groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index 43bf3e4..c7720d3 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -11,7 +11,7 @@ In all previous tutorials, we have used the communicator `MPI_COMM_WORLD`. For s > **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/introduction-to-groups-and-communicators/code]({{ site.github.code }}/tutorials/introduction-to-groups-and-communicators/code). -## Overview of Communicators +## Overview of communicators As we have seen when learning about collective routines, MPI allows you to talk to all processes in a communicator at once to do things like distribute data from one process to many processes using `MPI_Scatter` or perform a data reduction using `MPI_Reduce`. However, up to now, we have only used the default communicator, `MPI_COMM_WORLD`. For simple applications, it's not unusual to do everything using `MPI_COMM_WORLD`, but for more complex use cases, it might be helpful to have more communicators. An example might be if you wanted to perform calculations on a subset of the processes in a grid. For instance, all processes in each row might want to sum a value. This brings us to the first and most common function used to create new communicators: @@ -26,7 +26,7 @@ MPI_Comm_split( As the name implies, `MPI_Comm_split` creates new communicators by "splitting" a communicator into a group of sub-communicators based on the input values `color` and `key`. It's important to note here that the original communicator doesn't go away, but a new communicator is created on each process. The first argument, `comm`, is the communicator that will be used as the basis for the new communicators. This could be `MPI_COMM_WORLD`, but it could be any other communicator as well. The second argument, `color`, determines to which new communicator each processes will belong. All processes which pass in the same value for `color` are assigned to the same communicator. If the `color` is `MPI_UNDEFINED`, that process won't be included in any of the new communicators. The third argument, `key`, determines the ordering (rank) within each new communicator. The process which passes in the smallest value for `color` will be rank 0, the next smallest will be rank 1, and so on. If there is a tie, the process that had the lower rank in the original communicator will be first. The final argument, `newcomm` is how MPI returns the new communicator back to the user. -## Example of Using Multiple Communicators +## Example of using multiple communicators Now let's look at a simple example where we attempt to split a single global communicator into a set of smaller communicators. In this example, we'll imagine that we've logically laid out our original communicator into a 4x4 grid of 16 processes and we want to divide the grid by row. To do this, each row will get its own color. In the image below, you can see how each group of processes with the same color on the left ends up in its own communicator on the right. @@ -42,7 +42,8 @@ MPI_Comm_size(MPI_COMM_WORLD, &world_size); int color = world_rank / 4; // Determine color based on row -// Split the communicator based on the color and use the original rank for ordering +// Split the communicator based on the color and use the +// original rank for ordering MPI_Comm row_comm; MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); @@ -81,7 +82,7 @@ Don't be alarmed if your's isn't in the right order. When you print things out i Finally, we free the communicator with `MPI_Comm_free`. This seems like it's not an important step, but it's just as important as freeing your memory when you're done with it in any other program. When an MPI object will no longer be used, it should be freed so it can be reused later. MPI has a limited number of objects that it can create at a time and not freeing your objects could result in a runtime error if MPI runs out of allocatable objects. -## Other Communicator Creation Functions +## Other communicator creation functions While `MPI_Comm_split` is the most common communicator creation function, there are many others. `MPI_Comm_dup` is the most basic and creates a duplicate of a communicator. It may seem odd that there would exist a function that only creates a copy, but this is very useful for applications which use libraries to perform specialized functions, such as mathematical libraries. In these kinds of applications, it's important that user codes and library codes do not interfere with each other. To avoid this, the first thing every application should do is to create a duplicate of `MPI_COMM_WORLD`, which will avoid the problem of other libraries also using `MPI_COMM_WORLD`. The libraries themselves should also make duplicates of `MPI_COMM_WORLD` to avoid the same problem. @@ -97,7 +98,7 @@ The key difference however (besides the lack of the `tag` argument), is that `MP There are other more advanced features of communicators that we do not cover here, such as the differences between inter-communicators and intra-communicators and other advanced communicator creation functions. These are only used in very specific kinds of applications which may be covered in a future tutorial. -## Overview of Groups +## Overview of groups While `MPI_Comm_split` is the simplest way to create a new communicator, it isn't the only way to do so. There are more flexible ways to create communicators, but they use a new kind of MPI object, `MPI_Group`. Before going into lots of detail about groups, let's look a little more at what a communicator actually is. Internally, MPI has to keep up with (among other things) two major parts of a communicator, the context (or ID) that differentiates one communicator from another and the group of processes contained by the communicator. The context is what prevents an operation on one communicator from matching with a similar operation on another communicator. MPI keeps an ID for each communicator internally to prevent the mixups. The group is a little simpler to understand since it is just the set of all processes in the communicator. For `MPI_COMM_WORLD`, this is all of the processes that were started by `mpiexec`. For other communicators, the group will be different. In the example code above, the group is all of the processes which passed in the same `color` to `MPI_Comm_split`. @@ -107,7 +108,7 @@ MPI uses these groups in the same way that set theory generally works. You don't In the first example, the union of the two groups `{0, 1, 2, 3}` and `{2, 3, 4, 5}` is `{0, 1, 2, 3, 4, 5}` because each of those items appears in each group. In the second example, the intersection of the two groups `{0, 1, 2, 3}`, and `{2, 3, 4, 5}` is `{2, 3}` because only those items appear in each group. -## Using MPI Groups +## Using MPI groups Now that we understand the fundamentals of how groups work, let's see how they can be applied to MPI operations. In MPI, it's easy to get the group of processes in a communicator with the API call, `MPI_Comm_group`. @@ -148,8 +149,9 @@ MPI_Comm_create_group( int tag, MPI_Comm* newcomm) ) +``` -## Example of Using Groups +## Example of using groups Let's look at a quick example of what using groups looks like. Here, we'll use another new function which allows you to pick specific ranks in a group and construct a new group containing only those ranks, `MPI_Group_incl`. @@ -185,8 +187,9 @@ MPI_Comm prime_comm; MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); int prime_rank = -1, prime_size = -1; -// If this rank isn't in the new communicator, it will be MPI_COMM_NULL -// Using MPI_COMM_NULL for MPI_Comm_rank or MPI_Comm_size is erroneous +// If this rank isn't in the new communicator, it will be +// MPI_COMM_NULL. Using MPI_COMM_NULL for MPI_Comm_rank or +// MPI_Comm_size is erroneous if (MPI_COMM_NULL != prime_comm) { MPI_Comm_rank(prime_comm, &prime_rank); MPI_Comm_size(prime_comm, &prime_size); diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index e5878d9..065d9be 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -160,4 +160,4 @@ starcluster terminate mpicluster The difference between a "stopped" and "terminated" cluster is that stopped clusters still reside as images on Amazon's Elastic Block Store (EBS). If you will not be starting your cluster again in the foreseeable future, it is recommended to go ahead and terminate the cluster since Amazon EBS payment rates apply to stored instances. As always, educate yourself on [Amazon EC2 Pricing](http://aws.amazon.com/ec2/pricing/) before getting started. ## Ready to run MPI programs on your cluster? -Now that you have your very own cluster, it's time to start running MPI programs. To get started, check out how to compile and run an [MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/). If you want to try the same by building a local cluster, go through [running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan) tutorial. For all beginner lessons, check out the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). If you had any trouble with the lesson, please leave your comment below so that we can try to figure out what went wrong. Happy coding! +Now that you have your very own cluster, it's time to start running MPI programs. To get started, check out how to compile and run an [MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/). If you want to try the same by building a local cluster, go through [running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan) tutorial. For all lessons, check out the [MPI tutorials]({{ site.baseurl }}/tutorials/). If you had any trouble with the lesson, please leave your comment below so that we can try to figure out what went wrong. Happy coding! diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index cea903b..aca5741 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -7,7 +7,7 @@ tags: MPI_Barrier, MPI_Bcast, MPI_Wtime redirect_from: '/mpi-broadcast-and-collective-communication/' --- -So far in the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/), we have examined point-to-point communication, which is communication between two processes. This lesson is the start of the *collective communication* section. Collective communication is a method of communication which involves participation of **all** processes in a communicator. In this lesson, we will discuss the implications of collective communication and go over a standard collective routine - broadcasting. +So far in the [MPI tutorials]({{ site.baseurl }}/tutorials/), we have examined point-to-point communication, which is communication between two processes. This lesson is the start of the *collective communication* section. Collective communication is a method of communication which involves participation of **all** processes in a communicator. In this lesson, we will discuss the implications of collective communication and go over a standard collective routine - broadcasting. > **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-broadcast-and-collective-communication/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code). @@ -156,4 +156,4 @@ Try running the code yourself and experiment at larger scales! ## Conclusions / up next Feel a little better about collective routines? In the [next MPI tutorial]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/), I go over other essential collective communication routines - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/). -For all beginner lessons, go the the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). \ No newline at end of file +For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorial/) page. \ No newline at end of file diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index b8085a1..9efd13e 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -170,6 +170,6 @@ Hello world from processor cetus1, rank 1 out of 4 processors ``` ## Up next -Now that you have a basic understanding of how an MPI program is executed, it is now time to learn fundamental point-to-point communication routines. In the next lesson, I cover [basic sending and receiving routines in MPI]({{ site.baseurl }}/tutorials/mpi-send-and-receive/). Feel free to also examine the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) for a complete reference of all of the beginning MPI lessons. +Now that you have a basic understanding of how an MPI program is executed, it is now time to learn fundamental point-to-point communication routines. In the next lesson, I cover [basic sending and receiving routines in MPI]({{ site.baseurl }}/tutorials/mpi-send-and-receive/). Feel free to also examine the [MPI tutorials]({{ site.baseurl }}/tutorials/) for a complete reference of all of the MPI lessons. Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. diff --git a/tutorials/mpi-reduce-and-allreduce/index.md b/tutorials/mpi-reduce-and-allreduce/index.md index cb5ad4a..e64b53f 100644 --- a/tutorials/mpi-reduce-and-allreduce/index.md +++ b/tutorials/mpi-reduce-and-allreduce/index.md @@ -175,6 +175,6 @@ Mean - 0.501100, Standard deviation = 0.301126 ``` ## Up next -Now that you are comfortable using all of the common collectives - `MPI_Bcast`, `MPI_Scatter`, `MPI_Gather`, and `MPI_Reduce`, we can utilize them to build a sophisticated parallel application. In the next lesson, we will utilize most of our collective routines to create a parallel sorting application. Stay tuned! +Now that you are comfortable using all of the common collectives - `MPI_Bcast`, `MPI_Scatter`, `MPI_Gather`, and `MPI_Reduce`, we can utilize them to build a sophisticated parallel application. In the next lesson, we will start diving into [MPI groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/). -For all beginner lessons, go the the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). \ No newline at end of file +For all lessons, go the the [MPI tutorials section]({{ site.baseurl }}/tutorials/). \ No newline at end of file diff --git a/tutorials/mpi-scatter-gather-and-allgather/index.md b/tutorials/mpi-scatter-gather-and-allgather/index.md index 70074df..727c38d 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/index.md +++ b/tutorials/mpi-scatter-gather-and-allgather/index.md @@ -153,4 +153,4 @@ As you may have noticed, the only difference between all_avg.c and avg.c is that ## Up next In the next lesson, I cover an application example of using `MPI_Gather` and `MPI_Scatter` to [perform parallel rank computation]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/). -For all beginner lessons, go the the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). \ No newline at end of file +For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorials/). \ No newline at end of file diff --git a/tutorials/mpi-send-and-receive/index.md b/tutorials/mpi-send-and-receive/index.md index e436411..e4d3daa 100644 --- a/tutorials/mpi-send-and-receive/index.md +++ b/tutorials/mpi-send-and-receive/index.md @@ -62,7 +62,7 @@ The `MPI_Send` and `MPI_Recv` functions utilize MPI Datatypes as a means to spec | MPI_LONG_DOUBLE | long double | | MPI_BYTE | char | -For now, we will only make use of these datatypes in the beginner MPI tutorial. Once we have covered enough basics, you will learn how to create your own MPI datatypes for characterizing more complex types of messages. +For now, we will only make use of these datatypes in the following MPI tutorials in the beginner category. Once we have covered enough basics, you will learn how to create your own MPI datatypes for characterizing more complex types of messages. ## MPI send / recv program As stated in the beginning, the code for this is available on [Github]({{ site.github.repo }}), and this tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). @@ -197,6 +197,6 @@ As we can see, process zero first sends a value of negative one to process one. ## Up next -Now that you have a basic understanding of `MPI_Send` and `MPI_Recv`, it is now time to go a little bit deeper into these functions. In the next lesson, I cover [how to probe and dynamically receive messages]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/). Feel free to also examine the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) for a complete reference of all of the beginning MPI lessons. +Now that you have a basic understanding of `MPI_Send` and `MPI_Recv`, it is now time to go a little bit deeper into these functions. In the next lesson, I cover [how to probe and dynamically receive messages]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/). Feel free to also examine the [MPI tutorials]({{ site.baseurl }}/tutorials/) for a complete reference of all of the MPI lessons. Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index 60a0dce..26ad14f 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -207,4 +207,4 @@ Rank for 0.684195 on process 3 - 1 ## Up next In our next lesson, we start covering advanced collective communication. The next lesson is about [using MPI_Reduce and MPI_Allreduce to perform number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/). -For all beginner lessons, go the the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). +For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorials/). diff --git a/tutorials/point-to-point-communication-application-random-walk/index.md b/tutorials/point-to-point-communication-application-random-walk/index.md index c0794aa..13d5f7c 100644 --- a/tutorials/point-to-point-communication-application-random-walk/index.md +++ b/tutorials/point-to-point-communication-application-random-walk/index.md @@ -281,7 +281,7 @@ The output continues until processes finish all sending and receiving of all wal ## So what's next? If you have made it through this entire application and feel comfortable, then good! This application is quite advanced for a first real application. -Next, we will start learning about *collective* communication in MPI. We will start off by going over [MPI Broadcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/). For all beginner lessons, go to the [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/). +Next, we will start learning about *collective* communication in MPI. We will start off by going over [MPI Broadcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/). For all lessons, go to the [MPI tutorials]({{ site.baseurl }}/tutorials/). Also, at the beginning, I told you that the concepts of this program are applicable to many parallel programs. I don't want to leave you hanging, so I have included some additional reading material below for anyone that wishes to learn more. Enjoy :-) diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index 59f95b3..471a55c 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -163,7 +163,7 @@ $ cat /etc/fstab master:/home/mpiuser/cloud /home/mpiuser/cloud nfs ``` -## Step 5: Running MPI Programs +## Step 5: Running MPI programs For consideration sake, let's just take a sample program, that comes along with MPICH2 installation package ```mpich2/examples/cpi```. We shall take this executable and try to run it parallely. @@ -202,7 +202,7 @@ $ mpirun -np 5 --hostfile mpi_file ./cpi This should spin up your program in all of the machines that your **master** is connected to. -##Common errors and tips +## Common errors and tips * Make sure all the machines you are trying to run the executable on, has the same version of MPI. Recommended is [MPICH2](http://www.mpich.org/downloads/). * The ```hosts``` file of ```master``` should contain the local network IP address entries of ```master``` and all of the slave nodes. For each of the slave, you need to have the IP address entry of ```master``` and the corresponding slave node. @@ -258,7 +258,7 @@ $ mpirun -np 10 --hosts slave1 ./cpi ## So, what's next? -Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other beginner lessons, you may go to [beginner MPI tutorial]({{ site.baseurl }}/beginner-mpi-tutorial/) page. +Exciting isn't it, for having built a cluster to run your code? You now need to know the specifics of writing a program that can run parallely. Best place to start off would be the lesson [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/). Or if you want to replicate the same using Amazon EC2 instances, I suggest you have a look at [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). For all the other lessons, you may go to the [MPI tutorials]({{ site.baseurl }}/tutorials/) page. Should you have any issues in setting up your local cluster, please don't hesitate to comment below so we can try to sort it out. From 75fc97256c6cafc0343d10d95360ce2917569e24 Mon Sep 17 00:00:00 2001 From: Chiu-Hsiang Hsu Date: Wed, 2 Dec 2015 23:00:32 +0800 Subject: [PATCH 023/108] fix typo --- .../dynamic-receiving-with-mpi-probe-and-mpi-status/index.md | 2 +- tutorials/mpi-broadcast-and-collective-communication/index.md | 2 +- tutorials/mpi-reduce-and-allreduce/index.md | 2 +- tutorials/mpi-scatter-gather-and-allgather/index.md | 2 +- tutorials/performing-parallel-rank-with-mpi/index.md | 2 +- .../index.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md index 9c9c87b..bcf7c77 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md @@ -9,7 +9,7 @@ redirect_from: '/dynamic-receiving-with-mpi-probe-and-mpi-status/' In the [previous lesson]({{ site.baseurl }}/tutorials/mpi-send-and-receive/), I discussed how to use MPI_Send and MPI_Recv to perform standard point-to-point communication. I only covered how to send messages in which the length of the message was known beforehand. Although it is possible to send the length of the message as a separate send / recv operation, MPI natively supports dynamic messages with just a few additional function calls. I will be going over how to use these functions in this lesson. -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code). ## The MPI_Status structure As covered in the [previous lesson]({{ site.baseurl }}/tutorials/mpi-send-and-receive/), the `MPI_Recv` operation takes the address of an `MPI_Status` structure as an argument (which can be ignored with `MPI_STATUS_IGNORE`). If we pass an `MPI_Status` structure to the `MPI_Recv` function, it will be populated with additional information about the receive operation after it completes. The three primary pieces of information include: diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index aca5741..7cedf16 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -9,7 +9,7 @@ redirect_from: '/mpi-broadcast-and-collective-communication/' So far in the [MPI tutorials]({{ site.baseurl }}/tutorials/), we have examined point-to-point communication, which is communication between two processes. This lesson is the start of the *collective communication* section. Collective communication is a method of communication which involves participation of **all** processes in a communicator. In this lesson, we will discuss the implications of collective communication and go over a standard collective routine - broadcasting. -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-broadcast-and-collective-communication/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-broadcast-and-collective-communication/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code). ## Collective communication and synchronization points One of the things to remember about collective communication is that it implies a *synchronization point* among processes. This means that all processes must reach a point in their code before they can all begin executing again. diff --git a/tutorials/mpi-reduce-and-allreduce/index.md b/tutorials/mpi-reduce-and-allreduce/index.md index e64b53f..b808cab 100644 --- a/tutorials/mpi-reduce-and-allreduce/index.md +++ b/tutorials/mpi-reduce-and-allreduce/index.md @@ -9,7 +9,7 @@ redirect_from: '/mpi-reduce-and-allreduce/' In the [previous lesson]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi), we went over an application example of using `MPI_Scatter` and `MPI_Gather` to perform parallel rank computation with MPI. We are going to expand on collective communication routines even more in this lesson by going over `MPI_Reduce` and `MPI_Allreduce`. -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-reduce-and-allreduce/code]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-reduce-and-allreduce/code]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code). ## An introduction to reduce *Reduce* is a classic concept from functional programming. Data reduction involves reducing a set of numbers into a smaller set of numbers via a function. For example, let's say we have a list of numbers `[1, 2, 3, 4, 5]`. Reducing this list of numbers with the sum function would produce `sum([1, 2, 3, 4, 5]) = 15`. Similarly, the multiplication reduction would yield `multiply([1, 2, 3, 4, 5]) = 120`. diff --git a/tutorials/mpi-scatter-gather-and-allgather/index.md b/tutorials/mpi-scatter-gather-and-allgather/index.md index 727c38d..b355a2b 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/index.md +++ b/tutorials/mpi-scatter-gather-and-allgather/index.md @@ -9,7 +9,7 @@ redirect_from: '/mpi-scatter-gather-and-allgather/' In the [previous lesson]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/), we went over the essentials of collective communication. We covered the most basic collective communication routine - `MPI_Bcast`. In this lesson, we are going to expand on collective communication routines by going over two very important routines - `MPI_Scatter` and `MPI_Gather`. We will also cover a variant of `MPI_Gather`, known as `MPI_Allgather`. -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-scatter-gather-and-allgather/code]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-scatter-gather-and-allgather/code]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code). ## An introduction to MPI_Scatter `MPI_Scatter` is a collective routine that is very similar to `MPI_Bcast` (If you are unfamiliar with these terms, please read the [previous lesson]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/)). `MPI_Scatter` involves a designated root process sending data to all processes in a communicator. The primary difference between `MPI_Bcast` and `MPI_Scatter` is small but important. `MPI_Bcast` sends the *same* piece of data to all processes while `MPI_Scatter` sends *chunks of an array* to different processes. Check out the illustration below for further clarification. diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index 26ad14f..dddceb5 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -9,7 +9,7 @@ redirect_from: '/performing-parallel-rank-with-mpi/' In the [previous lesson]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/), we went over `MPI_Scatter`, `MPI_Gather`, and `MPI_Allgather`. We are going to expand on basic collectives in this lesson by coding a useful function for your MPI toolkit - parallel rank. -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/performing-parallel-rank-with-mpi/code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/performing-parallel-rank-with-mpi/code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code). ## Parallel rank - problem overview When processes all have a single number stored in their local memory, it can be useful to know what order their number is in respect to the entire set of numbers contained by all processes. For example, a user might be benchmarking the processors in an MPI cluster and want to know the order of how fast each processor relative to the others. This information can be used for scheduling tasks and so on. As you can imagine, it is rather difficult to find out a number's order in the context of all other numbers if they are spread across processes. This problem - the parallel rank problem - is what we are going to solve in this lesson. diff --git a/tutorials/point-to-point-communication-application-random-walk/index.md b/tutorials/point-to-point-communication-application-random-walk/index.md index 13d5f7c..63141f5 100644 --- a/tutorials/point-to-point-communication-application-random-walk/index.md +++ b/tutorials/point-to-point-communication-application-random-walk/index.md @@ -9,7 +9,7 @@ redirect_from: '/point-to-point-communication-application-random-walk/' It's time to go through an application example using some of the concepts introduced in the [sending and receiving tutorial]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) and the [MPI_Probe and MPI_Status lesson]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/). The application simulates a process which I refer to as "random walking." -> **Note** - All of the code for this site is on [Gitub]({{ site.github.repo }}). This tutorial's code is under [tutorials/point-to-point-communication-application-random-walk/code]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/point-to-point-communication-application-random-walk/code]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code). The basic problem definition of a random walk is as follows. Given a *Min*, *Max*, and random walker *W*, make walker *W* take *S* random walks of arbitrary length to the right. If the process goes out of bounds, it wraps back around. *S* can only move one unit to the right or left at a time. From 55ae43db9ee6910173aac13b5386b69e8737e759 Mon Sep 17 00:00:00 2001 From: Greg Brant Date: Sat, 5 Dec 2015 20:22:16 +0000 Subject: [PATCH 024/108] Fixed tiny typo I think this is a miniature typo in the description of the problem but it's quite misleading. --- .../index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/point-to-point-communication-application-random-walk/index.md b/tutorials/point-to-point-communication-application-random-walk/index.md index 63141f5..9ffa56f 100644 --- a/tutorials/point-to-point-communication-application-random-walk/index.md +++ b/tutorials/point-to-point-communication-application-random-walk/index.md @@ -11,7 +11,7 @@ It's time to go through an application example using some of the concepts introd > **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/point-to-point-communication-application-random-walk/code]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code). -The basic problem definition of a random walk is as follows. Given a *Min*, *Max*, and random walker *W*, make walker *W* take *S* random walks of arbitrary length to the right. If the process goes out of bounds, it wraps back around. *S* can only move one unit to the right or left at a time. +The basic problem definition of a random walk is as follows. Given a *Min*, *Max*, and random walker *W*, make walker *W* take *S* random walks of arbitrary length to the right. If the process goes out of bounds, it wraps back around. *W* can only move one unit to the right or left at a time. ![Random walk illustration](random_walk.png) @@ -300,4 +300,4 @@ In this illustration, we see that the domain is split among six process. Particl The parallel particle tracing problem can be solved with `MPI_Send`, `MPI_Recv`, and `MPI_Probe` in a similar manner to our application that we just coded. There are, however, much more sophisticated MPI routines that can get the job done more efficiently. We will talk about these in the coming lessons :-) -I hope you can now see at least one example of how the random walk problem is similar to other parallel applications! \ No newline at end of file +I hope you can now see at least one example of how the random walk problem is similar to other parallel applications! From 4f9faf6cac2692944dbd4433c1d9320c8dc7d23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Setton?= Date: Thu, 10 Dec 2015 17:44:30 -0200 Subject: [PATCH 025/108] Typo fix: Global replace of "in tact" with "intact" Obs: some trailing whitespaces were also removed on the process. --- .../code/check_status.c | 2 +- .../code/probe.c | 2 +- .../code/groups.c | 2 +- .../introduction-to-groups-and-communicators/code/split.c | 2 +- tutorials/mpi-alltoall-and-v-routines/code/bin.c | 8 ++++---- .../code/compare_bcast.c | 2 +- .../code/my_bcast.c | 2 +- tutorials/mpi-hello-world/code/mpi_hello_world.c | 2 +- tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c | 6 +++--- tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c | 6 +++--- tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c | 8 ++++---- tutorials/mpi-scatter-gather-and-allgather/code/avg.c | 8 ++++---- tutorials/mpi-send-and-receive/code/ping_pong.c | 4 ++-- tutorials/mpi-send-and-receive/code/ring.c | 2 +- tutorials/mpi-send-and-receive/code/send_recv.c | 4 ++-- .../performing-parallel-rank-with-mpi/code/random_rank.c | 2 +- .../performing-parallel-rank-with-mpi/code/tmpi_rank.c | 6 +++--- .../performing-parallel-rank-with-mpi/code/tmpi_rank.h | 2 +- tutorials/performing-parallel-rank-with-mpi/index.md | 6 +++--- .../code/random_walk.cc | 2 +- 20 files changed, 39 insertions(+), 39 deletions(-) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c index 9d868f2..ebd157b 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Example of checking the MPI_Status object from an MPI_Recv call // diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c index 7adb9ce..e994b77 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Example of using MPI_Probe to dynamically allocated received messages // diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups.c b/tutorials/introduction-to-groups-and-communicators/code/groups.c index c6b46fb..ea2cb69 100644 --- a/tutorials/introduction-to-groups-and-communicators/code/groups.c +++ b/tutorials/introduction-to-groups-and-communicators/code/groups.c @@ -2,7 +2,7 @@ // Copyright 2015 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Example using MPI_Comm_split to divide a communicator into subcommunicators // diff --git a/tutorials/introduction-to-groups-and-communicators/code/split.c b/tutorials/introduction-to-groups-and-communicators/code/split.c index 9566911..6d307e8 100644 --- a/tutorials/introduction-to-groups-and-communicators/code/split.c +++ b/tutorials/introduction-to-groups-and-communicators/code/split.c @@ -2,7 +2,7 @@ // Copyright 2015 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Example using MPI_Comm_split to divide a communicator into subcommunicators // diff --git a/tutorials/mpi-alltoall-and-v-routines/code/bin.c b/tutorials/mpi-alltoall-and-v-routines/code/bin.c index 448ba00..cf166a5 100644 --- a/tutorials/mpi-alltoall-and-v-routines/code/bin.c +++ b/tutorials/mpi-alltoall-and-v-routines/code/bin.c @@ -2,7 +2,7 @@ // Copyright 2014 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // A program that bins random numbers using MPI_Alltoallv. // @@ -58,7 +58,7 @@ int *get_send_amounts_per_proc(float *rand_nums, int numbers_per_proc, for (i = 0; i < numbers_per_proc; i++) { int owning_rank = which_process_owns_this_number(rand_nums[i], world_size); send_amounts_per_proc[owning_rank]++; - } + } return send_amounts_per_proc; } @@ -157,7 +157,7 @@ int main(int argc, char** argv) { // when they are binned from this process. int *send_amounts_per_proc = get_send_amounts_per_proc(rand_nums, numbers_per_proc, - world_size); + world_size); // Determine how many numbers you will receive from each process. This // information is needed to set up the binning call. @@ -178,7 +178,7 @@ int main(int argc, char** argv) { // are ordered by bin. For simplicity, we are simply going to sort the random // numbers, however, this could be optimized since the numbers don't need to be // fully sorted. - qsort(rand_nums, numbers_per_proc, sizeof(float), &compare_float); + qsort(rand_nums, numbers_per_proc, sizeof(float), &compare_float); // Perform the binning step with MPI_Alltoallv. This will send all of the numbers in // the rand_nums array to their proper bin. Each process will only contain numbers diff --git a/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c b/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c index c53e405..db99e96 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c +++ b/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Comparison of MPI_Bcast with the my_bcast function // diff --git a/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c b/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c index 7140c5b..b632a07 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c +++ b/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // An example of a function that implements MPI_Bcast using MPI_Send and // MPI_Recv diff --git a/tutorials/mpi-hello-world/code/mpi_hello_world.c b/tutorials/mpi-hello-world/code/mpi_hello_world.c index 5bd3032..ea1ce89 100644 --- a/tutorials/mpi-hello-world/code/mpi_hello_world.c +++ b/tutorials/mpi-hello-world/code/mpi_hello_world.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // An intro MPI hello world program that uses MPI_Init, MPI_Comm_size, // MPI_Comm_rank, MPI_Finalize, and MPI_Get_processor_name. diff --git a/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c b/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c index 11c04a8..8829e80 100644 --- a/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c +++ b/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c @@ -2,7 +2,7 @@ // Copyright 2013 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Program that computes the average of an array of elements in parallel using // MPI_Reduce. @@ -11,7 +11,7 @@ #include #include #include - + // Creates an array of random numbers. Each number has a value from 0 - 1 float *create_rand_nums(int num_elements) { float *rand_nums = (float *)malloc(sizeof(float) * num_elements); @@ -67,7 +67,7 @@ int main(int argc, char** argv) { // Clean up free(rand_nums); - + MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); } diff --git a/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c b/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c index 54bb6cc..4560d37 100644 --- a/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c +++ b/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c @@ -2,7 +2,7 @@ // Copyright 2013 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Program that computes the standard deviation of an array of elements in parallel using // MPI_Reduce. @@ -12,7 +12,7 @@ #include #include #include - + // Creates an array of random numbers. Each number has a value from 0 - 1 float *create_rand_nums(int num_elements) { float *rand_nums = (float *)malloc(sizeof(float) * num_elements); @@ -80,7 +80,7 @@ int main(int argc, char** argv) { // Clean up free(rand_nums); - + MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); } diff --git a/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c b/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c index 981773d..f6d5570 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c +++ b/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c @@ -2,7 +2,7 @@ // Copyright 2012 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Program that computes the average of an array of elements in parallel using // MPI_Scatter and MPI_Allgather @@ -11,7 +11,7 @@ #include #include #include - + // Creates an array of random numbers. Each number has a value from 0 - 1 float *create_rand_nums(int num_elements) { float *rand_nums = (float *)malloc(sizeof(float) * num_elements); @@ -70,7 +70,7 @@ int main(int argc, char** argv) { // Compute the average of your subset float sub_avg = compute_avg(sub_rand_nums, num_elements_per_proc); - + // Gather all partial averages down to all the processes float *sub_avgs = (float *)malloc(sizeof(float) * world_size); assert(sub_avgs != NULL); @@ -89,7 +89,7 @@ int main(int argc, char** argv) { } free(sub_avgs); free(sub_rand_nums); - + MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); } diff --git a/tutorials/mpi-scatter-gather-and-allgather/code/avg.c b/tutorials/mpi-scatter-gather-and-allgather/code/avg.c index ebb650a..6433471 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/code/avg.c +++ b/tutorials/mpi-scatter-gather-and-allgather/code/avg.c @@ -2,7 +2,7 @@ // Copyright 2012 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Program that computes the average of an array of elements in parallel using // MPI_Scatter and MPI_Gather @@ -11,7 +11,7 @@ #include #include #include - + // Creates an array of random numbers. Each number has a value from 0 - 1 float *create_rand_nums(int num_elements) { float *rand_nums = (float *)malloc(sizeof(float) * num_elements); @@ -70,7 +70,7 @@ int main(int argc, char** argv) { // Compute the average of your subset float sub_avg = compute_avg(sub_rand_nums, num_elements_per_proc); - + // Gather all partial averages down to the root process float *sub_avgs = NULL; if (world_rank == 0) { @@ -98,7 +98,7 @@ int main(int argc, char** argv) { free(sub_avgs); } free(sub_rand_nums); - + MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); } diff --git a/tutorials/mpi-send-and-receive/code/ping_pong.c b/tutorials/mpi-send-and-receive/code/ping_pong.c index fe134fc..665b0c1 100644 --- a/tutorials/mpi-send-and-receive/code/ping_pong.c +++ b/tutorials/mpi-send-and-receive/code/ping_pong.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Ping pong example with MPI_Send and MPI_Recv. Two processes ping pong a // number back and forth, incrementing it until it reaches a given value. @@ -25,7 +25,7 @@ int main(int argc, char** argv) { // We are assuming at least 2 processes for this task if (world_size != 2) { fprintf(stderr, "World size must be two for %s\n", argv[0]); - MPI_Abort(MPI_COMM_WORLD, 1); + MPI_Abort(MPI_COMM_WORLD, 1); } int ping_pong_count = 0; diff --git a/tutorials/mpi-send-and-receive/code/ring.c b/tutorials/mpi-send-and-receive/code/ring.c index 1211de1..8f6ab35 100644 --- a/tutorials/mpi-send-and-receive/code/ring.c +++ b/tutorials/mpi-send-and-receive/code/ring.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Example using MPI_Send and MPI_Recv to pass a message around in a ring. // diff --git a/tutorials/mpi-send-and-receive/code/send_recv.c b/tutorials/mpi-send-and-receive/code/send_recv.c index 0c9340f..1fa7023 100644 --- a/tutorials/mpi-send-and-receive/code/send_recv.c +++ b/tutorials/mpi-send-and-receive/code/send_recv.c @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // MPI_Send, MPI_Recv example. Communicates the number -1 from process 0 // to processe 1. @@ -23,7 +23,7 @@ int main(int argc, char** argv) { // We are assuming at least 2 processes for this task if (world_size < 2) { fprintf(stderr, "World size must be greater than 1 for %s\n", argv[0]); - MPI_Abort(MPI_COMM_WORLD, 1); + MPI_Abort(MPI_COMM_WORLD, 1); } int number; diff --git a/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c b/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c index 72d4105..6854536 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c +++ b/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c @@ -2,7 +2,7 @@ // Copyright 2013 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Runs the TMPI_Rank function with random input. // diff --git a/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c index 6dd61aa..2dd1634 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c +++ b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c @@ -2,7 +2,7 @@ // Copyright 2013 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Code that performs a parallel rank // @@ -12,7 +12,7 @@ // Holds the communicator rank of a process along with the corresponding number. // This struct is used for sorting the values and keeping the owning process information -// in tact. +// intact. typedef struct { int comm_rank; union { @@ -77,7 +77,7 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, MPI_Datatype d // Convert the gathered number array to an array of CommRankNumbers. This allows us to // sort the numbers and also keep the information of the processes that own the numbers - // in tact. + // intact. CommRankNumber *comm_rank_numbers = malloc(gathered_number_count * sizeof(CommRankNumber)); int i; for (i = 0; i < gathered_number_count; i++) { diff --git a/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h index ce21670..ae0efb3 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h +++ b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.h @@ -2,7 +2,7 @@ // Copyright 2013 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Header file for TMPI_Rank // diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index dddceb5..5493cf0 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -77,7 +77,7 @@ In order to facilitate attaching the owning process to the numbers, we create a // Holds the communicator rank of a process along with the // corresponding number. This struct is used for sorting // the values and keeping the owning process information -// in tact. +// intact. typedef struct { int comm_rank; union { @@ -102,7 +102,7 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, // Convert the gathered number array to an array of CommRankNumbers. // This allows us to sort the numbers and also keep the information - // of the processes that own the numbers in tact. + // of the processes that own the numbers intact. CommRankNumber *comm_rank_numbers = malloc( gathered_number_count * sizeof(CommRankNumber)); int i; @@ -145,7 +145,7 @@ Now that we have our two primary functions, we can put them all together into ou ```cpp // Gets the rank of the recv_data, which is of type datatype. The rank -// is returned in send_data and is of type datatype. +// is returned in send_data and is of type datatype. int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { // Check base cases first - Only support MPI_INT and MPI_FLOAT for diff --git a/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc b/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc index c32584b..84b308e 100644 --- a/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc +++ b/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc @@ -2,7 +2,7 @@ // Copyright 2011 www.mpitutorial.com // This code is provided freely with the tutorials on mpitutorial.com. Feel // free to modify it for your own use. Any distribution of the code must -// either provide a link to www.mpitutorial.com or keep this header in tact. +// either provide a link to www.mpitutorial.com or keep this header intact. // // Example application of random walking using MPI_Send, MPI_Recv, and // MPI_Probe. From e44c1d1f3c1c215769d2cfcd89849cc9d6a15123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Setton?= Date: Thu, 10 Dec 2015 17:53:29 -0200 Subject: [PATCH 026/108] Fix typos --- tutorials/introduction-to-groups-and-communicators/index.md | 6 +++--- tutorials/mpi-send-and-receive/code/send_recv.c | 2 +- tutorials/run.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index c7720d3..7a55f89 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -57,7 +57,7 @@ printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", MPI_Comm_free(&row_comm); ``` -The first few lines get the rank and size for the original communicator, `MPI_COMM_WORLD`. The next line does the important operation of determining the "color" of the local process. Remember that color decides to which communciator the process will belong after the split. Next, we see the all important split operation. The new thing here is that we're using the orignal rank (`world_rank`) as the key for the split operation. Since we want all of the processes in the new communicator to be in the same order that they were in the original communicator, using the original rank value makes the most sense here as it will already be ordered correctly. After that, we print out the new rank and size just to make sure it works. Your output should look something like this: +The first few lines get the rank and size for the original communicator, `MPI_COMM_WORLD`. The next line does the important operation of determining the "color" of the local process. Remember that color decides to which communicator the process will belong after the split. Next, we see the all important split operation. The new thing here is that we're using the orignal rank (`world_rank`) as the key for the split operation. Since we want all of the processes in the new communicator to be in the same order that they were in the original communicator, using the original rank value makes the most sense here as it will already be ordered correctly. After that, we print out the new rank and size just to make sure it works. Your output should look something like this: ``` WORLD RANK/SIZE: 0/16 ROW RANK/SIZE: 0/4 @@ -78,7 +78,7 @@ WORLD RANK/SIZE: 14/16 ROW RANK/SIZE: 2/4 WORLD RANK/SIZE: 15/16 ROW RANK/SIZE: 3/4 ``` -Don't be alarmed if your's isn't in the right order. When you print things out in an MPI program, each process has to send its output back to the place where you launched your MPI job before it can be printed to the screen. This tends to mean that the ordering gets jumbled so you can't ever assume that just because you print things in a specific rank order, that the output will actually end up in the same order you expect. The output was just rearranged here to look nice. +Don't be alarmed if yours isn't in the right order. When you print things out in an MPI program, each process has to send its output back to the place where you launched your MPI job before it can be printed to the screen. This tends to mean that the ordering gets jumbled so you can't ever assume that just because you print things in a specific rank order, that the output will actually end up in the same order you expect. The output was just rearranged here to look nice. Finally, we free the communicator with `MPI_Comm_free`. This seems like it's not an important step, but it's just as important as freeing your memory when you're done with it in any other program. When an MPI object will no longer be used, it should be freed so it can be reused later. MPI has a limited number of objects that it can create at a time and not freeing your objects could result in a runtime error if MPI runs out of allocatable objects. @@ -102,7 +102,7 @@ There are other more advanced features of communicators that we do not cover her While `MPI_Comm_split` is the simplest way to create a new communicator, it isn't the only way to do so. There are more flexible ways to create communicators, but they use a new kind of MPI object, `MPI_Group`. Before going into lots of detail about groups, let's look a little more at what a communicator actually is. Internally, MPI has to keep up with (among other things) two major parts of a communicator, the context (or ID) that differentiates one communicator from another and the group of processes contained by the communicator. The context is what prevents an operation on one communicator from matching with a similar operation on another communicator. MPI keeps an ID for each communicator internally to prevent the mixups. The group is a little simpler to understand since it is just the set of all processes in the communicator. For `MPI_COMM_WORLD`, this is all of the processes that were started by `mpiexec`. For other communicators, the group will be different. In the example code above, the group is all of the processes which passed in the same `color` to `MPI_Comm_split`. -MPI uses these groups in the same way that set theory generally works. You don't have to be familiar with all of set theory to understand things, but it's helpful to know what a two operations mean. Here, instead of referring to "sets", we'll use the term "groups" as it aplies to MPI. First, the union operation creates a new, (potentially) bigger set from two other sets. The new set includes all of the members of the first two sets (without duplicates). Second, the intersection operation creates a new, (potentially) smaller set from two other sets. The new set includes all of the members that are present in both of the original sets. You can see examples of both of these operations graphically below. +MPI uses these groups in the same way that set theory generally works. You don't have to be familiar with all of set theory to understand things, but it's helpful to know what two operations mean. Here, instead of referring to "sets", we'll use the term "groups" as it aplies to MPI. First, the union operation creates a new, (potentially) bigger set from two other sets. The new set includes all of the members of the first two sets (without duplicates). Second, the intersection operation creates a new, (potentially) smaller set from two other sets. The new set includes all of the members that are present in both of the original sets. You can see examples of both of these operations graphically below. ![Group Operation Examples](groups.png) diff --git a/tutorials/mpi-send-and-receive/code/send_recv.c b/tutorials/mpi-send-and-receive/code/send_recv.c index 1fa7023..3c78250 100644 --- a/tutorials/mpi-send-and-receive/code/send_recv.c +++ b/tutorials/mpi-send-and-receive/code/send_recv.c @@ -5,7 +5,7 @@ // either provide a link to www.mpitutorial.com or keep this header intact. // // MPI_Send, MPI_Recv example. Communicates the number -1 from process 0 -// to processe 1. +// to process 1. // #include #include diff --git a/tutorials/run.py b/tutorials/run.py index 83afd7c..f2a407a 100755 --- a/tutorials/run.py +++ b/tutorials/run.py @@ -37,8 +37,8 @@ 'reduce_stddev': ('mpi-reduce-and-allreduce', 4, ['100']), # From the groups-and-communicators tutorial - 'split': ('introduction-to-groups-and-communciators', 16), - 'groups': ('introduction-to-groups-and-communciators', 16) + 'split': ('introduction-to-groups-and-communicators', 16), + 'groups': ('introduction-to-groups-and-communicators', 16) } program_to_run = sys.argv[1] if len(sys.argv) > 1 else None From d18ddc44452fd501aad918d752cd79e8f0d609c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Setton?= Date: Thu, 10 Dec 2015 17:56:07 -0200 Subject: [PATCH 027/108] Include time.h in avg.c and avg_all.c to fix implicit declaration warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both of these files were missing the time.h header, which was causing the following error message on compilation: avg.c: In function ‘main’: avg.c:44:9: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration] srand(time(NULL)); ^ --- .../code/all_avg | Bin 1214660 -> 13800 bytes .../code/all_avg.c | 1 + .../mpi-scatter-gather-and-allgather/code/avg | Bin 1218764 -> 13792 bytes .../code/avg.c | 1 + 4 files changed, 2 insertions(+) diff --git a/tutorials/mpi-scatter-gather-and-allgather/code/all_avg b/tutorials/mpi-scatter-gather-and-allgather/code/all_avg index 041e074ef27a79b651813bc3d7db59708805ea33..0255a598a5d924df42e36fcb72195294f8a82f8a 100755 GIT binary patch literal 13800 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%0D3Kr}xWs_)@g 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

}^eg9WH1xr+9{-zf>8&e^liPui2b# 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

NA5n0?=1%$ul)hCI-FdNaJ`MK*pMjbn=!Q9#kR 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%0D5T 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 Aj{pDw diff --git a/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c b/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c index f6d5570..c7bea7d 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c +++ b/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c @@ -9,6 +9,7 @@ // #include #include +#include #include #include diff --git a/tutorials/mpi-scatter-gather-and-allgather/code/avg b/tutorials/mpi-scatter-gather-and-allgather/code/avg index ffce38777faddaba8b75d42f029711f8182a42cd..749fcb6e7d6ccccfda4a2ab42b3b89efdea00337 100755 GIT binary patch literal 13792 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 S{VbOMQMG~jPg|lr|NjBc4phqk literal 1218764 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�p#wf+2kTKXD}Ca2TjvU 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 P$=aw^%($nCRgz{-x?@C-V0Skad`ioK{tJ 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%0A-Bd zrLqi+7I~c<)~zIQ#;?O4OQVWEo*;=7e;h?3hd&-ESP6gpmRh8tbh$<;CKE)oXgd#w zKOW*eh0v6zGr7v#$eG0eGdpXjusv5@}zG?h1 z7mz?+A?Xx<+$pX<TEv}HQ5|9~avxdZ``HL&xHoFMJkC z8DV;L!u0n29j4dKh^5%xMc2ai-Z+_lK);Z^ZVdO`?*Q9rsMR9)It^t=p(3Vum)oTO z==&T!Z#8_Od36;CKtFS+6=Ll<(mjI+f#pKpATgm8l;02%Z?B+iPj_qE zM^5(_LxjX7e*A}5qmfT$m;ZL%1o}B0(BYRx3uSw zEFI>29`u>7RHxP*{63i2HYvpmVMn*^0J$&?$f$H6zjy&Mmh6cYTvb-RgSR@x5XwBYPXWMQN=Cap1=lk#?rU`aM+q-~ z7+@4Vqh1P(q9@eLAfxEd>Sc&g^r(6%F^V3Nm+~^BOOzK1i0tsly_a1)_bT^Y+`%YF zas_5UuE3=I$CEDpi>l5*zr63(@1^qorGEFy`)1y`>7g@u2Fmw(z9WYZhdXJL)A$7f zI9mEGo*kHgORSCmI3(-xTbY$M6BhH9FqD(RBOPhfC(@`-OQT&%p-aH%tfkRSWf19T z0H&6v*+gr_|MS}qplSGC38M`9A|0C2oTf^z6^4_paga`a6Ybv=p7NVv|K{+NUpY0B-zE0XvES6|yC1&L^Qc-s zpZXPTSWk7~rkjaS^2?t-&y-*4Bu7j6IyvbnuK+A1DEv(TWymiN>atF9a#$CU#F1Yd`LI_+$%lt5 z5K{8t866i`jyu9=njE$;dlid%N7 z%KXSf<%GUh11wdU;Q}awz6H9hdMAhVePJ_w)8s=-Lw-!sDfuu)x|Do)-)As`x9dXTY3pZyVI7l< zPj>Ltk*-hK&O#G*DyC9&{Ovnz`n#C7VtV)Z5-JjuO#VzTq z>RCe6ywVQmzlld$$|Je>+r-rjH^1Va(Tl&$sQXGmL$CQSM11fXn>f*eWi1!}%GT%^ zYPYh>Ig)C656nf-4cvnuOw&a&T!mzuCv*G__K++2#&VSNuyU%|CtR4C7ok`8vjqRs z7`G`ItcVabpAO&3q;@`4vpsIM3w4xPzlYr4Jy`r|iX7M=a^SANGN~V{f(~&$v-~pb z&(*2!*Lu+83^P1n#1imPh+g{TP}QM#^U!WA?!#MXMRd}T3ggQ}nb$mD4wp83uwSj! zUlYuX@tn_+Dva$Le}RCE{Q++K5f)mU6;iuRioCcf~m?SWgAe9|y#rP#~+I&MA07tzaeV_0mj~p6RPlI##1pAbD+m9OONP z(kwvzDnD)q>=ZvPf^-f)j(=j)_c$qMr zSPE}@x!RGCxQLM~K!0^6oKIl#o-mZMm3H3lOJMh~&dpWo1G59;@O#LLyixq#ftsuedy2I>^@{}WZE6d#U6cfTr))n(Yz3p3GeY%Igdl&QoZkDa$;h@ z8ZtbT!jBo$+!jZq7d}ov97-o@Z>R7h0U-=!FulKUJ)RQqQ77g~llF<+;i>H{qr$-P zV6TarZC>NH${AoI_ zA=#$29-gPj@Ejru`ZJpbJxdYoj< z7@|`~F+>wbW(?61$nJ2g?P|E%9P3dCuwt&No2{wY&-|kXn$`3lhv@iLIj1tAs+=#7 zGi`|8UeH{4WqRSq2?*IYONq5JoWgGcgfkTF0ZKRLsK@K-=&`5v2t7t=;<^uHgNXZ* zWIOIj#PHUm)Y%_`Upz$Wl)SO-!)AG7IuUyPw=q-Rm>@Y?%5w+b%aAwzEY)KDw}t6> z0u{2Z#&s&C^-)0W^&fE4CidUpy^{CidY1C_~;T&}G#-Ijrwb zX_hyf_4TUTl|1)nNu=btH%R2ja}R8^WsTpzpMlbcIOIbF8c8N9GePp&^4tvGQz$I~ z)UV2OX9GJ$-y5jDBhU4eLe>7ikSN!pO-=4i;pl1|BU zHwKPNjsC3l-pKl2gyVCqBclr6tbSvk zH4PTWN=zo>VUjbJB?UN>5tDNDnG9F)@ZT)dtv`ZUq;L=V*_Cg}ehTNk{`e2sOj(yv zwqMP%nZvB~Mf>QFd^pYDJg=moMUdlyv0L{kh zf-B5>L~<45R1X%A)`yRxE7xI#>jP$0BYv5BU~` z6q`q}#u_R3Q|pVrs~Q`dI19lF7rAH)#QqW#Xh4p$Ruf0%rlydS|6`;;5m46T7*xqn13nB#Jk&a`&lQ?Fh)mQ z*)Ff~^KcnsDi9*s*KrgE5NZy`gnF^*GHOMu9L_1&nz%`)OP8kAbj?B81op^+hIZ;) zW?u`^_y9BOnKpD{#jmpy_maeQg-eXM5|0_HB(pWGJx&s*<>q_lt)ZnxlJ@~P-uj%Y27Iq%U1~sa#5$U7*my2%;t0|wa8SBkL8xs%iut6 z#T?Aft%=*ThN(AVYpVQ;#X-|>!8R(y|AnkC%FXJ&d_&RDC~ktWyv}fH5Eg#xQ|#3ouf|-niBt^AE?QQ~c_% zJ+~h@Wz!~=^G{CBE6IudVO0&SH1HX_m7o*EsFv;o*YMPwaU=%=gjLKjUsk^#LS zW?ZEEM@QmYH;!Uduk@wpjp;@Ac8dPAp}FW6pLROP>Mkx<^(q-~WGYkREs$q$$0?n& ztjzGw4tI$8eab+@(QUx0hq#z2(0ZTvhe zkbkMm#ypduPuCU^y-%d7rd{}K(?3tIp&bwN(Jl`^AOeLiD^K}RcbBP~fBph=x>X)d zO#JikqaHA7r>Gt!K69h$wYWausi+TBE>t|svjl^}ZPv8)O41?uIFfUHmbp+~0>=2I zuPC~7VkgowcP<;1gnBss4M@oL;Yg4lO0f{ZIEJ4G|m0{!Slua`#kI6b}9GoP-2_0P(Vbg zX1hEOaJw60bdgl-L38|~tgXiQMMKBWp84YjhWGf{{l_md#?OwPaJ;clR(nGiN=NZL z@E6jX>Rs{3N60N5RK{I&be4BH9hQK!{_HcO!qcrQf0P=A^KG_ZrbC^(zXR1?6Mq43 zsja&^yy%@%>FoU}IyKJD#_h7r4!>U`-CeQ6wSTjFd*ZJeD}*T->QYIKb#ye2!fYfL zrv{ya5zS2CUm0(pS*p#GW^Hg05o9n?w306ZiE)atmq%|+ICV!(Of^#xh z(U*My?Mnw;u0SJx}MIS6T2#n@aQ@13=I!+s+=0}AVIlQ>4#v;X+n#zG0Us}fly zAIWehQ}wR6>~fl_H+YulK@fGX9@fD%w8zZjo4G{TL(dqh;yn+@PP!TgSo!_?wIi6w zrE4eL?4@RH9Xfu|j9GEHzE>*zE7OC2vyeBmA*0GaoI;hwNm4u)aME`m*W#A5rd7-t zTJk=Tk$0Kooi2IbqGYeJ&3BHfr*CN0?5g%7qcetOC31Y(RkNMmP@sDwLUz8|DQEf; zfm@fx_LDe6m#N9cvxn1{xuk=0SNnCpfj=*{?%$~@(uVMA-+zLmHl{jBek`)q=$R=O{hsA}`qibyj=U?opq5Cn|YK4gzb}KIp$t0@e0hd)YrRITTz#OhGD@_S*Il@;hEWONsIZ(&*mNq!VeR^vC+m*# z*xrL2ZIfoV&nXy3;QcfwkbEQjv#ENYvFR~0ylC%X&yxCnYvfu(@HI}TrW}DDlS*PZ zk>#1YnwP?@`pAp!pk~FQ_*aAmmXlKchJlkzgMr#cPfd4uiMs!KlC+n&;5UU-+D7It z;zz(yj*ce9iu+T|iJ?kw+F0}_@$1=NY#aK~8v1LD>Q>Op(xHEw4|E}4Vo@MkmSg-F z9ep^Eq?%(PNtw$$E_>V|gM)>y=Ww_X!mJN}6BpENdf_{HQPpwYXy@KW#R9WpL9{$+ zL}hfQ#e1R`Akg9z@EpZ1hE^~_d{JMAtVAwXeayZfnv>@lKPUbksC-kW?tGs&dIe4}Uk8?rxPyQ8Nr4Ebgy;}I z8TE+?t+OcLK4%*^%RF=S& z^zuA|htOqg9^yl7*#`U2qK9Y6zCd=>oS?;O2ieP@mcfQ#Crcr&0_u`d?cO41f}FRDLMWd^xyQN4f~PiA1K<#G~!=myk7rx z@2uB195CifbH~NZh{jH}2fOdyes$%Q$Y0Ec(Qc0>8}W6D9YLyn+iChYhJPxrAmybdEpGeP*4ReB7F`<4%mP75v z9g5mxq*>b{w);x1BoQ9&N-djV6f2i=orH3@Fzpq!7KfYr*jpd3?08<#?gg) zyv3h-?w7N)6cm?pw`oA(Fblju?zc_BPKVcMsx`=-`m9i)^!y;Aqz+21Pl;;H>mx^0 z>k!|cOq{JVq)B;6yLm;9XeHjQ`%;=boMWs>T+rqqV=k>co{oNes>$K=v1RsR@SYX4 zvAv|bYJoG%WCF!iUJmEUu4Na>%N8>94@PIKTbkl`<>oM};nf^hc_g;4Jo!%e`$S3x zvgI>Mjvq(KGJmB8cZDih>FYXDwpmfbnDf_j08bP$%|?2-dviy{SVGNU7}(?zu>BG} zdo>p@M+%U$VyObIIYCWfN&L|-bcTC#`f-x}sPy!&zO3ck_{|*YXYl|QuK2qgkW8^_ z-M_>hLyXUx7y3c;BO$-D*e?kpYpKur?H?rUC02d?%9KZEfSka$(A(b>`{;{;1}RU-*=S{x3%R*F0t z`{vZ%U}%lK1=Ih(0AnlA;+@+w_|f%p&n{3(^v)bx?m(rlwX%b51@$klV+XxhL8$-k zL{V{vF6Do_&<*_04oxlOyf3?@?hnc7$U1i_W@qm*z1#yt`=lfKaJ`M_-OK3rv7oUl zF^c;OT5M^%?_#Ncdh76??<8FI%W?{2S=wkF`jP620_1iogjqkWGe|C!pVfTlwaB#t zTj8-r;b9$mS+Kwi$nY=aA_6u_JhhwMVrKf5Yx*E+&P8@183kQVCWA78rIosWaxC>a zP1TEr7h~g2*k#2B6QVC7R%YOx!+F(c^C5IW^+A$#ZgHyMQGs&0g2F$6GL~T!-wjBe zJ}jpRs!8P#cOg6_B}k5ImHkA?{-R{BY64)7aOS1Zr%Q&usyx-5HU88=bz)y8$q1+v@V zSq8(&sYCB7cS7e+r*Th%eiSG=S0_AA!sR~ZThCNlncN>#n}>bn##-p}7(?Bm&oAoT z?tDW8$pPu)J?1sL^SP-lEH-FtS1rDiM3HF$S2)ucVQ+T;oS6>54M?@qx%S@*fXe-M zQXuUwjZ7Pt6)uvVGxIEzHg(As+sTUs+&KyytWd~534G%1_)y6`HKN;;{GJE)kU#=m z+T~MXe;4y&MJV1fC4G<<*4rY6n#l+5kFe;}4SGb_IZe}xU zma+3hH^^{qIvFlnt(zr&2g0JF-vH{qJlW#p#bn7iBt7F_R>7avX^N?p8M&a?Rv}Wg z(oTA6{;eps&0GIHR7xs}B^AYzZBp#B|Vljk~JX4ZOHO?5csAxC9@8UIU6jo+qvl`!$UCHwPa zPrR1$TF}xSI$&N`7CD$zZtTH_PhDKx&qWTlGuv}&%N&`<-Lo^|EbNhQFgy0XDr_w! zz|H1^y}l4jE&oR7oGA3xkA<(&B>9}8w&RnCRa+F z_Gu{lUYBiDYpx1!>y$ZN6W= zVl24)SzmaIKla=|l5yeZo|z6_uG^GNQ6l$2%|KeCHJ1n_CsW>vYg2{MDRLU@P0`2y zDVw4x`Mue`xZS^XuTb{IMK3kmOT=H4oe0h&Johi9WJ~!=Xdtu z410-1M3bY?$zfeb631S`u}2wrvC`^wmP8W;q4P*2LsrhJ9{!hYEAa`nNJHrYjnaQD zQz$j@aO_dO;XQ>?Z$SO3J<8vJow7&yfa*K;D25a&^c^LnLw0ohQB08>E$vY{Eyw6!8j?@n`t=D?n-#khXEm695hAINtJ%&GrYTaLm>?{-3FF zoG!`N7OKy5q9j>Kq?#eeDQV4OncajQpIVRJtLP!dBwyG}(@VRE2YjZW<^wzFYQWI~ zdVV_SzdvnPVlto;D>4{tFG;;AJ@u1yHiJD+Qa|eGgPr*^GK-b{P-`G6Mw+@=0F`;~ z^Ns-fHXYcRPSM|D1)--+t1F@fS$AjPu~@Ro8BE2}(P}y6F#;Sz1ndvWxTXvbUTx?l zLINO^UiOPm+136-bJ=&G4E_ID`x5Y`ithcEQe-uCK~Ody zit_j8<3p3&J7>0krUZG>6W?&LEqmbL(Hz>}B36?`nyVB{x$EE(AkzmCC2!j;a=Q-GJN@I5#5iNd&4 z(_uiF=#8k>TnE1u0kd?TPV(wgv|1g|BM*~>xVwU& z<60C3IQ;lMP8Z#*AR84#dg76OdjPC8-@Y>O?UVR66U9ZECO)b<4v+GkoL-4_l|Z__ zovy}%J%%m+rDS(2<4~oSTYoTN>62z*>Xb0n=`hatq0L)r_C*-00i16MXC$8Ce}?sz zNWF--(3O4{Gp8)ChoD|u6%c8Qr;dP1-9Y`(Dxea7Cf`?s()XC`q956DhikbYx`POi ze_JuDvrxtg8!W}pvcoEe>Vd6ioNR4sbP(P~0HgPvTv#Q0 z(t}U9ddzDnt4A-+Leupq<#tN#VXI*^SZR!QL2bRlh%^QI-^-{{q1vW>!Krl?r)4LW zeoGqSQt~|yk1gugiT>70ugCdY-Ptq1|IUPaG6;<@5A7HI zTKooyDu3$((1o?M{MiN!58+-w6hX;nt&(tT4#5uCj?H%@6z6ZP#$%MY%_?Dz$19e< zW%;uMuM~f_J6{ri_HMjn`Lh?2D`J0}#Iy9UWRL2x>uq5vg=OzVW57}ie70HY4N|rG zvupq3kZ(FfXZf?`cp&n9jG}Y+vt=xiDBtYqaq`^^vw$|=3(k~}`O-d-?_eRS79({gZMq0kFx!o;Tag1yEM zeNZzs95yYTyPDx1mtBMt7oQ>Jfr#CZE=~Wg4vmT0_zwc$L&Jj83Ul#u`NMbxc5Y=) zT(XM25+p8HQxb;sgVQLl0s1r#bAci1+;XN6YtcrIYM|s;e8-iAAcL7VR=6t)Gk5n+ zjO7NvgGA4*%mFG3o9PH>Pg>ym__LA)xD6h7@ZlLc=N~Y#X}J1|0g6Ya+YK9whFK$A zpR-os3B9bR{g?YGbjB^D4F1i3ybd?1fLga4L;xk+6mBy0RdiOk?thNQjvAwuRt7!Enj39x76=tuzGz3dmWUcq#;GmDOm!XI4(rOra z3|sLYuV-anJ1ctI=ASIQ*l;$GMn((J<0`Oj4?XvIwrVA|OV!5(YfA`8`hGNMfr ze>7Jj!#lm61K^`JM!)|PjQ;3kbi(tR(cX&D$UAt7@#4c+%Rbc=_TVdG-J|L&uvYXW z^;b|M03x}wmX4^xKd#{EQmtcPS*jLUjxN%ju>1rWS3l@pl*LS__Rbq-b>1^5m$dV~ zj&c=e$@3?F;W*7!?ap!G*S$>WFH-Iwc7z&p@E z$ZVLyIds%?HzFt|M*lRUBPiwSM+k0>SZ7!ATdiKCrrfc$=;`8#H$nT#BQrIOh{a&n?m z@Trq*!GD5tIv6>S{KSW2lDEuueXd|QrD@F?hO?c(cSIbc>;Ga=)XZebxv;0H1=ncHn;4JKPsabv`&P;O$561&A z%P)4#^3J4Q7h%N<`!xMT&gUZ<;o~HJJhcdCRICZuDdPXuqlg3b(YOe=Gm^J!<3Y3w z%fFP!T#gCYKcQcAFZO4wQGJSxY6o5}wIXZ%h(EH{2XJ02S=Go0VOJfhbvWM2s?7wuu|^7ET`x& zUab9>z0W6+Z)j4Se9y<=hJ5Ew0ZX#~65T2C{Rm~Pc)+Wm>yYn3##(U8DvF?FiB%Hv zjY1{u#;hfwIQdrKF-lx(l`u!)l_cxc;fiu5-+PTB?u+;A_3CNlj54l9OB`(7uGsqW zC1Gnf{#fhP91ybE$_A}u`!71bOFy@em|UJ44g+> zf$w==XI7=IHoS9shCLmt3Cwm&(seAM0N2l->@ij%3>x_ZFJr~xcFo$Hxh1%NR5QJN z=vdKlQ>FJK(u%w$7PQQhStZa=!e-%BSJ1Eb6&?aOc`|a69z4_2`j^xNde@d~4;=8D zZieU4#W%bY{e9s)&Zwl19NWCzgbC%V-!QT}<7eB^c^VmoIkG2Wn$4d;J26r0MC<#p zWK;`1!}}4=F-01n7(D$7%hR7{4$Miz(InwJG;ki@`2iI=?4u`GG{+Te0KdzdTJ6m` zFyd#PF;xwv=tB8(+~Jd5o~&P8;kVcdoZfKFTH!Xnb!UEov$L*o6Y(qNkr{bdFW@)= zq4S=sUvxL*Z^_(%_t*If|Da%;;xK*|iG)6pjcgxDxD({T$$QDKkVjvqJVuYD*~EO9 zGakYKiu5ByzfZo8f@vL^ljmfR57na;z3b5lGakrKTn^Q?Qn@ z_yu}e`f5HPtmUHmoVLr%N*sg^)?A(mNehr$jHs(|B6pCPQ)K ztstN125db}(R)Pbi5mc(7IQRur^6YTh)?tfPLnPe%jCc~7)jb#&(n_rPybvDO?iApfcb)Wbn7%kh-9xXe`0CJgBPI{$e8>V*or%4h5!1 zTi1BW4iIP_86LQHj)VtJjIpFnV@C5>yk_KL_8xE>x5L;=bBnQ47oZPSTx`i#ck?To z>a-v0%$D65DOi{7ozC-a4Aw{bK-!K9Lj}_bXVHO!FzU1e2VKZOnNwWX;1`%OIYeQO z4p}UO+j!jk{-UP__#F0c%t@ zYr`BoNO9#a%2a*QLW#R^ntf2buq_KX{j*K*kWib z&cWxGnRC6=+Jsd^`A^_vjgynBElwJO6J-6L&*7Ic5-70Q{N#=Y+j}gr6K{WG*nziK z#~)JyCrWH)hMQ>^QPT+o4^ZO&XZoz#`%1_9eETDa>Q$8e^~ql+@Fe4nDdJnHl1_> z-ZN%1hk?(KV}q8cHGbTU7_oP(7;8C&r;S(EGFo!C7%UGg7Hm2!`2<&K1fk8$W$x6a zakd;Mm%F11F;e%2f~?eO(Ve*%_$=P2H_nIcMlJ?EiMPebZ=Q!|JP+Qt4(#xJzGCiP zqD;F~8CO|84g3i-@aH?uKVO-Qbht?n*U*ZYZw2yIsW$nrkgp$Ypo-Dh2YJ9q9r1F_ zQb{f3CtA|=SlE@!XX{gtZ6F*dgA&isoZkL;8a!5SnJ+EK6PrFGI0%0#C4P!d!bCL% zXvAW5fC&c;`4ltw1oI$HOdwt;l_2(24TxM2#%lncyMjwl5N@u!DvCDOurec%l<=xPqJ-Fni4Lg+yOMqC6o{B+Vjn zQ;?R~`BF8Rbj24-d1JN;lgU#*LW#db{k9U%DAAM2P3hnsO^tVlQ07LK+3GCgM;RF= zou9z4_D&XSe%uhoG$x0_l!>t%4%pYB+2kto>#UWo-oFI*ms7&7+?7UtF;~xx)Buj8 z!4Ihn4#k_4OQoFN=bHw6S{dBYR`znTln>;vB7^cFnTRp4LQ-hV0z^2ztom}BA+v92 zHfee~;!xz2aNT+YHR`9FQnI#;sE>1#5n?bxv!x$rEj8A_*iG0n>^P?LtLk z@kh?9p`BvEw7795&f@~459ldpbY2)dp;Xk7<18;{8|I3i^f!H z7afs#>{$J`3uoDR+9eW6roluh4@qX-H0hMA^{#QRIXn*DTQuHMlaD8);|wdJV$4>N2;^vYcrm`< zDBS^9_yu&7C-u*)KV9R-@nhD0*Z3elU|xhzEBhSmvF;4o7l&q(wnNOAwZ@vIvn)~H z#!?C1OU!|@rQY=nx-OCU_c8%MLFIiQt@!#NY zC@@cn18Gzsg~awxd|zCN-bos-PpIC#6YcHqZ10#+9P4K8<7n|xBcRpHJoPqwSK5^Z z<#SiBaIZPSrCIQDv?nA3Q0Y>&j7_Zr@W44Jp;Ke!jz`!FdklMvv&D)9(lPR*w>p?q zhtSc-IILT&y1L2aA2=RVa{Q(r;!C;VWV=6p0o%`vj_;`32U%?E86q$Y!d3RxKg3FX z6fU5xrOj3r3|2M=Uvvf_9AT7M?_;>BHGH54C-%T0WJ~Wkc zLAa+nZ|ILZZ+Mw`V=4WgrB%M_&jWib|K}tT3ca6uuog*hfaqn!J3x8gTMm$I`Qej9=jTvQ?fl$yus)n0zGCi~r=1^G8CTg= zbbe%Yn~9Y*+Y{}nUWlg~ZW8L{@O=KPvS~jnw8isLjAEIKLr!kIY!r93m z6ZV`6Pv>B`f3?a+0+(lzE66a5_DUmiWC}jdq0!btxmXs;#qf5@R87(iSSXK$tHVu1 zNB!ctWlJIweLBC5#-ogkgKLT$8!D{_$e@q|En|#j?S*&kj*4FvuG;|;bItk^ z-ITc+hOYObV1?zj=k8U@74?!aiMBs{Whx4k987hMyBVS~Cec8uIAKU$Fn)=iU=OHb z_8YD$b{i0o7p{tju8J4uXKGCZ~;>{S#QmYWXtU{|i#@F!Ywzzu#7Tk}wf1^tSHwtb|e&J{E zb!5s3g{2LGelX8`m6J{&9aDQ00k;~{uAX_CZ$k(0w3Xdy$3H42eAU0zBDM(O(x1&& zZW8%pcAaAd99NsW+hcZ>lox1c>ldK72M&7DaO$bL(vx)%Kw1nC&ZOCau{b?`D0;nv z4Qf6x2-bm9_g2TWQi?C-J||Cg@C&AuZ1BV&;A8{=U5X<;00To+@-3y*{#)!r#|7vw z27kt4GNE2$GT{)$WFl7NE}YG)F`3k5{ntC||KkxonUp_94oYN_!pTQ0s5xCZ7Sv^q zcq`Y_^+r0^(@b0AlEw4{SxgV01BvL?=*6_n@v}(1E!HgJ9Shw;+&R4`51|mMfyhnM zTkyO*#mVL3Z}reQ30y{Bv_`1RA07C1+)=J;p3%$bAAp09Wpw;}QL?*R$-yI-0P>8_ z-ALvWmc9}Jx^Bdv@fj`JbVRxVjBdPzzW&v1EHGc6LCtfO5)T{?PzKj0 zl8;81Ic$A<`C(-w(7!i>6WK!*XEdLu9dIvCiUjfsi5G(q0u?^w`LyeV>!qtb<8|?} z*43zT8pKlG(phEuSd}JF1hS6$w6ExUeyFsKiRJ(b5&+s^mwAbo=_%EZOz=r(4>b}H zJz%3iM+quITql|nU$cn)Y}S3Dv+h{|txETyW+}OcJH|Pv9#wY1QVJmSgb2^Kn?WVZ zN#*GYy7StB3S!%iyNBY>UooG68;5myKw#zu@|!^W8Pa~#NxO-~;R+mR0c|7?Ft;Z= zAkddZN1`Yrd&5<%X#v9`I=ApAq{<7ba+G<7jB6NE_2$ErJarWIKV7;ly= z1*>6560;O!)F4=e2|xOdP_Pd9B1-{IhcxRII&6LCW8*) zN|l9>u>)BjOI2`zPE`<(uz!(Mz7Q&?lHK?g`XM?>=PBTgj~l*@iFY5`V2k&b8f715 z*`9KWBybha{SI#s%3tBmx+Z7TP<+tqs+0pHf^`*5`>7hp`@x z#(~n25t>rtQD?;{eZ1d6X%(V!!O4y3Svz9hNy&gSow-s8JPdZ*(Q^)Z~YUva5kzMKLQmn#zMaTb~=9hI5jdq1vy zlXLdx13nvn>BvV=;qooc#(z|V3=Pl0j3Vkux2XczRE&+#tbAjyc_y~zVaJEafg~i= zSq;T)r?jpWX6EL6H{mS#2pJ^$B0Vpw+b7lO0~*)j7j>4r@Bzp1jEf(ni-l~7UpyQ; zjPdjqERA@U+<7cH-d`EL+lNl{7-3V~&fsDEF~S~LRc2jg?8axz?trgY?6$)n=3bV- z2Rb%I7PLdoU~H4++Ttg~Oc)N9Jj+&YWj?EINy}&Pxd(=JMfW0}FBCzFc|NT41O51n z@%&xYTz2vmvjvW7$8sxYnDd${BscIXD!1}De1O}Z;VYRVV1mGDXo4(2!EdFo%f>_& z;~!sGTvK0oQa@C!^8s!(*WaC%vLJd!$sz3h;&6K)OXU(wTp2&mjSv$LGQ=W?*>y*R zJW`bAa2)aGoX%YV{=h`BA(g>3YnjiLzYN)7Mb@ra8<-vTriWyK>OaY+R%?n&j<)DY zk{7m4ODF5T_Bv)S&C+eHVxt5YE{o~NOg1l6lo6WEt~S$w%qgj=4s4azb=v7rL32B? zbS%h^#Vxzu7n)6}g(i{Hkmv~31?&SJw-2@w5MVBrz0KoOoWV4ATL(4X1p90IuUqc1 z{nwWWOi(#hhvnm=unVJ>fh2nI_0aH;8hx-|l;6##E(o3Iqrl8o!%q(S;?SVTlowy^6eog&S&JBf_{ zMc0t&A2CAVB{wyYd|YXW5u{WiyM^4q=1E-eC)T0~hn!6~-)cg1Xj~KKU2XLl@=029 zR6@0Qqy4Bwpw}qgurnbn;YElC2SRITkqCD08gSLfxq5r{_-3pt*5Zw0Z{bi3Rk(CP91CLJ;d%I@>2L0?XN4sl$Dn5^%Pt%SfIj-O@8IVk+ zcLpg~=pFo>qrX?k-*Ecn!_)#m+SlBex|gP-UxqPty?n?qrv8o(fs^3%-0%R5rx9F@ z?~!jvHJqM`(uC}p3-43*u(9<5AywFC+IBz4KiWJc&_F+kj{KBO{G?_#sJ^%xC!&sq9reMS(A@0_JUeBP0w}Qb2ebSdIASGCfT^ zFgOjH!3?;h`OnjuP}^LS-pM)FJhH>?{l;&w5}9jMGG!dKGJ>r@6rF&LzOa0>lalLc zXFaE#9YaOTc)dPeXHs(cfavH9btFI~C0_%)H}jzdx1p&ZiUT{r6rmqxIUkdfOV}tB zWH)CAIpO%b<%MSRt=t1!Sl1(}F24_%&q>EXmUGXyGpdnKSia|_?gd$~9HK1QQ%NOo z2P90}RUH^m8QhFtD8>ji8S~=E<#2$W`l24fDs-wC`oIr8aeRxnoG1&!_c0?qjJL{p zcG#Yg=6x=naCKxZ?2ERmA(@qpEo%H33n4vn#1x~jtKW^3kWH{27}#TTo_ZXlGM+Vl^mFEwo$}8Tjq1QIRXJbj!?7ta}owU zGbXaiU=<$lKh;t>4_4DkL$WPaK(d5D*^>RW(4OmO-NCuTn980*0BMUk5`iKoZT4-1 znHLn(+$lv80E$OazH7cYL_$gU?(>ZB4Lk|ypioK_c_5QGB#)r8%WrcsnIB`aA()it z)^-o4Hj;v@SSMT{5m`+a$V?w^$=#7FoibDMindVFZ!bM)Oy!dpm%c)4Ud~`Gb}DUg zPB8(Qxp!G3lWe$3=ZS=50G3qMmE_n%?-Xlu>vEW<;b@up8_iZo4N^&tEiFLe?HQ7I zTMb?@>E@4jTI8Dx`9(F!H&NtMNS;~H&54QRS(LfAW8_Qbi_*A)6`EQueCB zaH@tjsI8VeR4vbeK(bm+cGl9HwXnI-$!c7xT;k`1WUj;}x8xF^EuC_vnor~MiF0T% zpSXC=&XnR}A5~Uy%1uoNJbcwc9Zl=FNx5ojITaG?61^fmU-u+dJ0V%V?&#b*?ED`+ z!vlJxDA9Y2Xh_gHlCzs)j|_y1XFCMN=q9WMe+kWIzjgd26r`c@AX|6%Ovn9JeiUc^?i*15mEktoxrHlyp=5l4 zd1wA^Y!hMjFZ>ot%w9wi=@*y}xv=|a%X}e$H!Uib{jEGyX|--*_^L(@Z)MxmOf5OQ z#XRdY-kdp+#=AcL=rrDZ-Ms%v3EwAKb?Kd|aTrVGGo8a^@GTrBW?Nt))ZziC(yGg2 zhAzmKpb3+i%UgT}W%P79Z<*-R=93Yo^L8!+&D5u$KG~w{uCb*Ei9q4(@6+*J&yupo zrQ8BQLcm-|!VgHxjFlX}I{XG#Fpa;+l&1z?X41iD_y0c{e|1J6PU*~vFG_HS1nTuL zNjBbKs5lmRrkPW%W7et^4+>ocJLQ~oWxDP7nKj`)A5yLa7aVG_k8!D;ijJEiS3m^H zn5Ot$F_IBAyT{et7`r?*DpK;bD!X)?R94!(u9{}!m+P|7>bn?f^CN1tt?LB?^g?U* zEu6x&>TEIR_pnq47enz-uCWaGZd?|!fR}|(O`<1;!~<+E)Bl6Dor=H~dfX ze?`xcKe1nRe^<+Esr!{)kHDrl9nmb&Vb{yz`09&3mNPN^awevy*)Q3aYDjcMH}O;S zC^O85CaD2d7m4PvOn_sGfu{X)8S&VjR$XYURCk4V3|mh|ja6MYn#5|#i^oBxEQF-G z;CUnmT--6ii*%OaytzA8hQc)H-f&}A&+y5YyR%loq%S8hYtn*-VUFw)iK(TyCN8YM z+=Ji=o2n-0kPP`RtH0cZ3jy6<;{R)A_F3hc7h#ME|`Ap?=&*gm` zk+)ISIVGI@6s}zIRWI%MndAM2D&7A|-2d>DlNpBgGZ$xzQ!=6vc4V_QkGKfg$@|As z)HCJ-)tOs_a+-tQ3S&#=QeWZM@C!NqnbKZv8>q>zuXNiNPF~&s5OESy=9cGN^HkABXg_a$KH$v+Uif zkxaP4uUXbmma7HCdBfELo2$h`!+tC8EM6lSu*d%gtw0mF*bSYEycKmMxI~{4A@d8c zL+g&gYsoICL!mcy+;=)C|cNLp@|r zs8B;*q1XtxGkcjpYWM(IarlqNB7YcUCXuOVqkJTz8IR3JW{WVCPld}Bu)C9=c{n68 z)zO5Da}R7Koer7~z&f)zp1j8XtBlfpBG7dRNXDlgol=X{0{0Hk0n0bzt5hkxM@-4RA$tEA(@O^?G{jvTU3&A|Uu7y;y} zAb%Z5K)sw3FoqIB2{^^cP{Q-~srlcFrepBvcpoZ}({3t?@a!5}3EEA<3Kd%|nX;;n>*#Jicxuu4$~Ew}Miv=H#)U4O+*1I^6&4T}zLB0TMFqd$_^#H7)^c-|w!jlq zeU!C*<|ql_mbS#3aX^XstaGxn&U&a*0JKXA1gH{Oh~~$YSvMDD7|4$ITn!^sZe zypiHuiHs{#xDe6K{|%i#2?E zC#&Ib@M&Ezx3xAFSt#gvONQY$IsesH&1V|_ECwQQ8QMW6YEEct=70yLHnCOpz&(0G z8+W}`rHcQ`ghqN1V%?HXXq!l_Cmd*-+UP!NLX&dmA;D=avUr6h&vcgTg^~*YO+I4# zRNr)rvDFRSq>Rjj5#c9$o}ahmPJF#%0_Ab#jdAn4$irV>Es~;_)HctbNOrDsva{`O zEtW^F!>l)YG54zD@qTr%)uy623h0(zfRk@_kf`Fn6tvTG_c}G*zvPS zDl(73HTsyF0}^*qv|2V0T0rY@1>zyC7GS^@^HUbB4cCHJ4pVyQgr$ziUbtx^7Chfs zaQiisGVj`n^agr4wi_Ke9oNTzlk+W3^yJfZ6p$>8VGAeEd<=qDIn^h{;-oh@d6K@F z&4~z~x)W~Np9ODn7VN7ziCl$*j>=6Fd;qeiA^!zVGTZqXX7`QdXSfRwRQ`(snZ@n= z41HLlM*fTI@eIc` zk794OhX7FLoVYhH<(m!p=2Lb!wiGWad}!=^uDUO33NVE1xEOg+*#ZTiKX*|9RlfkO2vU`W1}3Ec0DS7XepPBpa9>2 z*@kQf1~z2W2Vm523g@J&ENf=22An}JonCLR{GUBEe3E(u$3OgyklmR9VERnh{Cp3q zqdC|N9NsGpzN2*m3qUpmX9l_`@EvS)TJLb1?{gP?pAI|GxM`!5t3sYu8PR4?y^%`= z1J(>jwq?_k2rf81bMmsb<+<{=4D|=hdzuTNC^#2yS$SRuu%_aVhuPAPujv!(bHunUMRGoAI%=D_nrj&K5bD8z92ZDt4J zY?$=n&5wx}#5a>{eu-YreGk=hpVOYpu94~y7j8m02eP&wz~)2}2B!L6 z>iE~-B{O32mE2JGHfF&!obVUp!nsv}pJ6+d6Ibg@e<|x<>a2hN?RusUUnL{VdHV_W za8Jj6oown#)>Hg&A5M1J6Jm50$W3vQ+w+c|<}U-e$Rki8YqY6^XXPw0-B}{Pmo5K> zC_qAoXk9uF*IWv_nL?rZb@MgPIuae{-C!;$snFyn6eUO_Vp>bbZh62akRiQIq z7c@cS0Qa>e{_f@P#6aJ$5X;-53^NbMv;_lw^!wUQtHH-fXc`naPq>J`udPmFY$4?I z<4pQLu+IE&!yAW~;>7!2mM>>i4~P_fs;+T+8(W+gCuZ=5P(f3fwYx?HqTFrtWJIj+(jhuFChVq zC5b+0ylAxsSMw6M5pTwNY%)sNJ+>EJ8DIQV78mFJpIpZFY$Nns5_EG3e)a4RuX!2UaU=j(NsPeo z8M?17Q3ROlIJl2H!@PXWReBiWWbe7g{fbW-v%Cu*)d>TDy^rxWwNVX|%jACkPMNIy zRAln6l4H6}t@-f|%yLMPXaf>4%<@nE&gwR`nvmtaZ$T^%h*&t6Lw!;q*GM<45-?vd zW6FD;tlk-};9xwaGz9iNBk^v!H%TVoBy$BO)W|P~;oyo0cPbIiNcm^it95UXT!iQI zcZx9diHNWb4tXB~?E9<64iWkkiS0P#924Quu2-9h!Bze+8Xx&DVjgU-|31+n|GywV zUPm?~FwmM}WRdn5OAL34>q7`IvJmSmTgEl+|MRlY2xp-?dPBxx6k<1pdiBHUVps4@ zOcAhQM@Ag)=)lIK&gD0c>^_E@{IJAf#eTv#D94eHlt@>QqQB@W9SkD)gb3Y-Fihm> z(Y7%gb|dB@+X%kP;w3D835qARTxaVuA@R4;1y~Sg!&4$|6x7D*JQ%B0(__XeikEC- z)zdC<4LSWM_UX5J$rWh_f2Sf{F;5g})2KN6G*sA8_Gz_~wHa@qF;7b8X!{h&)Anh- zJI+2m%l@fppZ-MxhLgbh*R*|lUJ(%cR3N>JVTgOei!co1MS2#AjHO8Z_Q-ny{P10j zym9zw8?R4k$!xd!FE2J+n4Vl%C^AWEQ}7(BkBf5Y?Ym0mv{*!{*lV&)J@(49r!zYV0^iVuN_W# zbA6)kH!TMT7Hch?tnI@vE1!hM*i-7oS80`P3&;mT#MYF$jW(dB%6>!wJV{{_X#0v* z+3zpYivvuluWAb-DhsO?ud?@($cq$dTitE0aeA_-_=l5)3;Ft!`5@JGw7_neBLX{s zGtkE{S=ZxdTI}9Cva+ zn{=b!K;C$9rl0FB+N4dF+ylBI?jF#<=j=#z4=CD)dyC~hPmV{-j5?K01t1kOIEir; zzJk-C`4a-H2s}InU6(uv8JHitSra91_{8Ii4K4YW#MK%N>9Bo0~qG@Or!ja+hi{17j@KBTn2~nisj!<@NJ#C!_X8ejl zCfsJ;JmATbwFP1}X7}aNp!ks0wd80kZNHTnrKp<@S#>8vavnKGV}=rnX?rZxrY5BE zJ!nMd+LwJg?$faHcM{@{jc$gOJ%(&S`_#6#F=+&T^BME|@sE|^qS9N20*D|boE2a! zs?e9gJWAR58KL?{{#YD^ojKtUrP< zwjo%pUd^WY&qY{K4ruXLOKq)-I9AtT4Ai3!XkGCUH&pqa`3+A_E6}{;3E}}QLmjF@ zo)Pp!)&fbB>&pAmZLC5zDR=5Oj9>cmSe@U6f7AR(oWlJ_Nt}|b_Ull4$d5abTVdcV z`OvQXCR838CW%v6%=Pi_MqolHFu^rTq=7Gy=P1HjIZ+!cdWSzQk&Dd_yDL!|3sW8Z zbQOO1nzf-_aWHF<#n{ zmuH;3c)F-SSR|F4AOnhlLnGc|a$qdgDv2-KiIG(tDv@AcmIGf&#$1{&HMXo-b-C^2Kd?ppoIO?XAv$=qwFk)^V^N}r~1 zLj|qW0Y;r}T1C^q8aq2Qo9e4@y_f;Unyqh_NGb04kgk#RdeFI6@qkG5SRL~GzEetP zbhg8Vn*b@WZy$X3WEgzp9W}N^)S1KthIE!QxcFdJvb+i>&)-H)K*iq&t!q^Sv@{wD zA~%BCDl@f{au;?1vDDwm!TI1ok4Q;x<%>&qecumtkPbL;|C$fsf<8goI(ko z+(uqUI$OMp@sOrOYwUE$TLgVsq39)~oY>6@FrD7)MGn`6<(ylTura7RbhJQoKLZPa z*gSHLGdN#yqV8?elQ{(Wv=uh4A=*=dC~shpHei9imbvi*mY{}-n0DKYP(5*&mih@C zhgjj#tH`OVbTs8=t%5jD2VQ_K?8mRs>&46#+Qj=yYqeg%NWumtA>3XFC+vB(BGDsu zo8gak@1PxsLqI{md(xH_5QsBk5Qq^=CJX-IVkiEgXd*5^L-O5dH-&&`RTBa6{$x}a z##pxXc^?)gf;af*MH^bo{p%dCamta}%UZE_jtPO7^#Uf_|qLcJWs4qMW6{?B>oAr`+~020mFrG>e|sh*iTS+; zCMLDNeGdcL;q)#-RPAq{1-h`u*8cXRh(lpB`NwP!3U^JjN@D-@9uTuPI)WAWK$=~IxZb$|N`(6;xt18Barzn#fSxxf8mmw5SRutcJK-|ieI-#m0Qr1b5j zU`h738-WMNcU@N!Rq|a3x{k)2sv7eYilF3cR!PXW5s2B1`IUj{IQedSUg~;ZS2qpiKY&uo$a3QDF+$`7DIL&S^f!ooD+aS6{$2r<|^A)mTh-Hc8y;&ZY{PFw5P?$Y9qwM8yI>c$;e-1cavQ#z z+J-;y9}&ZZyP-l{MyYN1B5cD~<+<{!;IWT^&lsS`HzvPuKepr#aBKa+4l@4rmi#<$ zlfo@|V1Vm_V*mxv`uA!$b-6}mF77{28>LJwHinzu86vuC`cZVeMS6eqilnl8>lw)I zSEuZ*%d}8>EtlHg(xonho`W*F%V^-NT}6Mt_Abr^uv zD-!m0Eqz@nbc?$v^L`n;ND>;owFK$%Mse{>ZyF->8aT1BGZtU4^e?yYFuW?>#)7rx zbgCXME)kiEAe-Lw7mm{HPjmKNSbj2EWjjj8wX+ zbiX)nkrxJPf%%FBukiW>4!lAXmu}Vc1~JS=kyKr~eK3~io~w=JPCz3pn8e)r(m32t zFbdvu9QGlJ>vJB7p6?|3hg-WoPlISeTnNDP&S63w97yyB7x9Pg3JkbuJjm@rSKFS{ zZ)3IJa|OuBE^*xX3&xjtH!Aeni@O{g0I61(Mf`n$k!nYbR4*cylu~0hNrsbhvFd+0 zTT=fVEuPAD(vs#kb24#|F)srewZ>esbQ}l`1)=Edn)&8{x8VG-0`mt(5i%;S2Hs+h zovJduduR9zg11-*!w1Xs`31`D0Nx@4w^5HSY7SMY8_2S!FTB)r2&;TYc&GK{Jc!9z zLXnNgyM?!yDtL>c<|>Nn%skf|1~CzD;i^G(B%BxGEkGeY^V|^0JogAQ&+)9z$4_xI zsojN}K*f%k&O`5)f8u2Hp-!67+s}m#0&h_j1>T~$vKBVp;)m#Qg11Qg{VV>?$nE!K zv>(mQ&4bZgE;Npgx9C!XkJp3`bMram!opj~jY7e@V|a_(5zygcXn11`viBHCa|_<0 z2mun6i!K|Rp7vJb7f{}EZv43CAoj<8`5h4o>6eF4QKShdXSop)BH&qefI2d*pG9k0 zNBW8ydckXu%9jc){6kt}W+FWP0ahh#@m*r;jRPmTM`Q7euIz{p__?t^KI2z5sZiDHMv6}G zMXo?}eyQz{I?!J!{0mKVk!K+wWKm)u^ z3|p6TQe443_-N;fW3-jxS+M&I1_u2|$9cGp|4jU=WYHr*7WHtmNK#qsGqo&kcv;C} z_iZugg5pD+6Ljib^`N5;$Fa9tflT{)Um}x4| z=!>wa-wyZ-%0SQ-a}v=OOIT>Nv(Nw*`VCW>!X5nEowbG6IAi}J%ey)-)C;Q$ECS}v zto%6%ScKsuw$4fHT$r24e?W|>6_cm=>&ZgjI162OAvk!z;=ol}jE5}$D1ZlQ8wHbh zlNNZ(9)f?40g;V(FESkEj$s>i2@5h~SR{yoj&0a)@xapE_vN$J-Dm9*&!WUX%G+4J z6FQRw+4LrV=QeEpDdO(Fa%f~VUIVWpXPognfM3mZu%sO8WtCw5H4XchYdP%ln z|4RbgqP556%O!eP4O9eVSp6opb_L)}Kd52F?bVIWVRejfruTkGE{HPzPC-<^D1w-L zOKePC?if?Gte|oudPs2vHBXT!0EyW4>QDZ26rAZy#GB%Gli!9xDc?cOm`PQ1z+%cV zlhdIdfvE;y8B8_31QZjSYF5i0zMdX#Cn1xBCcr5{L2L#*tVy_ni|{}r3<9e)GSJ=L zq1tD&c$CGbqBso)1f4jiw6W%t_%`ecqAU}{MczPJYZ@WS;6|xJO(SdZmOYJpWEc4e zMgHN;v3>{oFWJmd$p@S{&Uryu%TJI(-Z69Z7M2uyA3E7j$6zu&@W8UqC&*`QpMQJYD)Adi{3H8(>UKyxiG6Os z-)WZad``?#Do%1cl=m5MV6nDeK5N$ck+s8UjIF$`bG7pRd3v1k@^0uP%G-tWaa(h1vE!q6IPCcE6NN+=Bw}{_Xqd|HFuu#{u)RB=5Eh&xLxCr-G=N`^ zHG*7`G$#~*i~lR#8@d_{rgZ&97Lr9)X5Hq%b>tulM0f{QoH1mF_(b@%74h9jxJzS> zN^nCNex$?lT3bCJu({GQpG>u+ov?ru_v5ijxclp=P$wJOvG_Db0AR9jKGR-rrbIZ1 z5|;2zFhvqP#d`E8@Dx0X=u@x?V^SA)zwBDw^?(H~ev=ywo-DqBU=^efLapbVMlF1yv?PN!V5Lg~Vn}+2*LyB~|h@b2^Sm z>niyjjk2qxl<@^92{w}L;T3XqF{!kXJc@Dg7mE|@aleDW4-fq$d-;FhzG7p5-5J+#H@0raL>r933lj*`*KeTDN`)co``j25gl z5E=50QSWk96U7aIe2!~#S_9kVAfhrD$J7vbW71X!#;XIJ5veuSxA!7t1`!%y(Oar7 zl)-)h;>~0?PyXdzW~323WPKe;E-(^|vI8(cIRlNrjZVTdIEiF*{zM zg2UL&j9nB}=`EGUhMP_wfw9lHqCNJzouneek=d-3@}62@wX?J*NS0Q(g4y_MLm(2X z#z>>|VYQ0Q56+kBdGket_eopRc8r6w$iW-nKyDVXp39M~gR9mK#Wjr1n1aQghGVIu;?*&T`okuq0} zdcPh97?sIwK%v>x0icR3rvBYC##Fu9nfm%MFvSd?5hnao>R<%s=msN(SQeU3<-q-I zs*3i3V&GArsO&JF5v=r1A=Zb9o489d2Zt5Q5S^Z!7xqpxzdAwgz=`>v?1|f1XD8Mf zkQNqAG^cK_!_Bk!_b%moUHM)<-U}5>w3^>h<)Tu3<7o4fSHv{8S1rBp!=oVD-PsF| zX6Rn%c9OFf8vZK1;0uGj%l@d75~+Z=VSHp9q_sHQst{{VOB0gh`q_o^51X*F+e0t`eAb;;+UF4}^aw7j&|UWFht_gS73 zmX=1o!e3}x@9|pOTwwyXlGTeXs$#8nqKGv}@981^a0*n~W4uGNF-UXrL!}fEq!uNOa=dU04mrKd|?gEd0@eUgJ<$~a4r!tS9nqn z%DK~U)A3=|f1TW}JP1|YpP99RiiW+#opyh^W+5dPAwXhyH3Xl!cR*L%`}97mWAWYlZNP1m8&#(EaNM^z9HfHrXlQaRUG z_6Qr%NE^TGE_4dnQneSEk`p#Q|UQLMuKqqB%JTDgFYvcEU~|Kt4={7iN_BC z*~tAU7t7bN_C&Q15j<1+$uYc5IUWe!<}tJj&YO*ADr1R6yiGP@EDk)=X7GR&;=RoP zPZt-doQ5JO+1VLuC!sjJ%`jD0 zs#U_g2(MUp8w<~L&<}4D5lW&Hq>lLenxe5_%OTLbL z9m^EuNBQ1s6!9B)&&D&|ouOsiJD#l%7;XvoI9nC&&cgI%!PW$Pw%H1S*8dNlY0=&! zc&2oWhw|~9=&kj7>2Z48_XLFF@8g-~4FjP`AoMrzO!;LV!wVQw{sg07ED$X|b<;LO z$kxU&{?0(#)fG9{!^y+L7^bQ8{~ObE{8~q>aC8aGIxtPA;v~An3ga0((ghDnIL1t{6D>#~+Eq=Vi zr*OcWlv5vrIlbCN{It?)Jg7M%!fhINKl&twFTu{)8|my^W==8(19hQcPFcGSa*+{v zO9%ls)-NNt$<8&RbWr6Qf%^&!(gE|hG$5T+0tD;G$i+Y)kHvN@OsX^8$kf$>b3(ci zf^J-oQ{rRIH@wg-0-XROqhuT@M^Hs6rcMjz^gD4*Pc;&|keGS|I42}NaikuR@Jv2G2rW7B-4`^b(eG5O~Y` zAn0kpm+ zyE6%fibvuJmopA~jXzawcT2f0L(Y9qxeI8k~LVMA2Wt>#$Q-| zi`{Bi|4-^zK&lbxB6ba=y5@UJ?w+(F0I3#xvW5Ui^)EUQiz08@BarwhbT`B-3IU9q zqaU*Lz4%ZT`cUP~o| zsoW~-??K^)%Oa z)L=VlXWL#c^M^JHDs?%@o$DmG>|ffOY6fx&DmCG6;G>%VJ$zK)Zq)a_vpzFL>+&0E z!hTJB)X!B(@KL;asrVeAHmsvp*U>>U3;s+JK5qtfsLv7hyp5%R0msq+hN_ zMG+S$%jS}+l+gfzXIvBttk65yqZ-rq)EnSCq5b79p@mmT>&_>S9UoOjDj7lr|B%WD z_@xFusz_>99eD5#M+Xk7QT{QO|3AP-{kj-knQWJPJ0Gx*a~@MWw(F5C9(`=#qwW&^ z6t7=6dHo1q%1?5(btiJRiS)m!reU`6QBNhuM?FLWO`Qb3x=nZAL`6V03iAXX#SK7> zk0OxcAK{~RE~-TqU-1ED(dAJkixoJsoNFuriX+wkckodoDjkmFp5cnflOQ4<>EFOd z-HM@I-dtpY*_H})8-yzOC>zHCz+bhfGqRKrZG_!G>7FLnp_v%UDB66Lb0pbVrwZ>)q6Npli1<9p%q(Vz?z{4WFeMoL^sWrB?0VY(i zzgo7o|Fc+YH6co;DiR-n1eIFd5_=SgQuubX9cL+E#h@H)WVL@d@p=!z5@!ci2krq% zoM62<0P9sGfc5&YaC@iV9>XsY>^&a^tamyKUFa-y!Eul_oJIJxvBW`tjgWd5xCMKH zSOVKr-ihrPCs2}jgw*V$1F~g3$ABy)fvzO*0tg(#fV`RoFJ{62prB(wZW$EQ`VZu@ z9+0QnC5VsuM+0*1C&^XnE&k2{*}yL<_39;Y1G2M&wdb9zjl>sy;{aMj1NUBCJs_tY zj2nrcVvF(eK$<|h}}qx_u$TmPU4?177q30`v60>>Dfq)1!{60tD|Ow>+j zp@oSe&=j89xV89etx4o?=waM>RDLqp&q^AJPKIT=MTwdtbrSf#pH|)16ai7) zn_0S6WK<6l$)j9b%Jf0U=w~&3&@tLUZM9VQfB14Nu)Z(m)*`ccd_b9Nr4Ed_h5R;d7#jaxUNf~N-+7&>fe!x*hWabx(|C{ zL`Y@*(NF^CSaH5AU!QRh z%il3RCbpZj0488!Md^Y{?@Z_d41u?de{m*I!=io^Sd=#d_bMSgiYP7)domz984(~~ zVNQ-uL00^2N{S}PNxUhE!O}7FET|KMf`8o0zFlQLgCzM@P;d%@f}qn6%z+9#Y0~mH z#J?H`8uHel+6hzz+;kdfjnz@W1?}q-YGzUf}q43Ra^Emx2SYu5qtpwSn*C)wf`KD@eE- zK6d;J60H>R(t)d#jXL~}1R8_zuTe0;kjvj9+)Ildy?rBl`x*Epi!vsSvsGv8Y%FcW7xanr@g$l}1T@Dz3E2j>qbo0D4GVY7t$ z#C4*Em;2Lm4Arz)MrG93}Ut{@!jm9KyP+}95;?7#*3f~EM6Y|nPZS-A!(pY2Ca6HF$ zCd<1!uJ;%VDFb5?)l>`HowaO46O7IY*gYtYoCm35kfHf`Z94eEIOmEF?a*{J5_wl( z{uF#hek-Y4LGdzw#Xc+Lk6qF=5L~6FO>+hULW0u3j|;f>t?$j`ErJWGTY-Q8qmZ%) zd2R9vSMpB5+yw_)<)*GdmI!^HAgP#VHlx%H*^2cKVzfCv6-lMH7_VWptBfiP**0kk zgN|!3%Xt}{Z4>_dDLutpKsDDQ-%!#v?G4NK;;Gq4Mu z15qQ2t2!5lPuCp8h4Ke1lI&ll)2>;|6%aEdC`hdgE1790G>OB*HS25S-0`I;d145- zjTI5%Ivo1XTqn=N?f0bqiUcX+#^PhvM%Q>=hp4pu2BJ>wlw}iCzs4*7nA6z}P+xz) zqx6Bt*dsCXi8sO`H$WS0=@;*Y^m_th5gP$bSH{U6%Ni^TDENYzX8&oH)G!Q;-*VM-%&I+`mSh9Xg1}p!8tt7UY^e8xJsYI>}~sH zP@Se53&45YojpsV=_(CK5D2&QZs1eg*%Nlu?{M9fqDh~G$l8EiR4 zfdM-~?zhe_7IW(F4;pa|#v8?2LUN9JeqFI+gROR3K;CfEZ*M^3zj1ckXFsy>NCHLc zm>_88cv6|w(gdXA0jSP9#aPIVo&Hh>98HB?Lyp){m#KV7y0&t#4&x+wtRn4EWle5+ zlbdaL6p>qa6(!u)mj)GbFZk(9cj^-Nnj^JRb)GNh{|Q`(Twz5=ulgId~_rv&FdP{qbw5w4qtj`C#gN8&7*HF4WxVuMqc z;V#{(+M25xsT#f39CbqNZN+$c>N>QvF_g!)1P_~fJavs)ZEd95s@nzRjbl73&j;I= zxB);$xx&~g-@wAx78RpOyluc(j?4z;rc~kSLQAK_CZ&**=1xv_@6w#S{Ufe?s*BrT zvW-P0^J#tI&U2SnV}XpNxI?k9f}2fc$iL71ru{#qVUbsf>jhQ@_C!o7u#z+VA3gB7 zE3LFdhIQ&HYZPLj44lG541yw}XPl`xE{@~)nrp#vYp@Z?1xqrz19dxo7QKSWBrS^v z#y+F(^;Z_JGKDg61-}NX2CUI+Dtvgv8P(yQsV^M(lg?8W{sR6!>NsOrD|`PjxtfRjpaEAoMgHhcQS(b9^uwv>Tg>B^iJ}9ec_GH3 z_>cz<$~NM5oeIy0;+{B;C2>q_e+2mlv_E3YwQfyahJ&%*S4eEANQe%I?R?-eU_Q<( z{9OExRA4}t8q1ksPL6t;uN|*sb~;3bz0Cgd2R^HSug27VZPcXRXm@{SyWhluL~=>x zm{^Y_!(MH@T7{9+?S60^&v@LiDDO#%UpNiMG`ugX-k$+AkX%x6x^p56bfE5ZMtmV2 zPZq;xb^1vyg9M*7k#9_;q=8gw`}D@`T%qtV5kNRT!ni)h9W5WtW^>-?V)QN_@VDeC=Nfg8jn%pHmig= z9wu+QdxfPGmeu&I7Wiyq zhkAolt@)Vwtwn{?2FM*idn8!&dPQJrbU8zB=&IE97Z5IHp2i_bP&QG~e@@L6&94`D&g zd5{b13i*p;M4nKe#vY>pi7xtJSzR#28(gba(%$!QUCK->c;;Y%US=SBDiS&tP2ggD zf54^l6woi39 zg*#z-hP;RLL%VQmj``azQ3rn$xP#a+SNVrB^077?&%?QzJ6sF2j7d7sOkc?ylT8jZ zz#NldUi;obQEVhWMe4?g!6xu6jo{Ij1ZBtul1>c7xrr$+H|7}!1(vhH3~l9>KT{Tc zA5C(-C8qV4u7Y`ij~<)Wr)^W7BAl23JH*Xbw*_6akY9iaH_2ehr_Eu+umJi7{}OKT z2-tfMck=?-i@TvxT)eS$S?XscpB+KMBJc#}^I-YSc6SL10hg*GZ%HLV#J0yMvwK4_ zG|S1*@xl<;`QkfHHXdUaCYx6l2sg%hCU^)O2cyoFSST<90HHa!;T71mP{B;Q)(_N?kMrzAswB z0K(T5mSCy4yjyAb-<0KMU~|x_qg}`JKOeYIsTOoT=})(4E=F#TiSs(e18=Vxc^)8M z^V~2A+Ec24b5II#AQ%pRY3cV4e+jXU!0|9MkN^@f2KtJAY(oex{*I*{pL^^)LxbhU z+lDySW9J!aMjpdXNrmvf%!wPf!J#XQn-C+t@b-7kx0@bJQ*-i6zCAj&Uf}#_-Pe{Z z-}P>!%Z3q)hkJia`s%=~mRR^(EwMb%N8>V78oT<8w42?q@C1$ceAf?>MqLClqjR19 zm6M;i^hoOdxNd)ae_T5fRvWOIxxJe;bF;R_m>YmN0GT_4Rdo&KzP}PQxP=&<@6|MkXzU=|S(*Gks^P3ZfckA%O&3hq(%sQ5 zAYVT{OPuBT^VEqQT3gFb13QBARo-RODksIcnM9 zy3op75zo`@q{w4n_IA+HoS-b`gGk(d)=?56wSk1opA(sAjUEo6M(#mmw00cH9t`|)UU1`-F{Rfge6)9Fk1=OOm#N7G(T2ZM z5GB`%AX=Of+m;2e=dW^Bd{O2A733%q8=A&}3XXEM%WV*|+#4y^r->={_aw6CGPd2{ zjbqu5Eaq}0*qlIoCb>2&JVPX@^}p;g7(k?sg}wK#Q{5-Kr;_v{$(AnXYq$yzTS+gR z*)CQy$okiNxl2%`y_fq8zLYNzjY|&DTy`vE`0VH zrrK6q2|~Ct$x+ulJVuEZtPREs!-~p1)_!O#o^|_1r3wb!@}~r^;X~UQXex5sRhw@ zZ=ncUzQ`(xzH1L+c3|T~5{iqrq^P={wn~_vBKM~iZ?WQ8;o%a`8p@Xjlc5*!k`>Ro zgHB&5gU|Ai{%EM=yrBNVNYdotCXqOCco+9$?3ej2ejjY%5eT$-V z#Isi8K@Iud^L3nj8^d}-N>jfDOLE@ubEFZ4d?yM~70-Gcbk*1p`EFo5CEVjG6hX;C zt0d(6`K1o|en3KT@-4$-l;~)cFmJ^xmV6!YtbU4e1HShfMSKa~v*THRe4}N&6)kbF zb%kQ$OQs|6CB!9Y?g~o4M~`&DnQhF1JyjV*fD+(jTL(5@CfnIWAPm3;Kdj*mIvJ79 z>N}Vl!cAA8ETIq#u(W)dgcgB>y^%8!zaR)@Y($LZF3>`K25*?^u@;_ue;8JWgVQ`v ze>7ISSboJ%K-o3eyS6hXpaFQ*ZG7t<{R1kjaF0HMKRK>aw!;p=T})eaDs~nFm%Ba& zrl)R>wnOtL#ZS}L@9*$;8lvul#1I8=3Y(sHPl&TW7RZ*fa_=Slto^7LyP?@s0Q-Wl zCpKwkC9qoU4$Q%7S+f{86OpBDF4--DE?$2t7i{ZrMHolK1iZ(P*9G}mhZE-EF0AEk zsYTDj&A~*Z03{F=%;VnTuOVv0dh;TL^NmGF!u;@8oOecv3fv^_By40ihmEu`O!4dU z(YuGE4rJ2d?jNe;NA3mbkHcagxxK7@^%l$DaC#~#rP}2d_Rq*Ibm#a~jvRL=Rb_h0 zQx|VxtF8?SD>#m!PU{=9>*FV%F`vuuz)2AL?;r*OGtkP&cc=hAy|RvWWO#k^_AfDn zFtQq3FRCPX@ypak8>pwUv}6avtQMcnV_9l2L;{MQ%BZn~om*jzF{GgR|{hBtu6Ra z?t%Yd^@}t0@7ZMMQcV763cJ|#afM^(UGWTt*oB%7p3)DnhTnyJb|U0Be*oEIVe{99 z^abj-3N)?^E~e=4U$mk6%z=PPx(Tm!gM5U3?ZB_-n&qoSKk$o*a{i`xlOOP%YAp*h zpn2xtGyl6B8;e3HxXcwSZY6LtBglcPYd}uV^Nb1xfG3fR9pEZvwMN4O-3U{L0{T&?Kekm8u&O`)~O~y##0l`SiHb?!L7R z)G{E}dxp>|nJ?0EmA(fjIV3-U8OlaIhlYOX!(r&u5lxt3%ZCS%whCi71EP@rSFn`4 z!r3flfl(e>Wr=k)SoYt8mQqUGFrLI;e8$8tC}6q2Ov%q%2B9zGvrt%G$z0$w!YL#Q zN9Zh@;Cj5`DrH8KywGeG#cW!4R6l%S;pjbpxr}@t6U}slb$!gxo~KTTwd5HZ9}>P- zN;@b<%uN$8O_X=o8MC*c zPR$2ye?T+I-c?5FKDN$Xjax{C$7nM_-&BF1W>lBeC4B9Jqyz~xM>!aP4E(9~V>3oR zMUTS=n!S+f9Do%5A8X$NXVujHKhw-~p`4Lo5JJ)@G?W@s>Tph-VMZ=RO2m*{dXaMo zGo#E5vz<;2Z!uAXFo*`FnJ%xHZqwa#K^H1S`#2#=O&87o`+e5l`|N#Y^78)v@8|b3 zr@hvC*0Y}VthJu?+?IGK!cPIzViUS6bosUpcPLj;C5NUMwP;2Dg*CFhsAVvj+-vI7 zmD>Pa0HD)ZM>0KJcX2 zhj845u8DV7v=bB-5;HSh8Mh6f%_CWVp-y2s6*|`FbcDCypQffT`WdtIQyON8Jz29f zW*PO)n4{U~3I+g}qUcZvk%hR2uBo?hAO|&u!_j@jfjb7-8ja#2UIKDD+Mx4M?3_vf ztMkK4Rp$^`D&Td12T7Lc6Or#$tq@EV`^0G=!=K!h2&m~&JDUCp{FnJE%USW8*B#VC zRUl;~Mcdq2sH^@R#Y(Y6!9v!m4;&v94hheKo|XA#w4zdc$MzVzvHiBnT!BQ!RalTj zI>{<5s7uP_dDdo?@b!SM;Ohd6Pk*JI94%Z_%Kb#fp^aZU93X5kOPqccdLjzag z(+zw0c%}64^Tp_)kUgZw_Q0mT*d8F=YL~eU3=75&rOOW4_=b+&=IYxkK1)Y6}IdZf!)S~lyyzip^D`;VF|PhILMln zsKu#P)ul4488V}J%{(Dbi+DSZ@yd53)TT+gRCI;Lf&o40zq`is0l~EW>9wx$tMN-6 z3feln95cC!@%l_M&%p6AJPi0R{DlXgF_^1!dX<}tkS=wyJ9l0v`%1#XO&D%)vMfTp zN+=7|T#bo;)YXUE0Tw$AN%w-u0`@QLt5t`eBtc}O2(`q+j5y)u2zP{fO>oz*b*HY) ztY4P4Urmg0>?QQT{V|cAO@D;Dpm|o#9&9CSb#18IM+UIWdJr4~gFlov;flLhi|I_PuE7f#a^@DJp*xAvt zwnrOx$bp-%kOwYY50Akh8-A_B-p1XmK(_Qa{}3F1$?lq_+-%Jqo4HGZQl1s+-m?oW ztiMTM|kj3Ft=G<%h@1`&#eTmbfTEK9kj$c=2t>KAoTzoK}Iw1IRdX?G;WM4i? zOmiN-&4E7;-&vdGNGm)U1CCMz$HzsTaeVxMui-;&QB;BY{9hj|g;I70QL^w|QIwuB zj0!i3EWY40Zn6B03-lR75iLW>MQ-BTE&x1k*Ctt8eSMy~iHF}iW(V)74ib;i!68Jx zSRLfC1Mb$5X^qS>MszDHFs{kM;HUps2jV;88L^B`8~gPqrkk^h-8_97cV*Xvo!}Wr z4E`G=Q5hDuLH5LAyibjD9FC+ALe=i2q@tkgUP!8@_O0L??&}7x8WKg{Jy;CsjR*o! zVT3c)SkpgtbLRLwY3$)I9wGlq#b}w=#TxCAg@(<0eif|*%T&Yw$NSuCw(&xEez7-1 z@X3_gGfs4kPi}+xH$^)*^)_U;1d;aCxurGEXZ^oYqSHWV_F8R0j9`mV^aSjX zCjqOBJe$>-Ugzu&B*UG8D=&N#K#eE?94@fToL;Y53oJpzT4*LzElf-tx$2#a+F&bJGZ?|_{-1zwnC3>GtsT_w*eN_ZpfMhW z?ktqFydzieqRP$~xMEa%ym7u6Gj!sA;3IABwL7PpTnhV+Yid<6#9LtV<^EKYI|ENx z+}Vwrq1t&9MDqgbNA5N&x(d%nQ{!?%{gNUL)l3eFxB5q!HmngvMN9yPD1Kt=^hY+z z=*|!C<>?9oN>F-gj3veZP`$8Mz2Uvz{*7ly=!`DZ3>%xc zT6Ss^fAJ>U9(yXAbAg579qNo6Iobh5%o7z}iA%Yo)9+byBa3FS$XI&5dTJv^<3fOA z!-oL{6O=Y1cokAlQ``y;?W;{AFPqLS_$x*c%hAycJ5k!6#h*5jyxu2@{zI*1%uHP5 z!k7bde`{laK5ba}d~Pq1eHt2ux7h`|B-gCLMrvph~G6- z@O)EVzu2gU&&lku;4qS0c@!sT>QitSqGG0TU-PAI!tTkd0;o+K)Cb-)g3~y=#hc|o z->^gN#gJRL^M;1jYjT38ZKVfjYv4+?#CWjB$D$RssU`9eo}$zeoFU*#wZt8$Re1}3 zTZhhpGc2`4DK>7CFQPg>wCc=OIrdi9&o!>eccP89>0CpIBj$1WUDDR8i?K0{#p~pb zwPDxU+c*5$xA?aWyIR!MFDlv}dbB?9JvKC&@~{~kLIPT$T+Z@L*Q~YpvJ&A5LahXO zmAT<+;!>JWD@&>9O7xu_f1rMGhOne-{N4DFwpB5xqPjMXr-r%$bDF~k@n3Vqawxl@ z4y~jt9)1GL!BNzaMU>aWx1-2@KQNNRV&Y{&Vb2N5{S4C&Rg;`vnHoX}J$r-G$c!pa z0OEtTyVqg5Il|)2!gm|KSNE8-RcY(fH&fpd=XMSF-0iydD|ngK1{d;lf#VWFgw)H| zl>NCU7_UCye97fQ4wE@fPdq$|4}p{iv*HghR!Hsy=E>rYU+K}LUUtrRaPM868DFh} zgs?-&HBR?z`!9#XNnCw69G)hgl1&na!)0^K!(rcC9u9KWEz@gW?y)}X8JOSmD#TBqrMzjOIT8@2R5q1#-R_#NMT9A*G-^| ztB}F6S;2)B_y>Gj67vx=+xuyxWTR#ud)>SMkkVT~vClq?irGj=XsKBL91iG+dCk%U z2*lv&0M45%W{`bIIHL##Q53UWS$lxd9Kj4H#mWj3E6$gz@MXa&s#o?xXeG$V;OwIM z{8zAnXI;X@BpW!~IPhU1Lq}ru$~`fJN)93XW*C@+dcT967(@H69ftNKhjtNk@)#PG z$mGwckZthJF_p+y3*7}Pqpi^bN@U@5b?BR7(BD)d$B~%WrgyDW+w^RaCuAKS*rXLz z0Y%dUP$SbzMp6pXGJDwlX^&Hu8 z{K{gS%pJ0UIBlqN4UK9vdpmbXr~-M6>HXy59cZosI3t6ODI&jhy4nTR+k+4pFds=> zk#bpC-hTPmCL&iqkDHzJXXha*9 z=pEUX(cY=f>#ocIg_1|4kvlE#3vEkJ1Ao?IrmS_}ah8PC?fS?@hIu70!A}Pg4E=r; ze?9Sa>C0Uc{>@LDToZ%%YvJUN>faUVFm0S6A)^z;r@#5@6RYjPQ-PifGK+=YvmXk2 zK0A7+13mjJ;XPzT@_LJYb`_O#8X%PyUIQS(qGaHaE*rn?z7rf&;woAN8er{_{dsCB zl;tM#mQt2}i`nXcQaDQKhc;s^=ODJ+yb_5rN)}y$QnYrKb!jN0@Dc%1MX+Ht8iG*R z2Zb70eAs~th!@vDjjXuB*MW&VSm6s{nc%YCD_H4)f)xT?|oa4_B0u&eiJDgd2(w7G)=+(C#?%GD0$uXDl)q!w>?^krEkB zs0~~q=Lmtm1W!;P(E>ICWrSGQMjHN;q~YKH8)?RqGzSe9`H7^V>C0GiK#Cj!QKdLoP7Ls8^5$M?thozG}T`Z>Pe&hL!T zia5i<`|~?lIdZb2{>A*xL~+(mw(wm;RLq@eidG;FMBWR^e-WEJ2Hn`)h=A(DqNK9j zeV_I=g5#ej0Y}=|!y|XZOxAZSIvzw0e@K>sW*mx2Lm1=n6FQ@-0Z~-tr=zrTFz~ZR z`_TzXRj$Wjtl^jT36L#N#yEgP5YN$obR*a|CAaXp?J;Ow!=gd()fA%jN$;Vr z2oSc!fkNOE7Z>$6{e6~lhZ29t^FE6DLvBWa_?y1`q0(rW@x4`S5$kU{^aE7F zGzMDb_-&!}K4ATYzv*D86CLr>?%*wbU9+~hgYIO_JF}=NTU+bVybIjg=Lo3wX>c6V z^2+^)l@?_rq~++ zQgXQ*7m&n}|n32qFA;|sg@O5CxtzbS*|R4F_G zC^zg**|*r?Yv?e%EOtP^GIj*$ME3|#f8+R{MQ~Ur(LHy~8y5c0y=CBkM`1(!{|5P1 z-pt|nVO?p|RQDz>qLrW8`@UZK2IZ2`GlC(sW%`dur3cbw2A^TTJAFG{R2kp?@WFcX zn_;_wmJXLvL)3u(EbMGB%4vtt`*cVoUf5+cxJ3Yh83G;SJS6lzfk-X0BemdlLjZVk z1`b?Al>Z9H{{afE0z?<(BM)?-!lpE02(-tDe}2cNFTzd7h<{Et;-3-lp~HQ5uS$1x8QNSy`B`hCbEP^?Jr@0A6=@cLTJsZ+srDtkdzZkMTlpF# z9yuHFsNPy_l{N?#0zAB;Whs> zK5$$t)U`N?7>^7H>UkK6M?Tubk9g#x3I4~@sxo>1N@|)!;fLCoP||zN`P*<|pFxm! z*%4igQ$!H`_;oNc6mfeZSK|?5<&}DG)o@OFLQ?k;aM(pWa_sl>_?=;!-A;#20^ z-2&sfN5+NSo)eI9KAh%}ea#+u&@zy0L>_ciag%;$1i~|fa<4$a;vkeFtfKInfMUd1 zGKBb}CQ;(9X=)>G{|3#kW%IkxoMwn|y8sgb4AkcKbrpVxKaB)ab%h(65yVjCtKN|W z;xE4oL~bPLvVz|k#Bj=K62wrBuxZeq;loRSr(1ASOz@T+&)2{al@Hj5`5&B~!UP|{ z`2osq#E=Q)JE2k|L6^4?z`yJOK8QDVn+FsCX^r4{nYa9l5sFw|9~0+rDuIj^AUumf z>=IxRzD!OzZwvyq^R^;twHa`GRY~-52N8i~mt~Yz|)1v#w z{D=0nyLvYQ`tgcDvZPz*?*u=If4PbvF^PXoPUFPS;CB-LCjQy1^SDq78h0|83p-EOD#Yc5sVzZj#`EyK z7egRZxDVIH?85}|U;`i(N0Z_rmBQpn;8)~0sEu9TZvY~o8&YpC1}L4$0HuDC0NEKT zampPaV<+N*-tBP`O)Tiifitk7*18LRbitpJp2(qAGcVvoB1#Fn0LB+cg`N(vzeuJQ%&UNJS9x&I za;BW~*1||yrGKMBeji3{kTjUR8Xnwy++KzILW|L!^#^uHVN;)xxf#ip=;s}3H2{cO z(Y`H+^;E%{dVNe)YkX1Bz9$21AW)@(%5?k-H{?*#Q;3!}0^c^$9h;e(?a{ulXYhW` z{4FA9P~Q>g!_nybR*D$mlvs8r00pG6h)OJ9yktl$lU@b}lD9>gFa2Gb|LkD457_)? zG>?3C%y=sbO&)DInN9`P5GQ1I4)*PA6@`il@wd>)*F2o-$7CP@-AzGz-X6-=3rrLqE7G>1lw$W4}9L$R$k>VRGp);AIIxcNI>+Xd!T?aITp+)H@Y9p3L;D zQcq>hL`?bY;2@+3&t9!>c;qPMyy(WqmAHr$z6sDQWl*;ljS1R|-1*_wkQBftDf$mL zOKayduZ3)VGg?QgK5LIZ`twue(&#GO4Yp&JE&P8i^9cG9$;!=PejABV#Q8fzxyN5Y zUt)bVN{d!JPUXx100a@jIQ-__PJn0rOfmpY$d~BTkS~$CDPMC;XBk}65x?fe8d8+0 z-q9ZaEUxj+;OS>PvK}4*?s4!`Ef#j=7}T&veC1?g#PJxhcrt|d#kP8xt@6++vfKgf zX@1Y=_j1Sg`}lnvzn40`-@xxr^ZQuG_sjWx9=?a^_~9rzi$zRxAHF)aD3L`}E`%?R zEg}i!W#Moe6xr=*33t!%WZXU7HK8{SHEgugy{QL+-Wi6aE(64KFF+IQpqniT!<5mLS(T*-2B+heN5hVVpu@n}1wLzU`!5SYGA2O#4~{gGX} zX5|%2*6ReO6vtveXe1b`(9`Y{xF3Ym2hYLarY-AqwT1a(_a0S*_!k^UsDMi%WkS8rI+d*qvRw%a0?QIn7P&dr zPMZIWvXQzbJOSj8ntI}B{6$x2Uxr~=Y1rNuD!Gat0Qy4wLpKW9P7VjmFS>kj6%8SC znC8SlsNP$M<8Fqe&<)JsPftc*x@-LNMAlsCmjUh46rwFjQDwr5?~)!)ckp?S`lPtZ zEoA09VcHW+9y0p<6JKRvW`*De7wX+99f|*q{AWd5^B>9#UM3Eb;H3)znx=sIRp7Yq z9UXiL8Kd$WfU;J;?|Eb8H-iHQ0G*FhSKDfu8FH7_8u@5PyrlFCVqXA*K#$L3$EHuf z**Ov5c|}ad@6Rq&w;0;)o3}?*(J2ff0z>Qw^f*BKEnER6#5z2tvhFI>4G+Zq+%b+5 z%yER%Q54meFDg}sx9H3Nm=e|JzKa6U=iY~LK-jVLxg~57tIzF>lsz_m`RYTWo*p(0 z>d)c8M-L(;Duy^vfGU0Nm4FL!o9{tS`HnSuABQH`%+EDjLOuxsn58%!O+XHP?r_!D zZ#YF%UuU6;sn0d_x6zX2Wwj?xC~XI*W9rNA1Z+!RJ{iL|_2rrDl=|}HNIDyRyRtaz5R8eDyUC8hq<<^)eGg4An8jvG45l-HS%Ya!Ko0uGslJ{!Tj-zt5T&n8 zUtXag-^+S$lEg2eo~17zLd*(alj!3_>kVe&3-vxpHSWU3hQ53(ep_fg30QxjFGqfc z>;(|nAk(gbkGfluG(eq%&5LRuZlyTTy;bs89xTAGE?L1*Sa*Sq)Lb8To$M|djz#kn zhF(dJdu#Du6EYV6ad4P`Bx;ZDhaI;{zvLl-;}m&%5YAx0iF}#~7cU-hxILVOaUah$ z55os4%o~CV`km0Tn{|R?i7=~nMAc4e9-6S~P*&~Hu&VhUOP1CJ2LzH*GEIR`ZVHs= z7Knb(xr4q^2i%4MUicIc3z;W43|}aFc@{ES&Uk=FO7?PJ(F%X_AYy0-rD(^2R}15X zu!$W=P|?i}B$zu1h8H?#egiB2;A)6q&?kMV1r|V}W{#Pw5N2)M9Y%7?LWU%`j`aeC zuwz|7sFy1GF z3$bLjghQpuUELSzZ(M_V;*P`%6C?qZAE}C$qxMvCr67lB>@U%_{ZV* z4||jFyO;4&E&Fv0b;Q1;xNtJaWF;4aZu1Dp5Y@PyYiQh}JV2`L+YeBD*F3xwR5p}s z=cB_((xK{nq`mV+W{b!;GdHADG4whsyeL$`ZGaPzf`Nob13uo+Mk>gi_-ddhs#oG2 zn~UVu20(6v$9DKa6NsriLN-Xe)i+X5L_#K zD*+wjVChycCNb_Qr?f(yW&D1BkF&g=x zpyEjIUji-Km2TIk&?i{8&O{>Fi2yh*TfyD|2KF}qd!|eJ3DMZxd7#By3SvI_Ta=jF z<+nl1O7NUGeOL>w4ja4>bJug!axBTxba_eV83<^NXfekSz)YD9W5w>m!z2RWZ3RGD z`_S5+DC?hSZcpIg8qwSyy%yi8Hyf5Hdb9mCjxj&GCpzYc{5HnC6x>w#i5=xcbIf}+ z$CzKh>TYDrg#^H-5iO$ajTmG8SOJhRix5|khtw)PF$Kwns7PzV*I;3bpD!b{N`cl= zEw#5`^C1NzH<|k!vYAP~xLWLH>ItwaZg+g>pd9uTvgsY%f9>8t+kOY!#RAvZ*s`B7 zPQRAGGW;>bPvgGQV86ExUFcQ*d){xH2HCNBzmLaWO*{5f49T=(BUjnzf+o-#Z#NRb zCipv2zZvMJc04lmfKZ2>nbkX!K&7VFo0jZTFv(+@$RwY*43kV93H7^K!MjZ>c6QED zcr)iQ@AnZpSsxCHSjKcW-YU0*b3|IgbJ;bq2z(0URLbuq)Es36%XFX#J9nTp)(ho{ zAp;NAX9qvvXDTQQKg197T*pq(5|+E^_+%dLTe+q}-Ot0Hd3>8gA3{a8AuAYF%~auH zdNd{qHy$%pIJ_efy|=lMBYq^HRwe^#_+I=+E=kwmQ6!)dJqD=P>C1X2vYuP&NtSX$ zTJax;yym6ASmn~mQTPV1Eashz%KCfIIg=Cx6^2d!3sl9({a`^eowy=Z2_dS?;?=HC zR~VVacWGPTg~!C=?)n$lPXp}UKwp(-5Id#_WP)oyZ>2~Rz5vshoEa>XH)5=m;n~^_ zf~zlS6xu*S<2&!+K@`WRKj`5lOAo1f4<9g~Xo&8sTX~79GlZ)Z#>Lmr8D_6zJs+-42J`Rld-zYpP(^K9qW} zKAL|Uk>vULzTl;z3BZN<2s8}7g2i=sC=K)Ut%F*JenAI)(Sap2pNxDK^3=u`@Kw+j z6WFC*?Wo(9nLNf`%y^ED#WwqVqzMwR#VVGO5HbT#*JNpT(H<{S%6U&93L{JFpicS+ zi3+1S&=G zt5MHqAt7S|#BgZ;MfpD)PNZIh|987hX4t8ot@|0HzRy1D$zzQP7zo#h@P#JB_e0DO z7`}*)J>iA5>?I-psrB;s%t5NX_aMSIf{t>VW4<+ZM-RowM924s z`8^lk8$N|{6N~atWX;Rory#lx#s01QGlVnWaT7hQCa^eihk6%gJD-igCJkcb!2+#v zu$5a%sV_zEFU|DQt0uBb-n))lb3x#`C{lpjRz02OCf`d=e<U>S#I8UVL1beMA{&j@n1Z9mhxf%Ulg9{-;j7`_ zu{S#Kzm-LFB@Xj_2S<^cMdz@Hj?#{zjx0KtMGSYaHqf!?Skda9D>$ma%E;Y#EfEio zC4#vtv~`&|e=1^h#=~|AdDHQ7MQ{*~P~%yT=dTx9ER;or{mGMxht}8*YqB(^Zqi_> zJ6%?gH-4u#{%3FcuDlhV^t&rug-d}5xC%as-qc-~hP?46xPvCNqxPQXDr=E*7W(29 zw#qb)lAH&veu8)AvBu$mwn8a%oX~#9aZ%Zw&_>}uvdg%8H!}AtS&u#tVW!G5Im(!J zPwF1>EsbZ;IC)*OV0874SC61!IVIrPKah$^C#aK>=g-C~LOGGSo1OGwCp*k3o87As zWO}n6A4LgQpdMwa8%&IRIW%RVQ+e1--o2ad zVH`#^xnczetd4g5d6l6*?>N?`Kab#vL6Es|CHiGM)I}}XaM(`@oUAnIa@{|Q2hJ+v z?HKIG^DQC-c!5D=reUAH5e9152sZ>T^@W~n=?mT1T)(>uQZQcCJpQUgBi-?^#p--A z_2=3KPwT$WvGwXod{6 za8^H25bb0$GC*L#p;D_2!ex)CYe7V%DgayHYIbj5e;?YfTTo?iHdF>ZP$Bk^S$LJ< zA;L$8yZ)i1nB^79MZ^$d5NYR{wTgTgO8WCav$%}rdH1_R-gXh_)v@ZUU>ZAWLF*x7oniRb?opz1#q)O#l@30zbHz@a{`tY^Or3T{J{?4 z&45C9Y$leVbKue$y(d6iQ8766{@$q4UcE6bR15|R5z>eaJXv3NgKWw7I+&z{bDISO z!?Guj4gVfMNFw5PLC}rVG+Z}!e_=71z03D$b{IUAuRfqt@Kz7`>^Oc7Og=M^8a0j zffOTsATJ%ul=(gA9m|XnAH1uTnu>Ux{w zPOymIg2Tp!+NGo~&WBtpG)}8Mt!`gkETae(k&$ur>I6jimU{XkSHIc=>wU;DsmYt> znK?@_)UwP_;#d%t;N0BsN_49H79(2$Q}#TIuZ}I} zMl`9USt`uEK)j61jX03xNk8n*=6v@LCgQ3tXWcb9Eh|AhV}k}0@&HMY2x)b*t25UJ zw_0zqdhj|Wo1+dC3b2H36`A#L9+JiGPOr%g31vKR@Mv3t zuWHBTBbk?>18c9>K|MhoSiL;-3vq6XW0a#n5vSPc!saV#u(b$~;j_kaoaJ{yXfc1; z)nTIl3N+Mzjax!V!6w~7?CJT1DgELxZPVcO2tpw&1HpIS0F^#yXvyIFHX0J}RX`VpO!@ZK|Ty%sPt6`VH7r$_EW18>V1zwX)N20L|dRV z6~8T%J_o2{`h(m6*p@#?5r%L2gQT-l`hy&L#7W=wY!OS}`J)~5z4a>@&d-knCGiJ2 z9XNo#JN*Qz=(`?pZG%ZwgLxTEK;KWymKexQ2?06iyXQ;kYn<6apS3tjUz%B=5KZ|;nKgiX@j5NO3iPj7M5gI3`#_ibH@CSJazb&-x2duyF2k~WT*^rbW z5B@EGkoGmePy9jPPpbSu4#CI_YGpXq^!b~ykjitL1{YufecSLhFY2b;U=-jWgZ$ zoJq?-iV7-nJxiOL@?mfleocaz@-9|H+eJj^SB%Rty>{AQ?1eoZa5{+Kyvc&YeRc}| z^rb6EPtXcj!nYoTgXmy?N(&Ao@D!OH>nT#eg~_)TVP89=AN%eKWunDC*W-)w6q$Fw z%~K=9!^2TekqV4oOdw-yJZ1(&K}*y3v8bcSf^{}WkS?4#I7Tg->E)sqeo*wYaq`OE;LwAuBfQoe&`4K0f6G#UFIm-m{m+m6Btl>O87GzKkCN`Ai$)fbre6o25MUYOE>d(691Q3#(y(YWi|8&g z?t5Ou;m`aIHV~>m{@PunNds*93O4%V_YxP=T}1o`x>I;ptA*<5|J8ls^9vhypZJX5 z={|8Lh5&`t+_z-}rpt)$^C&@Q%5TGcq7Q_R%4R}P{D*VB6lZ`CboNMx`-C5YW+Uzs zN3minTi5~2UTLi1M-%`V{$-SQ@n~vXpf7fkY1q5X`JE;rlYve-p|uidhWo?_*b@Yu z^8hWp8|w~Wmd6Fo2bfaSHo@Fv2XimMoB%M9xzwOxVE>DQPEHrlv@r*r8(2Vo`RH4v ze#?BzLG3Lz_Pt`QjeXZ)tyi|T6YFNk4l=xc_c*BC6a#I9+9d?g#txw03WGjL3V=|1 zIh~OU^4iA*E&!QwwnoWxG3MJ^O;-|H3ZR8USeDpb+jEyy=35W*03*JN`{))F(Nss5 zfaQ9-I;CXW73=Z57aL9GIf9(wqw;Q!I+4S$ejLLdSFjuIDH}0E@WL3D;tLiSJ`SGX zjV)p0oeiBX5X#055A8Y*Cb#yLTichZ{V7fmWoW3JAihNBn2}WcnMc=0{jGTi>kH-^ z4iGA7n1U^r7sg-Vm`KL88UFjY=eZ^?LWYCi;R^3ASo^0$)WUVdqy4BNcn zM)NcngZoI-8=eO=YlV~l(?%8&!0 zap##|xEqGL|Au8cZz2Hdqo7L9LWEy1Z#Go|xa(F?^*Ev%lXAtNI|+>|UmzMuL^qVT zQNIlyB@OC5z9kw_4Xf%UPV=NZ}{i3l!L909tzo+|h zTH>#z{za@=0<_HHu`wQ+A5kV3D*K+(U*lwwYBt1Ki_AaVW~}2Gci;fJ15^}k#f$C9 zmad}P@qzvt8#N#h!2b`b>YVr@Zac91&31?S#!tbtmbg`Zc4%-qw|oYV7hVRtJmmyfoq_=ZDEB_Y9l7`DvU*~cz#d0prMqUi@aN&dQnu_hxL`#3{W!?9D z`?CIclUmkSPi?TQD~h&?foc-O^ct1X5t<7mh=hG=P)Wjxu#=fqpx$RI1yUCVFscf3dU4-U7(k<30fruHDo~C7nYOtW zd7>MfE@KFiVV~izuz^bVb*DE{?>g4&#d^rL2NUP)P-2Qw;u8fdsAn{9Df4ff6~BqE z$Z+h+**4r9tsKKhB&>mimBT*m+e3IciUzaD7hANJMSS}-d?AV~djaUxUl0zg3-g^Q zUk)rRLIu3K0ZNpKs|${!Z>`n(*hMnH#gRf~*YTv*O*wE_TPK@tVl({4Vs~pBpOTzZ zXCmd3xTx)d{$68EEJbfZmuKp0@Ql+hrbASq6x)K;#cZ*=;5jOgAzUxZe^jYA9tM%;rhX1ptbKYz$?@~HRYe&M5V0=!baBH4@RVeX%^b6l;Z|V^U>BKD&Ug77b z?T4fRWsJwn>TcraPUr^wkO`Xo{AA*2L+~VJ7;;KR_t${L;sdvmcm!ZL#nza5G!r?d z?IguW?esifso0#b&LXS_IbHeqk1*D2rz*Zq0tFniz85doRX)VJH?XdqAvUpy9){r_ z_)iI@2qvbUAVyZsPp~X}h`qWPW`%dn13NS42pF;g=+c%T41nLTGGtpzf@@)k3_mcb ze?o^3g-Us)PrZq~)oC3b%Fdr*=ks_fV!y<0@G85+6D-)dElURblRntJt!r}?vdimL zm#=ygI=t#bs{diLb3YQY6sM3Z0Z(w)B&Xq`&(S(;(qqvz`Yz-jcuP-;%g?hJFEUaM z<3;u)tnD2R+D*lqe3j1uee0|pbdw>Ew7Eqr7lf9EyTc^A&BD%4v|o(4wK4leF|e`e zub>qhvw+t_TNd!Szw?9fMw5%kbhabY6ZPf#`s`rky#p?Go<{|{JDG!beD?u3>v(xREZ zA+Qg2S0wGFo6MIR#Z6`uVuy*Z-pq@qh(7bQLl)fTPp7i_xh#lxzP8puSfD zT#Rkb0dNEXUd5{e?V*kM%M|Q}c^r-4Re?N+uxVps%hdh|0{Pi#J*cZwlc67IfM7scNX|el=8x5kJcavPBQ|t^2PQ~?7as(nm(xVCBTm{&v z<@XctMF1Rmi#NngZRGfH*13*#(pYDlfhaHknB+`2i~RTsZ~d;q$74x;8e4Tkt1w-D z4F5H^*zbNHVzV!ucWczXv>63rUwZi#k!39VT@_oz+Lwk7My06z?g-Z?@}J%gbIfq` ztIvNIlnEsj3Q%QV8V$H0u4%tpF@rUFUydedd8649_NDm%W*KtcARvc*sYLa4w%I}- zfGV-}yE6_Z66}%NfY4n;=mJ!N9zb$){&I_9TUvur*igDmq4W+Kp=}l0jzn9a^fi84 zD7gUYnD)CD0Nb+PEyeIn``zR0l=i#JNjhHBxYc2Q8_pK7^gVo&gT7PoycAHnkSK}$ zZfKd%w}Svx^lj}N%)M_4eYXsg!R*B!EB`5gS%bNffE@Jgs`{!nTj;++^K8=BX1~)F zo4qgxG}BrNPbf+ z@2@gN`F8AZ?qp@Yqv?(dtxs!NXin2zm(Q?dO6*(X*a5~W?{foCE?8oBnuKbjO20?0 za`1An3l=;712|N_L_RguT{wi#0;l)=RpxLDD$HY8uKp7B;ilGYES)1v)7=-SgXx~d zs#MYF4>YVQraPMJenr|->N8tC@(xd^^&rV_UHgaau}av;t| z4^48|ppousiIMIKh#_0244)?|)_N5>uuO8J*;_I$2G-_30bi6!?tFB|fF}vwK7@bJ zB-j1tACFm?7v}^>)ZgF_XHdL`)t!Hhm3s7thjvS zpQHm+-+vOt>?3ZCL^1c|cbef|0?yd}x+;`SGhFp2Q3{?n+eX31=7ECW*%#UsIAMf> z7XoXnGKt*ABgqpQH^W^<06XmfE}Uho)ZJME0QX^6(RFBzwQ0AAm16ApWF$FrX64(6 zko79~MD~T(YXZ`4jyn;f4a&laNNnLqLo6}Z@ZQok%EAfxYI%#bfX{(_u4$ow3 zIS8ml!wCfI3HN@cM%>8vk>8Zeh^|6+tl{u+0;KZa+V~&pujGL+LeXOH&#~uU3gicz?31P^IxQ@{RMR%XfAh z+0LOb=0mQ7kOprfWF~#V7`eDOMH(-M&{Sw*+W-0)BFzJtBGNc6F2;G;Tsq`s!`a0x z(uI0V%sP;1$=Qa1RJKAlk(bOf_gFC6Dm0xMombiZB(x9H)7J^&zm0pzV=`_hz-$6M zjQ|q_AfgmYju@ z^Ev^Pz6g3}v%acIQr6=zfz+ig=gAb%T!p#hO;fTVAtwV!tkSxH+pq$`8hY2gw zAolUdwepL=XVb;o5p8o!#qe{L>_5){s+EdCL^Ot?!o?~FA^k|x2jNTiUoE#O^F@KF zGDc|J_q!&BMB_dcgT}jK%d$EHqk_B=oH$S83sd0dpR82LBTA@3&B&XXe*i(6kpw7B z5fKUXEvOkvjMKcu8QxOYgi64MQo1bORkRfl7}*&b5RYx8oGE~|KuJ3tI=p1v1&1O| zFhe686C97@wUVmH@C%73itbBPh$0m5s79}ba>Q;k6l9E8^J3Kc|G`;Rc?CfX5D?() z>4~bl3&`wtetLm*C4TT+v##H$OI5d{?g-Ysk#G;72&2UFq9CtxU@xB1$SUf>mbbFy zLIPz>&mw!{5U!T&I!k$N*& z?=IHsu126$SBKAvuU>Z$Sz044Fr?1jnFvD`7AQpE9x_s*c3ij}emZC|gpjbY#Dysb zIEwnP=t&mU#ujy8Q7((w7p@qQoFquu7mATIvXIJxr&e{vYtW9=|^%uM3fcwfc!^;*`@od)n{@Zv%wo%Gc2>a*v=@5hv3Feg0IZKL5cV z8`0-awd?bf_4`jW_4!kw@Y>=_)7CN#-ouVrYIl<#r`g}m6K7Z<8>GNOoG}Pxi zZ@v)VUaD3C9Q>!`eSoB&w%DY&9UlS{8X_%B?w?`Y80Phb@O_MY9OHIx0%5Z>2_M4A zs1@}Bn`znOwaHz`k($I$Km$=0Ju~6qRgOkjsOm`^5zX?@KaQUsAK)~<7KQpgr0_I? zLV~_zEz}9%m;+kEjLb7GIBYzQxr3KCiK~vBS#UT3rs~6zm3e&ZDL1*fdCD;>bF+Co zJjd&=~O7yXA#76c6 zjv!%NkR-o^^R8k!C0+NM%>->@87L;elDiR~$2nNG;a{?n6jagx@?lPXR(0^%Tz$#_}*c||7G2Js6WPc=3U4kp1ti4`;{wYWL25vv* z8EZqxPZ)O+p?OljrPL3cfH*OQboh?ujSuB=wtSQ=5lBTM;oyb%*(g~~M#MK(?>UWO z@ca9K^AzBSQACh<_6U(~y!v8RAIs`ZNm6aQPX!qTWyJ)uk#$2Bkxa+hRx$mq@M-d> zC8pvD0(ypk7OJfo@=t8Pw(8fg`m?M)0o9H7pq=LZNNe@E^E5`*Y11CSe+$ICjm(el zvy&V?VCkI>@v#Vya0z6nbB%s)Ut?8xOPP;^!A{=t3Rw!L`YHg0|LcQQHQiUV+*R}; zW&|!><}-?rVmp}tB=@(ga4vzX=N7dp!{Y&Vx25H9`cln;!%8w_W#%){_~iFw`=~3! z_Q9=QpHqU{@34~4HT6X+@;fT_q@ka@87Q^sPqk?LUQpm^o2I}{e&DEUR(0xPUk=WU z>{6}WIAAjdgAjdo9G)6`YIKcvI!Bnc6-!hr@}n?JHDJT>7G8%k?7-hoH+Eo92xL~n~Z)x49C6+C{w#ysUEQw|(Wm)hVsII85GmLU|+y%1XG^u@V1 zq$}5@m4SW0Ao7r{3A=NLZc>f* zE3wa$kY?2vt1m7fz^PY8X3po0;$%*wF`u4<%Pst%w1nb2Ct~nsbdF;t7V3)FneZBO zn}Jmw=8G@5LS=YM^4fznJ)v$X9&HXe8Uc{}L*YY{aA5dru%2r?eYnH)sS>7m@qjSJ zJZpdCt$Op@;AWCNyo>h-bMt1=e^^8VLwI#;(VHw){97^)sli!Ex-A|B@9lToDRQ-=T2ehxpdKKvzi z1YgeLW3CD0^TABu&Lz>Vvc(ToN6Xysqad_bJK(ugc3e+}c%J1ogL7z~_{ec;T_9Ib zGpqo^>Bto#b9>SQll-l*w-$VRR94Etcv&0vFP>0`6i@p1xo)~XWxT~Xb%hGim`;<} zVBroMYB??_*`L7Wsf)npY5TdqMA`L^um~*C6@jP8WjXw;C}HwR=tN$_==?k?CV zc)1T8p_V;$NyaqxpW70+xYNJR&4Az2U5-`rf#SJA^{HD_2afe-gI}d>PKAVq>i`#X z%jfEs!z&o8*jC@fANeMZy;(J!mGcm>&%N(rvUxS`CkDygt^r?ruq9z>Pj|1A=eH&z zvL5HD2wu~a;6>>yC?YGbEdA9_-dc_=cnv&3PWoFMZ2HohV7OM`sqkBX$W8y)03K0_ zHm6PWCIVolEaN8g%U)qrPjDK=Qs-sn4ZJZwqNG3)V?g8mHhQ$&l9Kfq&@8B!YPN)M z^Q8mRpYaA+Wm|M)om}(NjGN38-Q*^t;N}m+mO==Bb)Q+*!+xJR$E_{H#O5I1QSQ=m z`Y*lhC~pO42qh}OaeM;|>f@I1QeyWE2_;Pt`wFx9(@O-0@op%oEgkm7#C|XuS=f(y z$+-P2xRkC;Xz>Vg1zlKynI+mO{E2_y#iJbx%Lew!ubc+9Ym5XJfhZi_AGcxHOX(| zh^%6=fN%4MV_yNiE&V^t(saoYPlL_+n?DH~IUg9>hk=O;xOO=#!sZ|X29n%~>Ve<}5E0K`_;F<1{E;)2%nOF;f6;-bHZ z9Sp>968p{9K#VNlZxOrMMFz2#broXU9WVG)Y#~$rnYnKPkC|s_4pTu__W~X;dt@5O zGKgg9S_F-J!IApFZA1buWRf5SW0K?i+1bIjR2mS&*21*-OiDq`P84@{{iF_rkFM@< z%%cv{S2ERpm=dgs5#9Jzj8PXp6dOy4`Vs?{(-<+8ux=x)eOR1wp4a@sZPHa(jJ_TH zKE%4iS(op@b8LQIYlO?uosrcaeh)?#(2I_fUESGXX95{PAO&WJH%W&vdfNon8_9Y@ zS OuEJSB3Dm5LzBeivi}w&yuqPt?dbdD3%tPcA%)=-&*UJiMP>Hq)Dwh`_SDOyL zni|j$19vh_RU^(U4`XU8A0$RAOqJc#pGER>jxdw;9%8-MQBNknppui10lbAT=7eEh zW6e6bXbR*nBJu$uA9>myW?u>zCX+D9Xtt&Uyx4VOsJC<~aCnS3oMGa+XSbTxbNIn7 z4o+d+F|7L=OyZ7&V6pqdVEEUphLH!ZHOx|lv|cG7xl56}9&qMe1{C$~z?zn0#3XGE zpFxpy*lOsgv|$wmhvT_a%_q%f`}-kwsfpi({~~9$@ghd#a-;x{-M82MVcWMo?@)!c zTK^h>&OyA12n`k8pxuTV~dusXfTVOiY9;i%u~4*K*eO!_CONw z^|!`j~#tOJGH`KY1lH+Qi5B86(j2%%K2W{N`W64% z(HGnNL*MEe^$)!T1>zri+C{?RmVanpwuto)-P#3}qW-tJ&&z(*svF!XhXWfuBOfa% zl$0nym4E2(7%#Ru)BiT}an|TP?@|B?b>DzL(h?3W831NEVxB`l4*$?()z|B03;lEG zuTB3@^F5_$NYe(exvX>-5qb}mO#j<|U1a!%W;;>(bc~>MzCx)l+m1wApmZyKTPRHg zsAKxywg&8iF?bRI89LAKV)&;2?ZFET`pzTiaITvEw>wbKfWA+5cF?z7iO~0hOMudA z9L`o`1_ga*2v9}e7Xa5r-|%BHm?3BaLOf! +2gw9$7F0XgVfj$*WMn=SMQQN^UM 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 InfAZ`1FwTkQvd(} diff --git a/tutorials/mpi-scatter-gather-and-allgather/code/avg.c b/tutorials/mpi-scatter-gather-and-allgather/code/avg.c index 6433471..a2639f5 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/code/avg.c +++ b/tutorials/mpi-scatter-gather-and-allgather/code/avg.c @@ -9,6 +9,7 @@ // #include #include +#include #include #include From f9c8851dbb32b3b755148c514d5f8732969cdd09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Setton?= Date: Thu, 10 Dec 2015 18:01:39 -0200 Subject: [PATCH 028/108] Bug fix in groups.c and add makefile `MPI_Comm_free(&prime_comm)` was being called for all processes, including those that were not in prime_comm, causing this error message: [dell:29144] *** An error occurred in MPI_Comm_free [dell:29144] *** reported by process [1086324737,8] [dell:29144] *** on communicator MPI_COMM_WORLD [dell:29144] *** MPI_ERR_COMM: invalid communicator [dell:29144] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort, [dell:29144] *** and potentially your MPI job) Also added a Makefile for this directory. --- .../code/groups | Bin 0 -> 13224 bytes .../code/groups.c | 5 ++++- .../code/makefile | 13 +++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100755 tutorials/introduction-to-groups-and-communicators/code/groups create mode 100644 tutorials/introduction-to-groups-and-communicators/code/makefile diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups b/tutorials/introduction-to-groups-and-communicators/code/groups new file mode 100755 index 0000000000000000000000000000000000000000..ff7a5e6d3dc3f3b6a955545496c0d92c217d3062 GIT binary patch literal 13224 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 Lb$xTCx&8kDD0_T> literal 0 HcmV?d00001 diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups.c b/tutorials/introduction-to-groups-and-communicators/code/groups.c index ea2cb69..db5245d 100644 --- a/tutorials/introduction-to-groups-and-communicators/code/groups.c +++ b/tutorials/introduction-to-groups-and-communicators/code/groups.c @@ -47,7 +47,10 @@ int main(int argc, char **argv) { MPI_Group_free(&world_group); MPI_Group_free(&prime_group); - MPI_Comm_free(&prime_comm); + + if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_free(&prime_comm); + } MPI_Finalize(); } diff --git a/tutorials/introduction-to-groups-and-communicators/code/makefile b/tutorials/introduction-to-groups-and-communicators/code/makefile new file mode 100644 index 0000000..60887ac --- /dev/null +++ b/tutorials/introduction-to-groups-and-communicators/code/makefile @@ -0,0 +1,13 @@ +EXECS=groups split +MPICC?=mpicc + +all: ${EXECS} + +split: split.c + ${MPICC} -o split split.c + +groups: groups.c + ${MPICC} -o groups groups.c + +clean: + rm -f ${EXECS} From f570830a2d6f35090eb5eeecac3c520eb32f3d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Setton?= Date: Thu, 10 Dec 2015 18:08:03 -0200 Subject: [PATCH 029/108] Change formatting of groups.c and split.c to match other files 1) All other C files use spaces for indentation instead of tabs; 2) All other files use instead of "mpi.h" (which makes sense since mpi.h is a library file); 3) Replaced "\t" in printf with "---" because OpenMPI considers "\n" or "\t" an end of line, and the output will be garbled. --- .../code/groups.c | 65 +++++++++--------- .../code/split | Bin 0 -> 8936 bytes .../code/split.c | 34 ++++----- 3 files changed, 49 insertions(+), 50 deletions(-) create mode 100755 tutorials/introduction-to-groups-and-communicators/code/split diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups.c b/tutorials/introduction-to-groups-and-communicators/code/groups.c index db5245d..e29edf9 100644 --- a/tutorials/introduction-to-groups-and-communicators/code/groups.c +++ b/tutorials/introduction-to-groups-and-communicators/code/groups.c @@ -6,51 +6,50 @@ // // Example using MPI_Comm_split to divide a communicator into subcommunicators // - -#include "mpi.h" #include #include +#include int main(int argc, char **argv) { - MPI_Init(NULL, NULL); + MPI_Init(NULL, NULL); - // Get the rank and size in the original communicator - int world_rank, world_size; - MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); - MPI_Comm_size(MPI_COMM_WORLD, &world_size); + // Get the rank and size in the original communicator + int world_rank, world_size; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); - // Get the group of processes in MPI_COMM_WORLD - MPI_Group world_group; - MPI_Comm_group(MPI_COMM_WORLD, &world_group); + // Get the group of processes in MPI_COMM_WORLD + MPI_Group world_group; + MPI_Comm_group(MPI_COMM_WORLD, &world_group); - int n = 7; - const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; + int n = 7; + const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; - // Construct a group containing all of the prime ranks in world_group - MPI_Group prime_group; - MPI_Group_incl(world_group, 7, ranks, &prime_group); + // Construct a group containing all of the prime ranks in world_group + MPI_Group prime_group; + MPI_Group_incl(world_group, 7, ranks, &prime_group); - // Create a new communicator based on the group - MPI_Comm prime_comm; - MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); + // Create a new communicator based on the group + MPI_Comm prime_comm; + MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); - int prime_rank = -1, prime_size = -1; - // If this rank isn't in the new communicator, it will be MPI_COMM_NULL - // Using MPI_COMM_NULL for MPI_Comm_rank or MPI_Comm_size is erroneous - if (MPI_COMM_NULL != prime_comm) { - MPI_Comm_rank(prime_comm, &prime_rank); - MPI_Comm_size(prime_comm, &prime_size); - } + int prime_rank = -1, prime_size = -1; + // If this rank isn't in the new communicator, it will be MPI_COMM_NULL + // Using MPI_COMM_NULL for MPI_Comm_rank or MPI_Comm_size is erroneous + if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_rank(prime_comm, &prime_rank); + MPI_Comm_size(prime_comm, &prime_size); + } - printf("WORLD RANK/SIZE: %d/%d \t PRIME RANK/SIZE: %d/%d\n", - world_rank, world_size, prime_rank, prime_size); + printf("WORLD RANK/SIZE: %d/%d --- PRIME RANK/SIZE: %d/%d\n", + world_rank, world_size, prime_rank, prime_size); - MPI_Group_free(&world_group); - MPI_Group_free(&prime_group); + MPI_Group_free(&world_group); + MPI_Group_free(&prime_group); - if (MPI_COMM_NULL != prime_comm) { - MPI_Comm_free(&prime_comm); - } + if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_free(&prime_comm); + } - MPI_Finalize(); + MPI_Finalize(); } diff --git a/tutorials/introduction-to-groups-and-communicators/code/split b/tutorials/introduction-to-groups-and-communicators/code/split new file mode 100755 index 0000000000000000000000000000000000000000..328ab35083ae0a948597d40747dfd560b8c92d2f GIT binary patch literal 8936 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 #include +#include int main(int argc, char **argv) { - MPI_Init(NULL, NULL); + MPI_Init(NULL, NULL); - // Get the rank and size in the original communicator - int world_rank, world_size; - MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); - MPI_Comm_size(MPI_COMM_WORLD, &world_size); + // Get the rank and size in the original communicator + int world_rank, world_size; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); - int color = world_rank / 4; // Determine color based on row + int color = world_rank / 4; // Determine color based on row - // Split the communicator based on the color and use the original rank for ordering - MPI_Comm row_comm; - MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); + // Split the communicator based on the color and use the original rank for ordering + MPI_Comm row_comm; + MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); - int row_rank, row_size; - MPI_Comm_rank(row_comm, &row_rank); - MPI_Comm_size(row_comm, &row_size); + int row_rank, row_size; + MPI_Comm_rank(row_comm, &row_rank); + MPI_Comm_size(row_comm, &row_size); - printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", - world_rank, world_size, row_rank, row_size); + printf("WORLD RANK/SIZE: %d/%d --- ROW RANK/SIZE: %d/%d\n", + world_rank, world_size, row_rank, row_size); - MPI_Comm_free(&row_comm); + MPI_Comm_free(&row_comm); - MPI_Finalize(); + MPI_Finalize(); } From 9369b27af76ba88949f4bb2867887a82bd775019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Setton?= Date: Thu, 10 Dec 2015 18:16:16 -0200 Subject: [PATCH 030/108] Typo fix: Global replace of "Github" with "GitHub" --- _layouts/post.html | 2 +- about.md | 8 ++-- index.md | 2 +- .../index.md | 2 +- .../index.md | 2 +- tutorials/mpi-hello-world/index.md | 2 +- tutorials/mpi-send-and-receive/index.md | 40 +++++++++---------- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/_layouts/post.html b/_layouts/post.html index 5157bda..55fcbbe 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -12,7 +12,7 @@

{{ page.title }}

Want to contribute?

-This site is hosted entirely on Github. This site is no longer being actively contributed to by the original author (Wes Kendall), but it was placed on Github in the hopes that others would write high-quality MPI tutorials. Click here for more information about how you can contribute. +This site is hosted entirely on GitHub. This site is no longer being actively contributed to by the original author (Wes Kendall), but it was placed on GitHub in the hopes that others would write high-quality MPI tutorials. Click here for more information about how you can contribute.

diff --git a/about.md b/about.md index 0c1bd79..0825c4d 100644 --- a/about.md +++ b/about.md @@ -7,13 +7,13 @@ This site is a collaborative space for providing tutorials about MPI (the Messag ## Contributing -This site is hosted as a static page on [Github]({{ site.github.code }}). It is no longer actively contributed to by the original author, and any potential authors are encouraged to fork the repository [here]({{ site.github.code }}) and start writing a lesson! +This site is hosted as a static page on [GitHub]({{ site.github.code }}). It is no longer actively contributed to by the original author, and any potential authors are encouraged to fork the repository [here]({{ site.github.code }}) and start writing a lesson! -Github uses Jekyll, a markdown-based blogging framework for producing static HTML pages. For an introduction on using Jekyll with Github, checkout [this article](https://help.github.com/articles/using-jekyll-with-pages/). +GitHub uses Jekyll, a markdown-based blogging framework for producing static HTML pages. For an introduction on using Jekyll with GitHub, checkout [this article](https://help.github.com/articles/using-jekyll-with-pages/). All lessons are self-contained in their own directories in the *tutorials* directory of the main repository. New tutorials should go under this directory, and any code for the tutorials should go in the *code* directory of the tutorial and provide a Makefile with executable examples. Similarly, the structure of the posts should match other tutorials. -For those that have never used Github or may feel overwhelmed about contributing a tutorial, contact Wes Kendall first at wesleykendall AT gmail DOT com. If you wish to write a tutorial with images as a Microsoft Word document or PDF, I'm happy to translate the lesson into the proper format for the site. +For those that have never used GitHub or may feel overwhelmed about contributing a tutorial, contact Wes Kendall first at wesleykendall AT gmail DOT com. If you wish to write a tutorial with images as a Microsoft Word document or PDF, I'm happy to translate the lesson into the proper format for the site. > **Note** - The tutorials on this site need to remain as informative as possible and encompass useful topics related to MPI. Before writing a tutorial, collaborate with me through email (wesleykendall AT gmail DOT com) if you want to propose a lesson to the beginning MPI tutorial. Similarly, we can also start an advanced MPI tutorial page for more advanced topics. @@ -28,7 +28,7 @@ Disappointed with the amount of freely-available content on parallel programming Dwaraka Nath is a masters graduate from Birla Institute of Technology and Science, Pilani, India. He loves blogging and occasionally does some code contributions as well. -You can find more about him on his [personal website](https://www.dwarak.in) and follow him on Github at [@dtsdwarak](https://github.com/dtsdwarak). +You can find more about him on his [personal website](https://www.dwarak.in) and follow him on GitHub at [@dtsdwarak](https://github.com/dtsdwarak). ### Wesley Bland Wesley Bland is a researcher in High Performance Computing and a contributor to both MPICH and Open MPI. He graduated from the University of Tennessee, Knoxville with his PhD under Dr. Jack Dongarra. His research involved fault tolerance at scale using MPI. After leaving the university, he went to Argonne National Laboratory where he worked under Dr. Pavan Balaji as a postdoctoral appointee and continued his fault tolerance research while working on MPICH directly. He currently works at Intel Corporation on high performance runtimes, including MPI. diff --git a/index.md b/index.md index 35d5150..b3a666b 100644 --- a/index.md +++ b/index.md @@ -12,4 +12,4 @@ Wanting to get started learning MPI? Head over to the [MPI tutorials]({{ site.ba Recommended books for learning MPI are located [here]({{ site.baseurl }}/recommended-books/). ## About -This site is no longer being actively contributed to by its original author (Wes Kendall). However, mpitutorial.com has been placed on [Github]({{ site.github.code}}) so that others can contribute high-quality content. Click [here]({{ site.baseurl }}/about/) for more details on how to contribute. +This site is no longer being actively contributed to by its original author (Wes Kendall). However, mpitutorial.com has been placed on [GitHub]({{ site.github.code}}) so that others can contribute high-quality content. Click [here]({{ site.baseurl }}/about/) for more details on how to contribute. diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index 7a55f89..04c54c6 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -9,7 +9,7 @@ redirect_from: '/introduction-to-groups-and-communicators/' In all previous tutorials, we have used the communicator `MPI_COMM_WORLD`. For simple applications, this is sufficient as we have a relatively small number of processes and we usually either want to talk to one of them at a time or all of them at a time. When applications start to get bigger, this becomes less practical and we may only want to talk to a few processes at once. In this lesson, we show how to create new communicators to communicate with a subset of the original group of processes at once. -> **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/introduction-to-groups-and-communicators/code]({{ site.github.code }}/tutorials/introduction-to-groups-and-communicators/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/introduction-to-groups-and-communicators/code]({{ site.github.code }}/tutorials/introduction-to-groups-and-communicators/code). ## Overview of communicators As we have seen when learning about collective routines, MPI allows you to talk to all processes in a communicator at once to do things like distribute data from one process to many processes using `MPI_Scatter` or perform a data reduction using `MPI_Reduce`. However, up to now, we have only used the default communicator, `MPI_COMM_WORLD`. diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index 065d9be..ac4b935 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -133,7 +133,7 @@ starcluster sshmaster mpicluster Once you are logged into the cluster, your current working directory will be `/root`. Change into the `/home/ubuntu` or `/home/sgeadmin` areas to compile code. These directories are mounted on a network file system and are viewable by all nodes in your cluster. -While you are in one of the mounted home directories, go ahead and check out the MPI tutorial code from its Github repository. The code is used by every lesson on this site: +While you are in one of the mounted home directories, go ahead and check out the MPI tutorial code from its GitHub repository. The code is used by every lesson on this site: ``` git clone git://github.com/wesleykendall/mpitutorial.git diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index 9efd13e..11dbe73 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -9,7 +9,7 @@ redirect_from: '/mpi-hello-world/' In this lesson, I will show you a basic MPI hello world application and also discuss how to run an MPI program. The lesson will cover the basics of initializing MPI and running an MPI job across several processes. This lesson is intended to work with installations of MPICH2 (specifically 1.4). If you have not installed MPICH2, please refer back to the [installing MPICH2 lesson]({{ site.baseurl }}/tutorials/installing-mpich2/). -> **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-hello-world/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-hello-world/code). ## Hello world code examples Let's dive right into the code from this lesson located in [mpi_hello_world.c]({{ site.github.code }}/tutorials/mpi-hello-world/code/mpi_hello_world.c). Below are some excerpts from the code. diff --git a/tutorials/mpi-send-and-receive/index.md b/tutorials/mpi-send-and-receive/index.md index e4d3daa..074f13b 100644 --- a/tutorials/mpi-send-and-receive/index.md +++ b/tutorials/mpi-send-and-receive/index.md @@ -7,14 +7,14 @@ tags: MPI_Recv, MPI_Send redirect_from: '/mpi-send-and-receive/' --- -Sending and receiving are the two foundational concepts of MPI. Almost every single function in MPI can be implemented with basic send and receive calls. In this lesson, I will discuss how to use MPI's blocking sending and receiving functions, and I will also overview other basic concepts associated with transmitting data using MPI. +Sending and receiving are the two foundational concepts of MPI. Almost every single function in MPI can be implemented with basic send and receive calls. In this lesson, I will discuss how to use MPI's blocking sending and receiving functions, and I will also overview other basic concepts associated with transmitting data using MPI. -> **Note** - All of the code for this site is on [Github]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). +> **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). ## Overview of sending and receiving with MPI MPI's send and receive calls operate in the following manner. First, process *A* decides a message needs to be sent to process *B*. Process A then packs up all of its necessary data into a buffer for process B. These buffers are often referred to as *envelopes* since the data is being packed into a single message before transmission (similar to how letters are packed into envelopes before transmission to the post office). After the data is packed into a buffer, the communication device (which is often a network) is responsible for routing the message to the proper location. The location of the message is defined by the process's rank. -Even though the message is routed to B, process B still has to acknowledge that it wants to receive A's data. Once it does this, the data has been transmitted. Process A is acknowledged that the data has been transmitted and may go back to work. +Even though the message is routed to B, process B still has to acknowledge that it wants to receive A's data. Once it does this, the data has been transmitted. Process A is acknowledged that the data has been transmitted and may go back to work. Sometimes there are cases when A might have to send many different types of messages to B. Instead of B having to go through extra measures to differentiate all these messages, MPI allows senders and receivers to also specify message IDs with the message (known as *tags*). When process B only requests a message with a certain tag number, messages with different tags will be buffered by the network until B is ready for them. @@ -44,28 +44,28 @@ MPI_Recv( Although this might seem like a mouthful when reading all of the arguments, they become easier to remember since almost every MPI call uses similar syntax. The first argument is the data buffer. The second and third arguments describe the count and type of elements that reside in the buffer. `MPI_Send` sends the exact count of elements, and `MPI_Recv` will receive **at most** the count of elements (more on this in the next lesson). The fourth and fifth arguments specify the rank of the sending/receiving process and the tag of the message. The sixth argument specifies the communicator and the last argument (for `MPI_Recv` only) provides information about the received message. ## Elementary MPI datatypes -The `MPI_Send` and `MPI_Recv` functions utilize MPI Datatypes as a means to specify the structure of a message at a higher level. For example, if the process wishes to send one integer to another, it would use a count of one and a datatype of `MPI_INT`. The other elementary MPI datatypes are listed below with their equivalent C datatypes. +The `MPI_Send` and `MPI_Recv` functions utilize MPI Datatypes as a means to specify the structure of a message at a higher level. For example, if the process wishes to send one integer to another, it would use a count of one and a datatype of `MPI_INT`. The other elementary MPI datatypes are listed below with their equivalent C datatypes. | MPI datatype | C equivalent | | --- | --- | | MPI_SHORT | short int | -| MPI_INT | int | -| MPI_LONG | long int | -| MPI_LONG_LONG | long long int | -| MPI_UNSIGNED_CHAR | unsigned char | -| MPI_UNSIGNED_SHORT | unsigned short int | -| MPI_UNSIGNED | unsigned int | -| MPI_UNSIGNED_LONG | unsigned long int | -| MPI_UNSIGNED_LONG_LONG | unsigned long long int | -| MPI_FLOAT | float | -| MPI_DOUBLE | double | -| MPI_LONG_DOUBLE | long double | -| MPI_BYTE | char | +| MPI_INT | int | +| MPI_LONG | long int | +| MPI_LONG_LONG | long long int | +| MPI_UNSIGNED_CHAR | unsigned char | +| MPI_UNSIGNED_SHORT | unsigned short int | +| MPI_UNSIGNED | unsigned int | +| MPI_UNSIGNED_LONG | unsigned long int | +| MPI_UNSIGNED_LONG_LONG | unsigned long long int | +| MPI_FLOAT | float | +| MPI_DOUBLE | double | +| MPI_LONG_DOUBLE | long double | +| MPI_BYTE | char | For now, we will only make use of these datatypes in the following MPI tutorials in the beginner category. Once we have covered enough basics, you will learn how to create your own MPI datatypes for characterizing more complex types of messages. ## MPI send / recv program -As stated in the beginning, the code for this is available on [Github]({{ site.github.repo }}), and this tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). +As stated in the beginning, the code for this is available on [GitHub]({{ site.github.repo }}), and this tutorial's code is under [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code). The first example in the tutorial code is in [send_recv.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/send_recv.c). Some of the major parts of the program are shown below. @@ -91,7 +91,7 @@ if (world_rank == 0) { `MPI_Comm_rank` and `MPI_Comm_size` are first used to determine the world size along with the rank of the process. Then process zero initializes a number to the value of negative one and sends this value to process one. As you can see in the `else if` statement, process one is calling `MPI_Recv` to receive the number. It also prints off the received value. Since we are sending and receiving exactly one integer, each process requests that one `MPI_INT` be sent/received. Each process also uses a tag number of zero to identify the message. The processes could have also used the predefined constant `MPI_ANY_TAG` for the tag number since only one type of message was being transmitted. -You can run the example code by checking it out on [Github]({{ site.github.repo }}) and using the `run.py` script. +You can run the example code by checking it out on [GitHub]({{ site.github.repo }}) and using the `run.py` script. ``` >>> git clone {{ site.github.repo }} @@ -119,7 +119,7 @@ while (ping_pong_count < PING_PONG_LIMIT) { "%d to %d\n", world_rank, ping_pong_count, partner_rank); } else { - MPI_Recv(&ping_pong_count, 1, MPI_INT, partner_rank, 0, + MPI_Recv(&ping_pong_count, 1, MPI_INT, partner_rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("%d received ping_pong_count %d from %d\n", world_rank, ping_pong_count, partner_rank); @@ -153,7 +153,7 @@ This example is meant to be executed with only two processes. The processes firs 1 received ping_pong_count 10 from 0 ``` -The output of the programs on other machines will likely be different because of process scheduling. However, as you can see, process zero and one are both taking turns sending and receiving the ping pong counter to each other. +The output of the programs on other machines will likely be different because of process scheduling. However, as you can see, process zero and one are both taking turns sending and receiving the ping pong counter to each other. ## Ring Program I have included one more example of `MPI_Send` and `MPI_Recv` using more than two processes. In this example, a value is passed around by all processes in a ring-like fashion. Take a look at [ring.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/ring.c). The major portion of the code looks like this. From 1dc678c7f1d8b5c8782be1caac6ea6f35d732466 Mon Sep 17 00:00:00 2001 From: Rainier Ababao Date: Sun, 7 Feb 2016 16:44:43 -0600 Subject: [PATCH 031/108] Fix broken link to my_bcast source --- tutorials/mpi-broadcast-and-collective-communication/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index 7cedf16..6fc4b80 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -55,7 +55,7 @@ MPI_Bcast( Although the root process and receiver processes do different jobs, they all call the same `MPI_Bcast` function. When the root process (in our example, it was process zero) calls `MPI_Bcast`, the `data` variable will be sent to all other processes. When all of the receiver processes call `MPI_Bcast`, the `data` variable will be filled in with the data from the root process. ## Broadcasting with MPI_Send and MPI_Recv -At first, it might seem that `MPI_Bcast` is just a simple wrapper around `MPI_Send` and `MPI_Recv`. In fact, we can make this wrapper function right now. Our function, called `my_bcast` is located in [bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/bcast.c). It takes the same arguments as `MPI_Bcast` and looks like this: +At first, it might seem that `MPI_Bcast` is just a simple wrapper around `MPI_Send` and `MPI_Recv`. In fact, we can make this wrapper function right now. Our function, called `my_bcast` is located in [bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c). It takes the same arguments as `MPI_Bcast` and looks like this: ```cpp void my_bcast(void* data, int count, MPI_Datatype datatype, int root, @@ -156,4 +156,4 @@ Try running the code yourself and experiment at larger scales! ## Conclusions / up next Feel a little better about collective routines? In the [next MPI tutorial]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/), I go over other essential collective communication routines - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/). -For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorial/) page. \ No newline at end of file +For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorial/) page. From 89c2189a7acaf761b69b03fc6e96686a5ec991f2 Mon Sep 17 00:00:00 2001 From: Mateusz Piotrowski Date: Sun, 6 Nov 2016 17:56:26 +0100 Subject: [PATCH 032/108] Fix a typo. --- .../dynamic-receiving-with-mpi-probe-and-mpi-status/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md index bcf7c77..df24ad3 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md @@ -37,7 +37,7 @@ const int MAX_NUMBERS = 100; int numbers[MAX_NUMBERS]; int number_amount; if (world_rank == 0) { - // Pick a random amont of integers to send to process one + // Pick a random amount of integers to send to process one srand(time(NULL)); number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS; @@ -138,4 +138,4 @@ Although this example is trivial, `MPI_Probe` forms the basis of many dynamic MP ## Up next Do you feel comfortable using the standard blocking point-to-point communication routines? If so, then you already have the ability to write endless amounts of parallel applications! Let's look at a more advanced example of using the routines you have learned. Check out [the application example using MPI_Send, MPI_Recv, and MPI_Probe]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/). -Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. \ No newline at end of file +Having trouble? Confused? Feel free to leave a comment below and perhaps I or another reader can be of help. From ed8261c396c651c45cee0acc3e67d31fccbe7be0 Mon Sep 17 00:00:00 2001 From: Mateusz Piotrowski Date: Thu, 10 Nov 2016 11:05:21 +0100 Subject: [PATCH 033/108] Fix a typo in a link to /tutorials/ s/tutorial/tutorials/ --- tutorials/mpi-broadcast-and-collective-communication/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index 6fc4b80..180cce3 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -156,4 +156,4 @@ Try running the code yourself and experiment at larger scales! ## Conclusions / up next Feel a little better about collective routines? In the [next MPI tutorial]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/), I go over other essential collective communication routines - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/). -For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorial/) page. +For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorials/) page. From 6313f488d5909dca24539268fc2903b403343683 Mon Sep 17 00:00:00 2001 From: Junjie Qian Date: Thu, 15 Dec 2016 15:51:43 -0800 Subject: [PATCH 034/108] Clean memory after completion --- .../code/compare_bcast.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c b/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c index db99e96..b506e5c 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c +++ b/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c @@ -78,5 +78,6 @@ int main(int argc, char** argv) { printf("Avg MPI_Bcast time = %lf\n", total_mpi_bcast_time / num_trials); } + free(data); MPI_Finalize(); } From bc4cc29209f6960c6e6227902157a73c79afb14a Mon Sep 17 00:00:00 2001 From: Sven Reissmann Date: Mon, 16 Jan 2017 19:48:11 +0100 Subject: [PATCH 035/108] Include time.h to allow call to time() in line 43 --- tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c b/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c index 8829e80..c60247f 100644 --- a/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c +++ b/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c @@ -11,6 +11,7 @@ #include #include #include +#include // Creates an array of random numbers. Each number has a value from 0 - 1 float *create_rand_nums(int num_elements) { From af9a0ff0f47336ac31e36840eef3c95f6bfefcc8 Mon Sep 17 00:00:00 2001 From: Mateusz Piotrowski Date: Sun, 12 Mar 2017 18:31:45 +0100 Subject: [PATCH 036/108] Fix a typo. --- tutorials/running-an-mpi-cluster-within-a-lan/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index 471a55c..36223c0 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -245,7 +245,7 @@ $ mpirun -np 10 --hosts master ./cpi So can this be. The following will also run perfectly. ```bash -$ mpirun - np 10 --hosts master,slave1,slave2 ./cpi +$ mpirun -np 10 --hosts master,slave1,slave2 ./cpi # To run the program on master and slave nodes. ``` From 4935ee4fff304d51c318c7e070bbe442a7f7455f Mon Sep 17 00:00:00 2001 From: Eric Addison Date: Tue, 11 Jul 2017 06:20:30 -0500 Subject: [PATCH 037/108] Small groups typo --- tutorials/introduction-to-groups-and-communicators/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index 04c54c6..5a4a2dd 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -24,7 +24,7 @@ MPI_Comm_split( MPI_Comm* newcomm) ``` -As the name implies, `MPI_Comm_split` creates new communicators by "splitting" a communicator into a group of sub-communicators based on the input values `color` and `key`. It's important to note here that the original communicator doesn't go away, but a new communicator is created on each process. The first argument, `comm`, is the communicator that will be used as the basis for the new communicators. This could be `MPI_COMM_WORLD`, but it could be any other communicator as well. The second argument, `color`, determines to which new communicator each processes will belong. All processes which pass in the same value for `color` are assigned to the same communicator. If the `color` is `MPI_UNDEFINED`, that process won't be included in any of the new communicators. The third argument, `key`, determines the ordering (rank) within each new communicator. The process which passes in the smallest value for `color` will be rank 0, the next smallest will be rank 1, and so on. If there is a tie, the process that had the lower rank in the original communicator will be first. The final argument, `newcomm` is how MPI returns the new communicator back to the user. +As the name implies, `MPI_Comm_split` creates new communicators by "splitting" a communicator into a group of sub-communicators based on the input values `color` and `key`. It's important to note here that the original communicator doesn't go away, but a new communicator is created on each process. The first argument, `comm`, is the communicator that will be used as the basis for the new communicators. This could be `MPI_COMM_WORLD`, but it could be any other communicator as well. The second argument, `color`, determines to which new communicator each processes will belong. All processes which pass in the same value for `color` are assigned to the same communicator. If the `color` is `MPI_UNDEFINED`, that process won't be included in any of the new communicators. The third argument, `key`, determines the ordering (rank) within each new communicator. The process which passes in the smallest value for `key` will be rank 0, the next smallest will be rank 1, and so on. If there is a tie, the process that had the lower rank in the original communicator will be first. The final argument, `newcomm` is how MPI returns the new communicator back to the user. ## Example of using multiple communicators From b3e6c91c989b2141f48caa15c13653f3fd133879 Mon Sep 17 00:00:00 2001 From: Gandacov Ivan Date: Mon, 23 Oct 2017 15:26:43 +0300 Subject: [PATCH 038/108] Removed unused parameter subdomain_size in initialize_walkers function --- .../code/random_walk.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc b/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc index 84b308e..1794ec3 100644 --- a/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc +++ b/tutorials/point-to-point-communication-application-random-walk/code/random_walk.cc @@ -37,7 +37,7 @@ void decompose_domain(int domain_size, int world_rank, } void initialize_walkers(int num_walkers_per_proc, int max_walk_size, - int subdomain_start, int subdomain_size, + int subdomain_start, vector* incoming_walkers) { Walker walker; for (int i = 0; i < num_walkers_per_proc; i++) { @@ -126,7 +126,7 @@ int main(int argc, char** argv) { &subdomain_start, &subdomain_size); // Initialize walkers in your subdomain initialize_walkers(num_walkers_per_proc, max_walk_size, subdomain_start, - subdomain_size, &incoming_walkers); + &incoming_walkers); cout << "Process " << world_rank << " initiated " << num_walkers_per_proc << " walkers in subdomain " << subdomain_start << " - " From c32205569081b7d22d32f0a347c1e3a9303e1f16 Mon Sep 17 00:00:00 2001 From: "Stephen P. Cook" Date: Fri, 2 Feb 2018 11:59:58 +0000 Subject: [PATCH 039/108] Correct sample output to reflect actual code output The sample output did no previously reflect the actual output of the code (both processors were reporting the same information). This has been pointed out in a couple of comments on the tutorial page. --- tutorials/mpi-send-and-receive/index.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tutorials/mpi-send-and-receive/index.md b/tutorials/mpi-send-and-receive/index.md index 074f13b..3605cba 100644 --- a/tutorials/mpi-send-and-receive/index.md +++ b/tutorials/mpi-send-and-receive/index.md @@ -141,16 +141,16 @@ This example is meant to be executed with only two processes. The processes firs 0 received ping_pong_count 8 from 1 0 sent and incremented ping_pong_count 9 to 1 0 received ping_pong_count 10 from 1 -1 sent and incremented ping_pong_count 1 to 0 -1 received ping_pong_count 2 from 0 -1 sent and incremented ping_pong_count 3 to 0 -1 received ping_pong_count 4 from 0 -1 sent and incremented ping_pong_count 5 to 0 -1 received ping_pong_count 6 from 0 -1 sent and incremented ping_pong_count 7 to 0 -1 received ping_pong_count 8 from 0 -1 sent and incremented ping_pong_count 9 to 0 -1 received ping_pong_count 10 from 0 +1 received ping_pong_count 1 from 0 +1 sent and incremented ping_pong_count 2 to 0 +1 received ping_pong_count 3 from 0 +1 sent and incremented ping_pong_count 4 to 0 +1 received ping_pong_count 5 from 0 +1 sent and incremented ping_pong_count 6 to 0 +1 received ping_pong_count 7 from 0 +1 sent and incremented ping_pong_count 8 to 0 +1 received ping_pong_count 9 from 0 +1 sent and incremented ping_pong_count 10 to 0 ``` The output of the programs on other machines will likely be different because of process scheduling. However, as you can see, process zero and one are both taking turns sending and receiving the ping pong counter to each other. From 1a5cca731bf336fe727fbfdeddc5a251d2d34aab Mon Sep 17 00:00:00 2001 From: Anand Dyavanapalli Date: Tue, 1 May 2018 16:21:11 -0400 Subject: [PATCH 040/108] `expel` > `disseminate` I thought `expel` sounded a little strange. --- tutorials/mpi-introduction/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-introduction/index.md b/tutorials/mpi-introduction/index.md index 4580190..621f13e 100644 --- a/tutorials/mpi-introduction/index.md +++ b/tutorials/mpi-introduction/index.md @@ -13,7 +13,7 @@ Before I dive into MPI, I want to explain why I made this resource. When I was i Learning MPI was difficult for me because of three main reasons. First of all, the online resources for learning MPI were mostly outdated or not that thorough. Second, it was hard to find any resources that detailed how I could easily build or access my own cluster. And finally, the cheapest MPI book at the time of my graduate studies was a whopping 60 dollars - a hefty price for a graduate student to pay. Given how important parallel programming is in our day and time, I feel it is equally important for people to have access to better information about one of the fundamental interfaces for writing parallel applications. -Although I am by no means an MPI expert, I decided that it would be useful for me to expel all of the information I learned about MPI during graduate school in the form of easy tutorials with example code that can be executed on your *very own* cluster! I hope this resource will be a valuable tool for your career, studies, or life - because parallel programming is not only the present, it *is* the future. +Although I am by no means an MPI expert, I decided that it would be useful for me to disseminate all of the information I learned about MPI during graduate school in the form of easy tutorials with example code that can be executed on your *very own* cluster! I hope this resource will be a valuable tool for your career, studies, or life - because parallel programming is not only the present, it *is* the future. ## A brief history of MPI Before the 1990's, programmers weren't as lucky as us. Writing parallel applications for different computing architectures was a difficult and tedious task. At that time, many libraries could facilitate building parallel applications, but there was not a standard accepted way of doing it. @@ -34,4 +34,4 @@ The foundation of communication is built upon send and receive operations among There are many cases where processes may need to communicate with everyone else. For example, when a master process needs to broadcast information to all of its worker processes. In this case, it would be cumbersome to write code that does all of the sends and receives. In fact, it would often not use the network in an optimal manner. MPI can handle a wide variety of these types of *collective* communications that involve all processes. -Mixtures of point-to-point and collective communications can be used to create highly complex parallel programs. In fact, this functionality is so powerful that it is not even necessary to start describing the advanced mechanisms of MPI. We will save that until a later lesson. For now, you should work on [installing MPI on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) or [launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you already have MPI installed, great! You can head over to the [MPI Hello World lesson]({{ site.baseurl }}/tutorials/mpi-hello-world). \ No newline at end of file +Mixtures of point-to-point and collective communications can be used to create highly complex parallel programs. In fact, this functionality is so powerful that it is not even necessary to start describing the advanced mechanisms of MPI. We will save that until a later lesson. For now, you should work on [installing MPI on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) or [launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you already have MPI installed, great! You can head over to the [MPI Hello World lesson]({{ site.baseurl }}/tutorials/mpi-hello-world). From b352886a25757535ac3b152feded4bd71e4667ff Mon Sep 17 00:00:00 2001 From: GengYu Rao Date: Thu, 10 May 2018 21:22:41 +0800 Subject: [PATCH 041/108] delete binary files --- .../code/groups | Bin 13224 -> 0 bytes .../code/split | Bin 8936 -> 0 bytes .../code/all_avg | Bin 13800 -> 0 bytes .../mpi-scatter-gather-and-allgather/code/avg | Bin 13792 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 tutorials/introduction-to-groups-and-communicators/code/groups delete mode 100755 tutorials/introduction-to-groups-and-communicators/code/split delete mode 100755 tutorials/mpi-scatter-gather-and-allgather/code/all_avg delete mode 100755 tutorials/mpi-scatter-gather-and-allgather/code/avg diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups b/tutorials/introduction-to-groups-and-communicators/code/groups deleted file mode 100755 index ff7a5e6d3dc3f3b6a955545496c0d92c217d3062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13224 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 Lb$xTCx&8kDD0_T> diff --git a/tutorials/introduction-to-groups-and-communicators/code/split b/tutorials/introduction-to-groups-and-communicators/code/split deleted file mode 100755 index 328ab35083ae0a948597d40747dfd560b8c92d2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8936 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 S{VbOMQMG~jPg|lr|NjBc4phqk From 33eb2d3ffcb5299e5ac823cbd7d562e809d43c7b Mon Sep 17 00:00:00 2001 From: qunhao Date: Tue, 15 May 2018 21:28:25 +0800 Subject: [PATCH 042/108] add Chinese translation for mpi-introduction --- tutorials.md | 2 +- tutorials/mpi-introduction/index.md | 2 ++ tutorials/mpi-introduction/zh_cn.md | 39 +++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tutorials/mpi-introduction/zh_cn.md diff --git a/tutorials.md b/tutorials.md index cb6db9f..9775181 100644 --- a/tutorials.md +++ b/tutorials.md @@ -9,7 +9,7 @@ Welcome to the MPI tutorials! In these tutorials, you will learn a wide array of The tutorials assume that the reader has a basic knowledge of C, some C++, and Linux. ## Introduction and MPI installation -* [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) +* [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) ([中文版]({{ site.baseurl }}/tutorials/mpi-introduction/zh_cn)) * [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) * [Running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan/) diff --git a/tutorials/mpi-introduction/index.md b/tutorials/mpi-introduction/index.md index 621f13e..43b41d5 100644 --- a/tutorials/mpi-introduction/index.md +++ b/tutorials/mpi-introduction/index.md @@ -7,6 +7,8 @@ tags: redirect_from: '/mpi-introduction/' --- +Update: You can also read this article in [普通话]({{ site.baseurl }}/tutorials/mpi-introduction/zh_cn) + Parallel computing is now as much a part of everyone's life as personal computers, smart phones, and other technologies are. You obviously understand this, because you have embarked upon the MPI Tutorial website. Whether you are taking a class about parallel programming, learning for work, or simply learning it because it's fun, you have chosen to learn a skill that will remain incredibly valuable for years to come. In my opinion, you have also taken the right path to expanding your knowledge about parallel programming - by learning the Message Passing Interface (MPI). Although MPI is lower level than most parallel programming libraries (for example, Hadoop), it is a great foundation on which to build your knowledge of parallel programming. Before I dive into MPI, I want to explain why I made this resource. When I was in graduate school, I worked extensively with MPI. I was fortunate enough to work with important figures in the MPI community during my internships at [Argonne National Laboratory](http://www.anl.gov) and to use MPI on large supercomputing resources to do crazy things in my doctoral research. However, even with access to all of these resources and knowledgeable people, I still found that learning MPI was a difficult process. diff --git a/tutorials/mpi-introduction/zh_cn.md b/tutorials/mpi-introduction/zh_cn.md new file mode 100644 index 0000000..b6032c1 --- /dev/null +++ b/tutorials/mpi-introduction/zh_cn.md @@ -0,0 +1,39 @@ +--- +layout: post +title: MPI 教程介绍 +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/mpi-introduction/zh_cn' +--- + +分布式计算现在对于我们来说,就跟日常生活里的手机和电脑一样普及。你很明显应该认同这个观点,因为你发现了这个了不起的 MPI 教程网站!不管你是出于什么原因想学习并行编程(parallel programming),或者说分布式编程、并行编程,也许是因为课程需要,或者是工作,或者单纯地觉得好玩,我觉得你都应该选择一项在未来几年依然十分有价值的技术去学习。我觉得「消息传递接口」(Message Passing Interface, MPI)就是这样一项技术,而且学习它确实可以让你的并行编程知识变得更深厚。尽管 MPI 比大多数并行框架要更底层(比如 Hadoop),但是学习 MPI 会为你的并行编程打下良好的基础。 + +在我开始介绍 MPI 之前,我想要解释下我为什么做这个教程。当我在读研究生的时候,我大量的用到了 MPI。当我在 [Argonne National Laboratory](http://www.anl.gov) 实习的时候,我很幸运地可以跟 MPI 社区里很厉害的一些人一起工作,并且使用 MPI 在庞大的超级计算(supercomputing)集群上面做了很多疯狂的事情。然而,即使有这些资源和懂行的人可以问,我还是觉得学习 MPI 是件苦差事。 + +对我来说学习 MPI 很难主要是因为以下三个方面。第一,网上关于 MPI 的资料几乎都是过时的,或者不那么全的。第二,我想要自己简单地搭建一个可以运行 MPI 的集群环境,但是找不到这样的教程。最后,我读研究生的时候能买到的最便宜的关于 MPI 的书要60美元 - 对研究生来说太贵了。就目前分布式编程对我们生活的重要性来说,我觉得提供更好的教程能让别人学习到最基础的分布式协议之一同样重要。 + +尽管我不敢自称是 MPI 专家,我觉得以简单已读的教程形式传播这些我在研究生阶段学习到的知识还是有必要的,最重要的事,你可以根据教程在*你自己*的集群上运行 MPI 程序!我希望这个教程能对你所有帮助,也许是事业上的,也许是学习上的,或者可能是生活上的帮助 - 因为分布式编程不仅仅意味着现在,它*还是*未来! + +## MPI 的历史简介 +在 90 年代之前,程序员可没我们这么幸运。对于不同的计算架构写并发程序是一件困难而且冗长的事情。当时,很多软件库可以帮助写并发程序,但是没有一个大家都接受的标准来做这个事情。 + +在当时,大多数的并发程序只出现在科学和研究的领域。最广为接受的模型就是消息传递模型。什么是消息传递模型?它其实只是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。在实践中,并发程序用这个模型去实现特别容易。举例来说,主进程(master process)可以通过对从进程(slave process)发送一个描述工作的消息来把这个工作分配给它。另一个例子就是一个并发的排序程序可以在当前进程中对当前进程可见的(我们称作本地的,locally)数据进行排序,然后把排好序的数据发送的邻居进程上面来进行合并的操作。几乎所有的并行程序可以使用消息传递模型来描述。 + +由于当时很多软件库都用到了这个消息传递模型,但是在定义上有些微小的差异,这些库的作者以及一些其他人为了解决这个问题就在 Supercomputing 1992 大会上定义了一个消息传递接口的标准- 也就是 MPI。这个标准接口使得程序员写的并发程序可以在所有主流的并发框架中运行。并且允许他们可以使用当时已经在使用的一些流行库的特性和模型。 + +到 1994 年的时候,一个完整的接口标准定义好了(MPI-1)。我们要记住 MPI *只是*一个接口的定义而已。然后需要程序员去根据不同的架构去实现这个接口。很幸运的是,仅仅一年之后,一个完整的 MPI 实现就已经出现了。在第一个实现之后,MPI 就被大量地使用在消息传递应用程序中,并且依然是写这类程序的*标准*(de-facto)。 + + +![An accurate representation of the first MPI programmers.](../90s_nerd.jpg) +*An accurate representation of the first MPI programmers.* + +## MPI 对于消息传递模型的设计 +在开始教程之前,我会先解释一下 MPI 在消息传递模型设计上的一些经典概念。第一个概念是*通讯器*(communicator)。通讯器定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作*秩*(rank),进程间显性地通过指定秩来进行通信。 + +通信的基础建立在不同进程间发送和接收操作。一个进程可以通过指定另一个进程的秩以及一个独一无二的消息*标签*(*tag*)来发送消息给另一个进程。接受者可以发送一个接收特定标签标记的消息的请求(或者也可以完全不管标签,接收任何消息),然后依次处理接收到的数据。类似与这样的涉及一个发送者以及一个接受者的通信被称作*点对点*(point-to-point)通信。 + + +当然在很多情况下,某个进程可能需要更所有其他进程通信。比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个进程点对点的信息传递就显得很笨拙。而且事实上这样会导致网络利用率低下。MPI 有专门的接口来帮我们处理这类所有进程间的*集体性*(collective)通信。 + +把点对点通信和集体性通信这两个机制合在一起已经可以创造十分复杂的并发程序了。事实上,这两个功能已经强大到我现在不需要再介绍任何 MPI 高级的特性了,我会把那些放到后面的教程中。现在,我们可以从[在单机上安装 MPI]({{ site.baseurl }}/tutorials/installing-mpich2/)或 [启动一个 Amazon EC2 MPI 集群]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) 开始我们的 MPI 旅途了!如果你已经把 MPI 装好了,那太好了,直接开始[MPI Hello World 课程]({{ site.baseurl }}/tutorials/mpi-hello-world)这个吧。 From 611ce08e89f1539e844483dfd9692416f4d08abe Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Wed, 16 May 2018 09:33:58 -0500 Subject: [PATCH 043/108] fixup! add Chinese translation for mpi-introduction --- tutorials/mpi-introduction/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-introduction/index.md b/tutorials/mpi-introduction/index.md index 43b41d5..1798c44 100644 --- a/tutorials/mpi-introduction/index.md +++ b/tutorials/mpi-introduction/index.md @@ -4,11 +4,11 @@ title: MPI Tutorial Introduction author: Wes Kendall categories: Beginner MPI tags: +translations: zh_cn +folder: tutorials/mpi-introduction redirect_from: '/mpi-introduction/' --- -Update: You can also read this article in [普通话]({{ site.baseurl }}/tutorials/mpi-introduction/zh_cn) - Parallel computing is now as much a part of everyone's life as personal computers, smart phones, and other technologies are. You obviously understand this, because you have embarked upon the MPI Tutorial website. Whether you are taking a class about parallel programming, learning for work, or simply learning it because it's fun, you have chosen to learn a skill that will remain incredibly valuable for years to come. In my opinion, you have also taken the right path to expanding your knowledge about parallel programming - by learning the Message Passing Interface (MPI). Although MPI is lower level than most parallel programming libraries (for example, Hadoop), it is a great foundation on which to build your knowledge of parallel programming. Before I dive into MPI, I want to explain why I made this resource. When I was in graduate school, I worked extensively with MPI. I was fortunate enough to work with important figures in the MPI community during my internships at [Argonne National Laboratory](http://www.anl.gov) and to use MPI on large supercomputing resources to do crazy things in my doctoral research. However, even with access to all of these resources and knowledgeable people, I still found that learning MPI was a difficult process. From 6cf6bd5e8f3f05465bb2181a520dfa6b04dd9668 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Wed, 16 May 2018 09:33:26 -0500 Subject: [PATCH 044/108] Add ability to put translations in the page header --- _layouts/post.html | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/_layouts/post.html b/_layouts/post.html index 55fcbbe..755c3da 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -2,9 +2,32 @@ layout: default --- + +

{{ page.title }}

- Author: {{ page.author }} + Author: {{ page.author }}
+ Translations:
{{ content }} From f960fbda61040f0309fe0f63569fa88745dc9ee5 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Wed, 16 May 2018 09:45:12 -0500 Subject: [PATCH 045/108] Update config file for latest GHP requirements --- Gemfile | 8 ++++++ Gemfile.lock | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ _config.yml | 11 +++----- atom.xml | 2 +- 4 files changed, 86 insertions(+), 8 deletions(-) create mode 100755 Gemfile create mode 100644 Gemfile.lock diff --git a/Gemfile b/Gemfile new file mode 100755 index 0000000..962b96e --- /dev/null +++ b/Gemfile @@ -0,0 +1,8 @@ +source "https://rubygems.org" + +gem "jekyll" +gem "jekyll-sitemap" +gem "jekyll-gist" +gem "jekyll-feed" +gem "jekyll-paginate" +gem "jekyll-redirect-from" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..e2c04c0 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,73 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + colorator (1.1.0) + faraday (0.14.0) + multipart-post (>= 1.2, < 3) + ffi (1.9.21) + forwardable-extended (2.6.0) + jekyll (3.6.2) + addressable (~> 2.4) + colorator (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 3) + safe_yaml (~> 1.0) + jekyll-feed (0.9.2) + jekyll (~> 3.3) + jekyll-gist (1.4.1) + octokit (~> 4.2) + jekyll-paginate (1.1.0) + jekyll-redirect-from (0.13.0) + jekyll (~> 3.3) + jekyll-sass-converter (1.5.0) + sass (~> 3.4) + jekyll-sitemap (1.1.1) + jekyll (~> 3.3) + jekyll-watch (1.5.1) + listen (~> 3.0) + kramdown (1.16.2) + liquid (4.0.0) + listen (3.0.6) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9.7) + mercenary (0.3.6) + multipart-post (2.0.0) + octokit (4.8.0) + sawyer (~> 0.8.0, >= 0.5.3) + pathutil (0.16.1) + forwardable-extended (~> 2.6) + public_suffix (2.0.5) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (2.2.1) + safe_yaml (1.0.4) + sass (3.5.5) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.8.1) + addressable (>= 2.3.5, < 2.6) + faraday (~> 0.8, < 1.0) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll + jekyll-feed + jekyll-gist + jekyll-paginate + jekyll-redirect-from + jekyll-sitemap + +BUNDLED WITH + 1.16.1 diff --git a/_config.yml b/_config.yml index dff06a2..476ea30 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,6 @@ # Dependencies -markdown: redcarpet -highlighter: pygments +markdown: kramdown +highlighter: rouge # Permalinks permalink: pretty @@ -10,22 +10,19 @@ title: MPI Tutorial tagline: url: http://mpitutorial.com baseurl: '' -paginate: 1 author: name: Wes Kendall url: https://github.com/wesleykendall/ email: wesleykendall@gmail.com -gems: +plugins: - jekyll-redirect-from -redcarpet: - extensions: ['tables', 'fenced_code_blocks', 'no_intra_emphasis', 'with_toc_data', 'prettify'] # Custom vars version: 1.0.0 github: repo: https://github.com/wesleykendall/mpitutorial code: https://github.com/wesleykendall/mpitutorial/tree/gh-pages -pages_list: +pages_list: Tutorials: 'tutorials' Recommended Books: 'recommended-books' About: 'about' diff --git a/atom.xml b/atom.xml index 2e355d8..229c82d 100644 --- a/atom.xml +++ b/atom.xml @@ -1,5 +1,5 @@ --- -layout: nil +layout: null --- From a0e02b925548c666a711a5a5515254d54e04ee95 Mon Sep 17 00:00:00 2001 From: Gengbin Zheng Date: Thu, 17 May 2018 15:26:31 -0500 Subject: [PATCH 046/108] Update zh_cn.md --- tutorials/mpi-introduction/zh_cn.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tutorials/mpi-introduction/zh_cn.md b/tutorials/mpi-introduction/zh_cn.md index b6032c1..5587d76 100644 --- a/tutorials/mpi-introduction/zh_cn.md +++ b/tutorials/mpi-introduction/zh_cn.md @@ -11,9 +11,9 @@ redirect_from: '/mpi-introduction/zh_cn' 在我开始介绍 MPI 之前,我想要解释下我为什么做这个教程。当我在读研究生的时候,我大量的用到了 MPI。当我在 [Argonne National Laboratory](http://www.anl.gov) 实习的时候,我很幸运地可以跟 MPI 社区里很厉害的一些人一起工作,并且使用 MPI 在庞大的超级计算(supercomputing)集群上面做了很多疯狂的事情。然而,即使有这些资源和懂行的人可以问,我还是觉得学习 MPI 是件苦差事。 -对我来说学习 MPI 很难主要是因为以下三个方面。第一,网上关于 MPI 的资料几乎都是过时的,或者不那么全的。第二,我想要自己简单地搭建一个可以运行 MPI 的集群环境,但是找不到这样的教程。最后,我读研究生的时候能买到的最便宜的关于 MPI 的书要60美元 - 对研究生来说太贵了。就目前分布式编程对我们生活的重要性来说,我觉得提供更好的教程能让别人学习到最基础的分布式协议之一同样重要。 +对我来说学习 MPI 很难主要是因为以下三个方面。第一,网上关于 MPI 的资料几乎都是过时的,或者不那么全的。第二,我想要自己简单地搭建一个可以运行 MPI 的集群环境,但是找不到这样的教程。最后,我读研究生的时候能买到的最便宜的关于 MPI 的书要60美元 - 对研究生来说太贵了。就目前分布式编程对我们生活的重要性来说,我觉得提供一个更好的教程能让别人学习 MPI 这样一个并行编程最重要的协议同等重要。 -尽管我不敢自称是 MPI 专家,我觉得以简单已读的教程形式传播这些我在研究生阶段学习到的知识还是有必要的,最重要的事,你可以根据教程在*你自己*的集群上运行 MPI 程序!我希望这个教程能对你所有帮助,也许是事业上的,也许是学习上的,或者可能是生活上的帮助 - 因为分布式编程不仅仅意味着现在,它*还是*未来! +尽管我不敢自称是 MPI 专家,我觉得以简单易读的教程形式传播这些我在研究生阶段学习到的知识还是很有意义的一件事,你可以根据教程在*你自己*的集群上运行 MPI 程序!我希望这个教程能对你所有帮助,也许是事业上的,也许是学习上的,或者可能是生活上的帮助 - 因为分布式编程不仅仅意味着现在,它*还是*未来! ## MPI 的历史简介 在 90 年代之前,程序员可没我们这么幸运。对于不同的计算架构写并发程序是一件困难而且冗长的事情。当时,很多软件库可以帮助写并发程序,但是没有一个大家都接受的标准来做这个事情。 @@ -31,9 +31,9 @@ redirect_from: '/mpi-introduction/zh_cn' ## MPI 对于消息传递模型的设计 在开始教程之前,我会先解释一下 MPI 在消息传递模型设计上的一些经典概念。第一个概念是*通讯器*(communicator)。通讯器定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作*秩*(rank),进程间显性地通过指定秩来进行通信。 -通信的基础建立在不同进程间发送和接收操作。一个进程可以通过指定另一个进程的秩以及一个独一无二的消息*标签*(*tag*)来发送消息给另一个进程。接受者可以发送一个接收特定标签标记的消息的请求(或者也可以完全不管标签,接收任何消息),然后依次处理接收到的数据。类似与这样的涉及一个发送者以及一个接受者的通信被称作*点对点*(point-to-point)通信。 +通信的基础建立在不同进程间发送和接收操作。一个进程可以通过指定另一个进程的秩以及一个独一无二的消息*标签*(*tag*)来发送消息给另一个进程。接受者可以发送一个接收特定标签标记的消息的请求(或者也可以完全不管标签,接收任何消息),然后依次处理接收到的数据。类似这样的涉及一个发送者以及一个接受者的通信被称作*点对点*(point-to-point)通信。 -当然在很多情况下,某个进程可能需要更所有其他进程通信。比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个进程点对点的信息传递就显得很笨拙。而且事实上这样会导致网络利用率低下。MPI 有专门的接口来帮我们处理这类所有进程间的*集体性*(collective)通信。 +当然在很多情况下,某个进程可能需要跟所有其他进程通信。比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个进程点对点的信息传递就显得很笨拙。而且事实上这样会导致网络利用率低下。MPI 有专门的接口来帮我们处理这类所有进程间的*集体性*(collective)通信。 -把点对点通信和集体性通信这两个机制合在一起已经可以创造十分复杂的并发程序了。事实上,这两个功能已经强大到我现在不需要再介绍任何 MPI 高级的特性了,我会把那些放到后面的教程中。现在,我们可以从[在单机上安装 MPI]({{ site.baseurl }}/tutorials/installing-mpich2/)或 [启动一个 Amazon EC2 MPI 集群]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) 开始我们的 MPI 旅途了!如果你已经把 MPI 装好了,那太好了,直接开始[MPI Hello World 课程]({{ site.baseurl }}/tutorials/mpi-hello-world)这个吧。 +把点对点通信和集体性通信这两个机制合在一起已经可以创造十分复杂的并发程序了。事实上,这两个功能已经强大到我现在不需要再介绍任何 MPI 高级的特性了,我会把那些放到后面的教程中。现在,我们可以从[在单机上安装 MPI]({{ site.baseurl }}/tutorials/installing-mpich2/)或 [启动一个 Amazon EC2 MPI 集群]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) 开始我们的 MPI 旅途了!如果你已经把 MPI 装好了,那太好了,直接开始这个[MPI Hello World 课程]({{ site.baseurl }}/tutorials/mpi-hello-world)吧。 From 402e2c0c5796e83976c190fdf70b3e864cf376e9 Mon Sep 17 00:00:00 2001 From: cckn1ght Date: Thu, 17 May 2018 22:55:06 +0800 Subject: [PATCH 047/108] add Chinese translation for mpi-send-and-receive & mpi-hello-world --- .gitignore | 2 +- _layouts/post.html | 10 +- tutorials.md | 4 +- tutorials/mpi-hello-world/index.md | 4 +- tutorials/mpi-hello-world/zh_cn.md | 177 +++++++++++++++++++++ tutorials/mpi-introduction/index.md | 1 - tutorials/mpi-introduction/zh_cn.md | 2 +- tutorials/mpi-send-and-receive/index.md | 1 + tutorials/mpi-send-and-receive/zh_cn.md | 201 ++++++++++++++++++++++++ 9 files changed, 391 insertions(+), 11 deletions(-) create mode 100644 tutorials/mpi-hello-world/zh_cn.md create mode 100644 tutorials/mpi-send-and-receive/zh_cn.md diff --git a/.gitignore b/.gitignore index 51fd70d..9103000 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ _site/ *.swp *.swo -*.o +*.o \ No newline at end of file diff --git a/_layouts/post.html b/_layouts/post.html index 755c3da..7d6a247 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -4,17 +4,19 @@ +
{{ content }} diff --git a/tutorials.md b/tutorials.md index 9775181..36ea2cd 100644 --- a/tutorials.md +++ b/tutorials.md @@ -13,10 +13,10 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L * [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) * [Running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan/) -* [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) +* [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) ([中文版]({{ site.baseurl }}/tutorials/mpi-hello-world/zh_cn)) ## Blocking point-to-point communication -* [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) +* [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) ([中文版]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn)) * [Dynamic receiving with MPI_Probe and MPI_Status]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) * [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index 11dbe73..775b7d8 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -3,6 +3,7 @@ layout: post title: MPI Hello World author: Wes Kendall categories: Beginner MPI +translations: zh_cn tags: MPI_Comm_rank, MPI_Comm_size, MPI_Finalize, MPI_Get_processor_name, MPI_Init redirect_from: '/mpi-hello-world/' --- @@ -36,8 +37,7 @@ int main(int argc, char** argv) { MPI_Get_processor_name(processor_name, &name_len); // Print off a hello world message - printf("Hello world from processor %s, rank %d" - " out of %d processors\n", + printf("Hello world from processor %s, rank %d out of %d processors\n", processor_name, world_rank, world_size); // Finalize the MPI environment. diff --git a/tutorials/mpi-hello-world/zh_cn.md b/tutorials/mpi-hello-world/zh_cn.md new file mode 100644 index 0000000..7b61d8f --- /dev/null +++ b/tutorials/mpi-hello-world/zh_cn.md @@ -0,0 +1,177 @@ +--- +layout: post +title: MPI Hello World +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Comm_rank, MPI_Comm_size, MPI_Finalize, MPI_Get_processor_name, MPI_Init +redirect_from: '/mpi-hello-world/zh_cn' +--- + +在这个课程里,在展示一个基础的 MPI Hello World 程序的同时我会介绍一下该如何运行 MPI 程序。这节课会涵盖如何初始化 MPI 的基础内容以及让 MPI 任务跑在几个不同的进程上。这节课程的代码是在 MPICH2(当时是1.4版本)上面运行通过的。(译者在 MPCH-3.2.1 上运行程序也没有问题)。如果你还没装 MPICH2,你参考[MPICH2 安装指南]({{ site.baseurl }}/tutorials/installing-mpich2/) + +> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-hello-world/code)。 + + +## Hello world 代码案例 +让我们来看一下这节课的代码吧,完整的代码在 [mpi_hello_world.c]({{ site.github.code }}/tutorials/mpi-hello-world/code/mpi_hello_world.c)。 +下面是一些重点内容的摘录。 +```cpp +#include +#include + +int main(int argc, char** argv) { + // 初始化 MPI 环境 + MPI_Init(NULL, NULL); + + // 通过调用以下方法来得到所有可以工作的进程数量 + int world_size; + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + // 得到当前进程的秩 + int world_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + // 得到当前进程的名字 + char processor_name[MPI_MAX_PROCESSOR_NAME]; + int name_len; + MPI_Get_processor_name(processor_name, &name_len); + + // 打印一条带有当前进程名字,秩以及 + // 整个 communicator 的大小的 hello world 消息。 + printf("Hello world from processor %s, rank %d out of %d processors\n", + processor_name, world_rank, world_size); + + // 释放 MPI 的一些资源 + MPI_Finalize(); +} +``` + +你应该已经注意到搭建一个 MPI 程序的第一步是引入 `#include ` 这个头文件。然后 MPI 环境必须以以下代码来初始化: + +```cpp +MPI_Init( + int* argc, + char*** argv) +``` + +在 `MPI_Init` 的过程中,所有 MPI 的全局变量或者内部变量都会被创建。举例来说,一个通讯器 communicator 会根据所有可用的进程被创建出来(进程是我们通过 mpi 运行时的参数指定的),然后每个进程会被分配独一无二的秩 rank。当前来说,`MPI_Init` 接受的两个参数是没有用处的,不过参数的位置保留着,可能以后的实现会需要用到。 + +在 `MPI_Init` 之后,有两个主要的函数被调用到了。这两个函数是几乎所有 MPI 程序都会用到的。 + +```cpp +MPI_Comm_size( + MPI_Comm communicator, + int* size) +``` + +`MPI_Comm_size` 会返回 communicator 的大小,也就是 communicator 中可用的进程数量。在我们的例子中,`MPI_COMM_WORLD`(这个 communicator 是 MPI 帮我们生成的)这个变量包含了当前 MPI 任务中所有的进程,因此在我们的代码里的这个调用会返回所有的可用的进程数目。 + +```cpp +MPI_Comm_rank( + MPI_Comm communicator, + int* rank) +``` + +`MPI_Comm_rank` 这个函数会返回 communicator 中当前进程的 rank。 communicator 中每个进程会以此得到一个从0开始递增的数字作为 rank 值。rank 值主要是用来指定发送或者接受信息时对应的进程。 + +我们代码中使用到的一个不太常见的方法是: + +```cpp +MPI_Get_processor_name( + char* name, + int* name_length) +``` + +`MPI_Get_processor_name` 会得到当前进程实际跑的时候所在的处理器名字。 +代码中最后一个调用是: + +```cpp +MPI_Finalize() +``` +`MPI_Finalize` 是用来清理 MPI 环境的。这个调用之后就没有 MPI 函数可以被调用了。 + +## 运行 MPI hello world 程序 +现在查看以下代码文件以及代码所在的文件夹,你会看到一个 makefile。 + +``` +>>> git clone {{ site.github.repo }} +>>> cd mpitutorial/tutorials/mpi-hello-world/code +>>> cat makefile +EXECS=mpi_hello_world +MPICC?=mpicc + +all: ${EXECS} + +mpi_hello_world: mpi_hello_world.c + ${MPICC} -o mpi_hello_world mpi_hello_world.c + +clean: + rm ${EXECS} +``` + +我的 makefile 会去找 MPICC 这个环境变量。如果你把 MPICH2 装在了本地文件夹里面而不是全局 PATH 下面, 手动设置一下 MPICC 这个环境变量,把它指向你的 mpicc 二进制程序。mpicc 二进制程序其实只是对 gcc 做了一层封装,使得编译和链接所有的 MPI 程序更方便。 + +``` +>>> export MPICC=/home/kendall/bin/mpicc +>>> make +/home/kendall/bin/mpicc -o mpi_hello_world mpi_hello_world.c +``` +当你的程序编译好之后,它就可以被执行了。不过执行之前你也许会需要一些额外配置。比如如果你想要在好几个节点的集群上面跑这个 MPI 程序的话,你需要配置一个 host 文件(不是 /etc/hosts)。如果你在笔记本或者单机上运行的话,可以跳过下面这一段。 + +需要配置的 host 文件会包含你想要运行的所有节点的名称。为了运行方便,你需要确认一下所有这些节点之间能通过 SSH 通信,并且需要根据[设置认证文件这个教程]((http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html)配置不需要密码的 SSH 访问。 +我的 host 文件看起来像这样: + +``` +>>> cat host_file +cetus1 +cetus2 +cetus3 +cetus4 +``` + +为了用我提供的脚本来运行这个程序,你应该设置一个叫 MPI_HOSTS 的环境变量,把它指向 host 文件所在的位置。我的脚本会自动把这个 host 文件的配置项加到 MPI 启动命令里。如果单机跑的话就不用设这个环境变量。另外如果你的 MPI 没有装到全局环境的话,你还需要指定 MPIRUN 这个环境变量指向你的 mpirun 二进制程序。 + +准备就绪之后你就可以使用这个项目的我提供的 python 脚本来执行程序。脚本在 *tutorials* 目录下面,这个脚本可以用来跑我们这个教程里面提到的所有程序(而且它会帮你先编译一下程序)。你可以在 mpitutorial 这个文件夹的根目录下执行以下命令: + +``` +>>> export MPIRUN=/home/kendall/bin/mpirun +>>> export MPI_HOSTS=host_file +>>> cd tutorials +>>> ./run.py mpi_hello_world +/home/kendall/bin/mpirun -n 4 -f host_file ./mpi_hello_world +Hello world from processor cetus2, rank 1 out of 4 processors +Hello world from processor cetus1, rank 0 out of 4 processors +Hello world from processor cetus4, rank 3 out of 4 processors +Hello world from processor cetus3, rank 2 out of 4 processors +``` + +跟预想的一样,这个 MPI 程序运行在了我提供的所有节点上面。每个进程都被分配了一个单独的 rank,跟进程的名字一起打印出来了。你可以看到,在我们的输出的结果里,进程之间的打印顺序是任意的,因为我们的代码里并没有涉及到同步的操作。 + +我们可以在打印的内容上面那条看到脚本是如何调用 mpirun 这个程序的。mpirun 是 MPI 的实现用来启动任务的一个程序。进程会在 host 文件里指定的所有机器上面生成,MPI 程序就会在所有进程上面运行。我的脚步自定地提供了一个 *-n* 参数告诉 MPI 程序我要运行 4 个进程。你可以试着修改脚步来使用更多进程运行 MPI 程序。当心别把你的操作系统玩蹦了。:-) + +你可能会问,*"我的节点都都是双核的机器,我怎么样可以让 MPI 先在每个节点上的每个核上生成进程,再去其他的机器?* 其实方案很简单。修改一下你的 host 文件,在每个节点名字的后面加一个冒号和每个处理器有的核数就行了。比如,我在 host 文件里指定我的每个节点有2个核。 + +``` +>>> cat host_file +cetus1:2 +cetus2:2 +cetus3:2 +cetus4:2 +``` + +当我再次运行我的脚本,*哇!*,MPI 任务只在我的两个节点上生成了4个进程。 + + +``` +>>> ./run.py mpi_hello_world +/home/kendall/bin/mpirun -n 4 -f host_file ./mpi_hello_world +Hello world from processor cetus1, rank 0 out of 4 processors +Hello world from processor cetus2, rank 2 out of 4 processors +Hello world from processor cetus2, rank 3 out of 4 processors +Hello world from processor cetus1, rank 1 out of 4 processors +``` + +## 接下来 +现在你对 MPI 程序有了基本的了解。接下来可以学习基础的 *点对点* (point-to-point)通信方法了。在下节课里,我讲解了 [MPI 里基础的发送和接收函数]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)。你也可以再去 [MPI tutorials]({{ site.baseurl }}/tutorials/) 首页查看所有其他的教程。 + +有问题或者感到疑惑?欢迎在下面留言,也许我或者其他的读者可以帮到你。 diff --git a/tutorials/mpi-introduction/index.md b/tutorials/mpi-introduction/index.md index 1798c44..eef6955 100644 --- a/tutorials/mpi-introduction/index.md +++ b/tutorials/mpi-introduction/index.md @@ -5,7 +5,6 @@ author: Wes Kendall categories: Beginner MPI tags: translations: zh_cn -folder: tutorials/mpi-introduction redirect_from: '/mpi-introduction/' --- diff --git a/tutorials/mpi-introduction/zh_cn.md b/tutorials/mpi-introduction/zh_cn.md index b6032c1..c3ebb2a 100644 --- a/tutorials/mpi-introduction/zh_cn.md +++ b/tutorials/mpi-introduction/zh_cn.md @@ -26,7 +26,7 @@ redirect_from: '/mpi-introduction/zh_cn' ![An accurate representation of the first MPI programmers.](../90s_nerd.jpg) -*An accurate representation of the first MPI programmers.* +*第一批 MPI 程序员的一个真实写照* ## MPI 对于消息传递模型的设计 在开始教程之前,我会先解释一下 MPI 在消息传递模型设计上的一些经典概念。第一个概念是*通讯器*(communicator)。通讯器定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作*秩*(rank),进程间显性地通过指定秩来进行通信。 diff --git a/tutorials/mpi-send-and-receive/index.md b/tutorials/mpi-send-and-receive/index.md index 3605cba..dcdce4b 100644 --- a/tutorials/mpi-send-and-receive/index.md +++ b/tutorials/mpi-send-and-receive/index.md @@ -3,6 +3,7 @@ layout: post title: MPI Send and Receive author: Wes Kendall categories: Beginner MPI +translations: zh_cn tags: MPI_Recv, MPI_Send redirect_from: '/mpi-send-and-receive/' --- diff --git a/tutorials/mpi-send-and-receive/zh_cn.md b/tutorials/mpi-send-and-receive/zh_cn.md new file mode 100644 index 0000000..cc87c90 --- /dev/null +++ b/tutorials/mpi-send-and-receive/zh_cn.md @@ -0,0 +1,201 @@ +--- +layout: post +title: MPI Send and Receive +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Recv, MPI_Send +redirect_from: '/mpi-send-and-receive/zh_cn' +--- + +发送和接收是 MPI 里面两个基础的概念。MPI 里面几乎所有单个的方法都可以使用基础的发送和接收 API 来实现。在这节课里,我会介绍怎么使用 MPI 的同步的(或阻塞的,原文是 blocking)发送和接收方法,以及另外的一些跟使用 MPI 进行数据传输的基础概念。 + +> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code)。 + + +## MPI 的发送和接收简介 +MPI 的发送和接收方法是按以下方式进行的:开始的时候,*A* 进程决定要发送一些消息给 *B* 进程。A进程就会把需要发送给B进程的所有数据打包好,放到一个缓存里面。因为所有数据会被打包到一个大的信息里面,因此缓存常常会被比作*信封*(就像我们把好多信纸打包到一个信封里面然后再寄去邮局)。数据打包进缓存之后,通信设备(通常是网络)就需要负责把信息传递到正确的地方。这个正确的地方也就是根据特定秩确定的那个进程。 + +尽管数据已经被送达到 B 了,但是进程 B 依然需要确认它想要接收 A 的数据。一旦它确定了这点,数据就被传输成功了。进程 A 会接收到数据传递成功的信息,然后去干其他事情。 + +有时候 A 需要传递很多不同的消息给 B。为了让 B 能比较方便地区分不同的消息,MPI 运行发送者和接受者额外地指定一些信息 ID (正式名称是*标签*, *tags*)。当 B 只要求接收某种特定标签的信息的时候,其他的不是这个标签的信息会先被缓存起来,等到 B 需要的时候才会给 B。 + +把这些概念记在心里的同时,让我们来看一下 MPI 发送和接收方法的定义。 + +```cpp +MPI_Send( + void* data, + int count, + MPI_Datatype datatype, + int destination, + int tag, + MPI_Comm communicator) +``` + +```cpp +MPI_Recv( + void* data, + int count, + MPI_Datatype datatype, + int source, + int tag, + MPI_Comm communicator, + MPI_Status* status) +``` + +尽管一开始看起来参数有点多,慢慢地你会发现其实这些参数还是很好记忆的,因为大多数的 MPI 方法定义是类似的。第一个参数是数据缓存。第二个和第三个参数分别描述了数据的数量和类型。`MPI_send` 会精确地发送 count 指定的数量个元素,`MPI_Recv` 会**最多**接受 count 个元素(之后会详细讲)。第四个和第五个参数指定了发送方/接受方进程的秩以及信息的标签。第六个参数指定了使用的 communicator。`MPI_Recv` 方法特有的最后一个参数提供了接受到的信息的状态。 + +## 基础 MPI 数据结构 +`MPI_send` 和 `MPI_Recv` 方法使用了 MPI 的数据结构作为一种在更高层次指定消息结构的方法。举例来说,如果一个进程想要发送一个整数给另一个进程,它会指定 count 为 1,数据结构为 `MPI_INT`。其他的 MPI 数据结构以及它们在 C 语言里对应的结构如下: + +| MPI datatype | C equivalent | +| --- | --- | +| MPI_SHORT | short int | +| MPI_INT | int | +| MPI_LONG | long int | +| MPI_LONG_LONG | long long int | +| MPI_UNSIGNED_CHAR | unsigned char | +| MPI_UNSIGNED_SHORT | unsigned short int | +| MPI_UNSIGNED | unsigned int | +| MPI_UNSIGNED_LONG | unsigned long int | +| MPI_UNSIGNED_LONG_LONG | unsigned long long int | +| MPI_FLOAT | float | +| MPI_DOUBLE | double | +| MPI_LONG_DOUBLE | long double | +| MPI_BYTE | char | + +目前来说,我们在 beginner 栏目里面只会使用到这些基础的数据结构。当我们有了足够多的基础知识之后,你会学习到如何创建自己的 MPI 数据类型来构建更复杂的消息类型。 + +## MPI 发送 / 接收 程序 +跟开头说的一样,所有代码会在 [GitHub]({{ site.github.repo }}) 上, 这节课的代码在 [tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code)。 + +第一个例子的代码在 [send_recv.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/send_recv.c). +我们来看一下主要的部分: + +```cpp +// 得到当前进程的 rank 以及整个 communicator 的大小 +int world_rank; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +int world_size; +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +int number; +if (world_rank == 0) { + number = -1; + MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); +} else if (world_rank == 1) { + MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, + MPI_STATUS_IGNORE); + printf("Process 1 received number %d from process 0\n", + number); +} +``` + +`MPI_Comm_rank` 和 `MPI_Comm_size` 一开始是用来得到整个 communicator 空间的大小(也就是所有进程的数量)以及当前进程的秩。然后如果当前进程是 0 进程,那么我们就初始化一个数字 -1 然后把它发送给 1 进程。然后你可以看到 `else if` 条件语句里的话题,进程 1 会调用 `MPI_Recv` 去接受这个数字。然后会将接收到的数字打印出来。由于我们明确地发送接收了一个整数,因此 `MPI_INT` 数据类型被使用了。每个进程还使用了 0 作为消息标签来指定消息。由于我们这里只有一种类型的信息被传递了,因此进程也可以使用预先定义好的常量 `MPI_ANY_TAG` 来作为标签数字。 + +你可以把代码从[GitHub]({{ site.github.repo }})下载下来并运行 `run.py` 脚本. + + +``` +>>> git clone {{ site.github.repo }} +>>> cd mpitutorial/tutorials +>>> ./run.py send_recv +mpirun -n 2 ./send_recv +Process 1 received number -1 from process 0 +``` +可以看到跟我们预想的一样,进程一收到了来自进程零传递的数字 -1。 + +## MPI 乒乓程序 +接下来的程序比较有趣,是一个乒乓游戏。两个进程会一直使用 `MPI_Send` 和 `MPI_Recv` 方法来“推挡”消息,直到他们决定不玩了。 +你可以看一眼代码[ping_pong.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/ping_pong.c)。主要部分如下所示。 + +```cpp +int ping_pong_count = 0; +int partner_rank = (world_rank + 1) % 2; +while (ping_pong_count < PING_PONG_LIMIT) { + if (world_rank == ping_pong_count % 2) { + // Increment the ping pong count before you send it + ping_pong_count++; + MPI_Send(&ping_pong_count, 1, MPI_INT, partner_rank, 0, MPI_COMM_WORLD); + printf("%d sent and incremented ping_pong_count %d to %d\n", + world_rank, ping_pong_count, + partner_rank); + } else { + MPI_Recv(&ping_pong_count, 1, MPI_INT, partner_rank, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("%d received ping_pong_count %d from %d\n", + world_rank, ping_pong_count, partner_rank); + } +} +``` +这个程序是为2个进程执行而设计的。这两个进程一开始会根据我们写的一个简单的求余算法来确定各自的对手。`ping_pong_count` 一开始被初始化为0,然后每次发送消息之后会递增1。随着 `ping_pong_count` 的递增,两个进程会轮流成为发送者和接受者。最后,当我们设定的 limit 被触发的时候(我的代码里设定为10),进程就停止了发送和接收。程序的输出如下。 + +``` +>>> ./run.py ping_pong +0 sent and incremented ping_pong_count 1 to 1 +0 received ping_pong_count 2 from 1 +0 sent and incremented ping_pong_count 3 to 1 +0 received ping_pong_count 4 from 1 +0 sent and incremented ping_pong_count 5 to 1 +0 received ping_pong_count 6 from 1 +0 sent and incremented ping_pong_count 7 to 1 +0 received ping_pong_count 8 from 1 +0 sent and incremented ping_pong_count 9 to 1 +0 received ping_pong_count 10 from 1 +1 received ping_pong_count 1 from 0 +1 sent and incremented ping_pong_count 2 to 0 +1 received ping_pong_count 3 from 0 +1 sent and incremented ping_pong_count 4 to 0 +1 received ping_pong_count 5 from 0 +1 sent and incremented ping_pong_count 6 to 0 +1 received ping_pong_count 7 from 0 +1 sent and incremented ping_pong_count 8 to 0 +1 received ping_pong_count 9 from 0 +1 sent and incremented ping_pong_count 10 to 0 +``` + +这个程序在其他机器上运行的输出可能会由于进程调度的不同跟上面的不一样。不管怎么样,你可以看到,进程0和进程1在轮流发送和接收 ping_pong_count。 + +## 环程序 +我还添加了另一个使用 `MPI_Send` 和 `MPI_Recv` 的样例程序,这个程序使用到了多个进程。在这个例子里,一个值会在各个进程之间以一个环的形式传递。代码在 [ring.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/ring.c)。主要的部分如下。 + +```cpp +int token; +if (world_rank != 0) { + MPI_Recv(&token, 1, MPI_INT, world_rank - 1, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("Process %d received token %d from process %d\n", + world_rank, token, world_rank - 1); +} else { + // Set the token's value if you are process 0 + token = -1; +} +MPI_Send(&token, 1, MPI_INT, (world_rank + 1) % world_size, + 0, MPI_COMM_WORLD); + +// Now process 0 can receive from the last process. +if (world_rank == 0) { + MPI_Recv(&token, 1, MPI_INT, world_size - 1, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("Process %d received token %d from process %d\n", + world_rank, token, world_size - 1); +} +``` + +这个环程序在进程0上面初始化了一个值-1,赋值给 token。然后这个值会依次传递给每个进程。程序会在进程0从最后一个进程接收到值之后结束。如你所见,我们的逻辑避免了死锁的发生。具体来说,进程0保证了在想要接受数据之前发送了 token。所有其他的进程只是简单的调用 `MPI_Recv` (从他们的邻居进程接收数据),然后调用 `MPI_Send` (发送数据到他们的邻居进程)把数据从环上传递下去。 +`MPI_Send` 和 `MPI_Recv` 会阻塞直到数据传递完成。因为这个特性,打印出来的数据是跟数据传递的次序一样的。用5个进程的话,输出应该是这样的: + +``` +>>> ./run.py ring +Process 1 received token -1 from process 0 +Process 2 received token -1 from process 1 +Process 3 received token -1 from process 2 +Process 4 received token -1 from process 3 +Process 0 received token -1 from process 4 +``` + +如你所见,进程0先把-1这个值传递给了进程1。然后数据会在环里一直传递到进程0。 +## 接下来 + +现在你有了对于 `MPI_Send` 和 `MPI_Recv` 的基础理解,是时候对这些方法进行一些深入研究了。下节课,我会讲解[如何预估和动态地接受信息]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/)。你也可以再去 [MPI tutorials]({{ site.baseurl }}/tutorials/) 首页查看所有其他的教程。 + +有问题或者感到疑惑?欢迎在下面留言,也许我或者其他的读者可以帮到你。 \ No newline at end of file From 35b9c6448bc7eeb452368e83e82a8741e031772b Mon Sep 17 00:00:00 2001 From: cckn1ght Date: Sun, 22 Jul 2018 23:29:19 +0800 Subject: [PATCH 048/108] add zh version for mpi-broadcast-and-collective-communication --- tutorials.md | 2 +- .../index.md | 1 + .../zh_cn.md | 157 ++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 tutorials/mpi-broadcast-and-collective-communication/zh_cn.md diff --git a/tutorials.md b/tutorials.md index 36ea2cd..e277a19 100644 --- a/tutorials.md +++ b/tutorials.md @@ -21,7 +21,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L * [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) ## Basic collective communication -* [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) +* [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) ([中文版]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)) * [Common collectives - MPI_Scatter, MPI_Gather, and MPI_Allgather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/) * [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index 180cce3..c3e84b9 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -3,6 +3,7 @@ layout: post title: MPI Broadcast and Collective Communication author: Wes Kendall categories: Beginner MPI +translations: zh_cn tags: MPI_Barrier, MPI_Bcast, MPI_Wtime redirect_from: '/mpi-broadcast-and-collective-communication/' --- diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md new file mode 100644 index 0000000..082e3af --- /dev/null +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -0,0 +1,157 @@ +--- +layout: post +title: MPI 广播以及集体(collective)通信 +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Barrier, MPI_Bcast, MPI_Wtime +redirect_from: '/mpi-broadcast-and-collective-communication/zh_cn' +--- + +[MPI 教程]({{ site.baseurl }}/tutorials/) 到目前为止,我们讲解了点对点的通信,这种通信只会同时涉及两个不同的进程。这节课是我们 MPI *集体通信*(collective communication)的第一节课。集体通信指的是一个涉及 communicator 里面所有进程的一个方法。这节课我们会解释集体通信以及一个标准的方法 - broadcasting (广播)。 + +> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code)。 + +## 集体通信以及同步点 +关于集体通信需要记住的一点是它在进程间引入了同步点的概念。这意味着所有的进程在执行代码的时候必须首先*都*到达一个同步点才能继续执行后面的代码。 + +在看具体的集体通信方法之前,让我们更仔细地看一下同步这个概念。事实上,MPI 有一个特殊的函数来做同步进程的这个操作。 + +```cpp +MPI_Barrier(MPI_Comm communicator) +``` + +这个函数的名字十分贴切(Barrier,屏障)- 这个方法会构建一个屏障,任何进程都没法跨越屏障,直到所有的进程都到达屏障。这边有一个示意图。假设水平的轴代表的是程序的执行,小圆圈代表不同的进程。 + +![MPI_Barrier example](../barrier.png) + +进程0在时间点 (T 1) 首先调用 `MPI_Barrier`。然后进程0就一直等在屏障之前,之后进程1和进程3在 (T 2) 时间点到达屏障。当进程2最终在时间点 (T 3) 到达屏障的时候,其他的进程就可以在 (T 4) 时间点再次开始运行。 + +`MPI_Barrier` 在很多时候很有用。其中一个用途是用来同步一个程序,使得分布式代码中的某一部分可以被精确的计时。 + +想知道 `MPI_Barrier` 是怎么实现的么?我知道你当然想 :-) 还记得我们之前的在[发送和接收教程]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn) 里的环程序么?帮你回忆一下,我们当时写了一个在所有进程里以环的形式传递一个令牌(token)的程序。这种形式的程序是最简单的一种实现屏障的方式,因为令牌只有在所有程序都完成之后才能被传递回第一个进程。 + +关于同步最后一个要注意的地方是:始终记得每一个你调用的集体通信方法都是同步的。也就是说,如果你没法让所有进程都完成 `MPI_Barrier`,那么你也没法完成任何集体调用。如果你在没有确保所有进程都调用 `MPI_Barrier` 的情况下调用了它,那么程序会空闲下来。这对初学者来说会很迷惑,所以小心这类问题。 + +## 使用 MPI_Bcast 来进行广播 +*广播* (broadcast) 是标准的集体通信技术之一。一个广播发生的时候,一个进程会把同样一份数据传递给一个 communicator 里的所有其他进程。广播的主要用途之一是把用户输入传递给一个分布式程序,或者把一些配置参数传递给所有的进程。 + +广播的通信模式看起来像这样: + +![MPI_Bcast 模式](../broadcast_pattern.png) + +在这个例子里,进程0是我们的*根*进程,它持有一开始的数据。其他所有的进程都会从它这里接受到一份数据的副本。 + +在 MPI 里面,广播可以使用 `MPI_Bcast` 来做到。函数签名看起来像这样: + +```cpp +MPI_Bcast( + void* data, + int count, + MPI_Datatype datatype, + int root, + MPI_Comm communicator) +``` + +尽管根节点和接收节点做不同的事情,它们都是调用同样的这个 `MPI_Bcast` 函数来实现广播。当根节点(在我们的例子是节点0)调用 `MPI_Bcast` 函数的时候,`data` 变量里的值会被发送到其他的节点上。当其他的节点调用 `MPI_Bcast` 的时候,`data` 变量会被赋值成从根节点接受到的数据。 + +## 使用 MPO_Send 和 MPI_Recv 来做广播 +粗略看的话,似乎 `MPI_Bcast` 仅仅是在 `MPI_Send` 和 `MPI_Recv` 基础上进行了一层包装。事实上,我们现在就可以自己来做这层封装。我们的函数叫做 `my_bcast`,在这里可以看到: [bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c)。它跟 `MPI_Bcast` 接受一样的参数,看起来像这样: + +```cpp +void my_bcast(void* data, int count, MPI_Datatype datatype, int root, + MPI_Comm communicator) { + int world_rank; + MPI_Comm_rank(communicator, &world_rank); + int world_size; + MPI_Comm_size(communicator, &world_size); + + if (world_rank == root) { + // If we are the root process, send our data to everyone + int i; + for (i = 0; i < world_size; i++) { + if (i != world_rank) { + MPI_Send(data, count, datatype, i, 0, communicator); + } + } + } else { + // If we are a receiver process, receive the data from the root + MPI_Recv(data, count, datatype, root, 0, communicator, + MPI_STATUS_IGNORE); + } +} +``` + +根节点把数据传递给所有其他的节点,其他的节点接收根节点的数据。很简单对吧?如果你从这个 [repo]({{ site.github.code }}) *tutorials* 目录下面运行这个程序的话,输出看起来应该像这样: + + +``` +>>> cd tutorials +>>> ./run.py my_bcast +mpirun -n 4 ./my_bcast +Process 0 broadcasting data 100 +Process 2 received data 100 from root process +Process 3 received data 100 from root process +Process 1 received data 100 from root process +``` + +不管你信不信,其实我们的函数效率特别低!假设每个进程都只有一个「输出/输入」网络连接。我们的方法只是使用了进程0的一个输出连接来书传递数据。比较聪明的方法是使用一个基于树的沟通算法对网络进行更好的利用。比如这样: + +![MPI_Bcast tree](../broadcast_tree.png) + +在示意图里,进程0一开始传递数据给进程1。跟我们之前的例子类似,第二个阶段的时候进程0依旧会把数据传递给进程2。这个例子中不同的是进程1在第二阶段也会传递数据给进程3。在第二阶段,两个网络连接在同时发生了。在这个树形算法里,能够利用的网络连接每个阶段都会比前一阶段翻番,直到所有的进程接受到数据为止。 + +你觉得你能用代码把这个算法实现么?实现这个算法有点超出我们这个课的主要目的了,如果你觉得你足够勇敢的话,可以去看这本超酷的书:[Parallel Programming with MPI](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_tl?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395) 这本书里面有完整的代码。 + +## MPI_Bcast 和 MPI_Send 以及 MPI_Recv 的比较 +`MPI_Bcast` 的实现使用了一个类似的树形广播算法来获得比较好的网络利用率。我们的实现跟 `MPI_Bcast` 比起来怎么样呢?我们可以运行 `compare_bcast`,在课程代码里我们提供了这个程序 ([compare_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c))。在看代码之前,先让我们看一个 MPI 跟时间相关的函数 - `MPI_Wtime`。`MPI_Wtime` 不接收参数,它仅仅返回以浮点数形式展示的从1970-01-01到现在为止进过的秒数,跟 C 语言的 `time` 函数类似。我们可以多次调用 `MPI_Wtime` 函数,并去差值,来计算我们的代码运行的时间。 + +让我们看一下我们的比较代码: + +```cpp +for (i = 0; i < num_trials; i++) { + // Time my_bcast + // Synchronize before starting timing + MPI_Barrier(MPI_COMM_WORLD); + total_my_bcast_time -= MPI_Wtime(); + my_bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD); + // Synchronize again before obtaining final time + MPI_Barrier(MPI_COMM_WORLD); + total_my_bcast_time += MPI_Wtime(); + + // Time MPI_Bcast + MPI_Barrier(MPI_COMM_WORLD); + total_mpi_bcast_time -= MPI_Wtime(); + MPI_Bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); + total_mpi_bcast_time += MPI_Wtime(); +} +``` +代码里的 `num_trials` 是一个指明一共要运行多少次实验的变量。我们分别记录两个函数运行所需的累加时间,平均的时间会在程序结束的时候打印出来。完整的代码在 [compare_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c) + +如果你从这个 [repo]({{ site.github.code }}) *tutorials* 目录下面运行这个程序的话,输出看起来应该像这样: + +``` +>>> cd tutorials +>>> ./run.py compare_bcast +/home/kendall/bin/mpirun -n 16 -machinefile hosts ./compare_bcast 100000 10 +Data size = 400000, Trials = 10 +Avg my_bcast time = 0.510873 +Avg MPI_Bcast time = 0.126835 +``` + +我们指定了16个进程来运行代码,每次广播发送 100,000 个整数,然后每次运行跑10个循环。如你所见,我的实验使用了通过网络连接起来的16个进程,结果显示运行我们的实现和 MPI 官方的实现体现了明显的时间差异。这里是一些不同进程数目运行时候的时间差异: + +| Processors | my_bcast | MPI_Bcast | +| --- | --- | --- | +| 2 | 0.0344 | 0.0344 | +| 4 | 0.1025 | 0.0817 | +| 8 | 0.2385 | 0.1084 | +| 16 | 0.5109 | 0.1296 | + +可以看到,2个进程运行的时候是没有时间差异的。这是因为 `MPI_Bcast` 的树算法在使用两个进程的时候并没有提供额外的网络利用率。然而,进程数量稍微增加到即使只有16个的时候我们也可以看到明显的差异。 + +试着自己运行一下代码,用更多的进程试试! + +## 结论 / 接下来 +现在对集体通信接口有了更好的理解么?在[接下来的教程]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/)里,我会介绍另外的几个常用集体通信接口 - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/). +需要看所有教程的话,可以去 [MPI 教程]({{ site.baseurl }}/tutorials/) 页面。 From d2172aeb1cc0b950460f92a8da1c9bf5fe47b85f Mon Sep 17 00:00:00 2001 From: cckn1ght Date: Sun, 26 Aug 2018 20:38:18 +0800 Subject: [PATCH 049/108] add Chinese version of mpi-scatter-gather-and-allgather --- tutorials.md | 2 +- .../zh_cn.md | 2 +- tutorials/mpi-hello-world/zh_cn.md | 2 +- .../mpi-scatter-gather-and-allgather/index.md | 1 + .../mpi-scatter-gather-and-allgather/zh_cn.md | 157 ++++++++++++++++++ 5 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 tutorials/mpi-scatter-gather-and-allgather/zh_cn.md diff --git a/tutorials.md b/tutorials.md index e277a19..4be8204 100644 --- a/tutorials.md +++ b/tutorials.md @@ -22,7 +22,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L ## Basic collective communication * [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) ([中文版]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)) -* [Common collectives - MPI_Scatter, MPI_Gather, and MPI_Allgather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/) +* [Common collectives - MPI_Scatter, MPI_Gather, and MPI_Allgather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/) ([中文版]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/zh_cn)) * [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) ## Advanced collective communication diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index 082e3af..b597a94 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -153,5 +153,5 @@ Avg MPI_Bcast time = 0.126835 试着自己运行一下代码,用更多的进程试试! ## 结论 / 接下来 -现在对集体通信接口有了更好的理解么?在[接下来的教程]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/)里,我会介绍另外的几个常用集体通信接口 - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/). +现在对集体通信接口有了更好的理解么?在[接下来的教程]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/zh_cn)里,我会介绍另外的几个常用集体通信接口 - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/zh_cn). 需要看所有教程的话,可以去 [MPI 教程]({{ site.baseurl }}/tutorials/) 页面。 diff --git a/tutorials/mpi-hello-world/zh_cn.md b/tutorials/mpi-hello-world/zh_cn.md index 7b61d8f..8086380 100644 --- a/tutorials/mpi-hello-world/zh_cn.md +++ b/tutorials/mpi-hello-world/zh_cn.md @@ -172,6 +172,6 @@ Hello world from processor cetus1, rank 1 out of 4 processors ``` ## 接下来 -现在你对 MPI 程序有了基本的了解。接下来可以学习基础的 *点对点* (point-to-point)通信方法了。在下节课里,我讲解了 [MPI 里基础的发送和接收函数]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)。你也可以再去 [MPI tutorials]({{ site.baseurl }}/tutorials/) 首页查看所有其他的教程。 +现在你对 MPI 程序有了基本的了解。接下来可以学习基础的 *点对点* (point-to-point)通信方法了。在下节课里,我讲解了 [MPI 里基础的发送和接收函数]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn)。你也可以再去 [MPI tutorials]({{ site.baseurl }}/tutorials/) 首页查看所有其他的教程。 有问题或者感到疑惑?欢迎在下面留言,也许我或者其他的读者可以帮到你。 diff --git a/tutorials/mpi-scatter-gather-and-allgather/index.md b/tutorials/mpi-scatter-gather-and-allgather/index.md index b355a2b..1e3c92e 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/index.md +++ b/tutorials/mpi-scatter-gather-and-allgather/index.md @@ -4,6 +4,7 @@ title: MPI Scatter, Gather, and Allgather author: Wes Kendall categories: Beginner MPI tags: MPI_Gather, MPI_Allgather, MPI_Scatter +translations: zh_cn redirect_from: '/mpi-scatter-gather-and-allgather/' --- diff --git a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md new file mode 100644 index 0000000..6ba9a42 --- /dev/null +++ b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md @@ -0,0 +1,157 @@ +--- +layout: post +title: MPI Scatter, Gather, and Allgather +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Gather, MPI_Allgather, MPI_Scatter +redirect_from: '/mpi-scatter-gather-and-allgather/' +--- +在[之前的课程]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)里,我们讲述了集体通信的必要知识点。我们讲了基础的广播通信机制 - `MPI_Bcast`。在这节课里,我们会讲述两个额外的机制来补充集体通信的知识 - `MPI_Scatter` 以及 `MPI_Gather`。我们还会讲一个 `MPI_Gather` 的变体:`MPI_Allgather`。 + +> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/mpi-scatter-gather-and-allgather/code]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code)。 + +## MPI_Scatter 的介绍 +`MPI_Scatter` 是一个跟 `MPI_Bcast` 类似的集体通信机制(如果你对这些词汇不熟悉的话,请阅读[上一节课]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)。`MPI_Scatter` 的操作会设计一个指定的根进程,根进程会将数据发送到 communicator 里面的所有进程。`MPI_Bcast` 和 `MPI_Scatter` 的主要区别很小但是很重要。`MPI_Bcast` 给每个进程发送的是*同样*的数据,然而 `MPI_Scatter` 给每个进程发送的是*一个数组的一部分数据*。下图进一步展示了这个区别。 + +![MPI_Bcast vs MPI_Scatter](../broadcastvsscatter.png) + +在图中我们可以看到,`MPI_Bcast` 在根进程上接收一个单独的数据元素(红色的方块),然后把它复制到所有其他的进程。`MPI_Scatter` 接收一个数组,并把元素按进程的秩分发出去。第一个元素(红色方块)发往进程0,第二个元素(绿色方块)发往进程1,以此类推。尽管根进程(进程0)拥有整个数组的所有元素,`MPI_Scatter` 还是会把正确的属于进程0的元素放到这个进程的接收缓存中。下面的 `MPI_Scatter` 函数的原型。 + +```cpp +MPI_Scatter( + void* send_data, + int send_count, + MPI_Datatype send_datatype, + void* recv_data, + int recv_count, + MPI_Datatype recv_datatype, + int root, + MPI_Comm communicator) +``` + +这个函数看起来确实很大很吓人,别怕,我们来详细解释一下。第一个参数,`send_data`,是在根进程上的一个数据数组。第二个和第三个参数,`send_count` 和 `send_datatype` 分别描述了发送给每个进程的数据数量和数据类型。如果 `send_count` 是1,`send_datatype` 是 `MPI_INT`的话,进程0会得到数据里的第一个整数,以此类推。如果`send_count`是2的话,进程0会得到前两个整数,进程1会得到第三个和第四个整数,以此类推。在实践中,一般来说`send_count`会等于数组的长度除以进程的数量。除不尽怎么办?我们会在后面的课程中讲这个问题 :-)。 + +函数定义里面接收数据的参数跟发送的参数几乎相同。`recv_data` 参数是一个缓存,它里面存了`recv_count`个`recv_datatype`数据类型的元素。最后两个参数,`root` 和 `communicator` 分别指定开始分发数组的了根进程以及对应的communicator。 + +## MPI_Gather 的介绍 +`MPI_Gather` 跟 `MPI_Scatter` 是相反的。`MPI_Gather` 从好多进程里面收集数据到一个进程上面而不是从一个进程分发数据到多个进程。这个机制对很多平行算法很有用,比如并行的排序和搜索。下图是这个算法的一个示例。 + +![MPI_Gather](../gather.png) + +跟`MPI_Scatter`类似,`MPI_Gather`从其他进程收集元素到根进程上面。元素是根据接收到的进程的秩排序的。`MPI_Gather`的函数原型跟`MPI_Scatter`长的一样。 + +```cpp +MPI_Gather( + void* send_data, + int send_count, + MPI_Datatype send_datatype, + void* recv_data, + int recv_count, + MPI_Datatype recv_datatype, + int root, + MPI_Comm communicator) +``` + +在`MPI_Gather`中,只有根进程需要一个有效的接收缓存。所有其他的调用进程可以传递`NULL`给`recv_data`。另外,别忘记*recv_count*参数是从*每个进程*接收到的数据数量,而不是所有进程的数据总量之和。这一点对MPI初学者来说经常容易搞错。 + + +## 使用 `MPI_Scatter` 和 `MPI_Gather` 来计算平均数 +在[这节课的代码]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code)里,我提供了一个用来计算数组里面所有数字的平均数的样例程序([avg.c]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code/avg.c))。尽管这个程序十分简单,但是它展示了我们如何使用MPI来把工作拆分到不同的进程上,每个进程对一部分数据进行计算,然后再把每个部分计算出来的结果汇集成最终的答案。这个程序有以下几个步骤: +1. 在根进程(进程0)上生成一个充满随机数字的数组。 +2. 把所有数字用`MPI_Scatter`分发给每个进程,每个进程得到的同样多的数字。 +3. 每个进程计算它们各自得到的数字的平均数。 +4. 根进程手机所有的平均数,然后计算这个平均数的平均数,得出最后结果。 + +代码里面有 MPI 调用的主要部分如下所示: + +```cpp +if (world_rank == 0) { + rand_nums = create_rand_nums(elements_per_proc * world_size); +} + +// Create a buffer that will hold a subset of the random numbers +float *sub_rand_nums = malloc(sizeof(float) * elements_per_proc); + +// Scatter the random numbers to all processes +MPI_Scatter(rand_nums, elements_per_proc, MPI_FLOAT, sub_rand_nums, + elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); + +// Compute the average of your subset +float sub_avg = compute_avg(sub_rand_nums, elements_per_proc); +// Gather all partial averages down to the root process +float *sub_avgs = NULL; +if (world_rank == 0) { + sub_avgs = malloc(sizeof(float) * world_size); +} +MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0, + MPI_COMM_WORLD); + +// Compute the total average of all numbers. +if (world_rank == 0) { + float avg = compute_avg(sub_avgs, world_size); +} +``` + +代码开头根进程创建里一个随机数的数组。当`MPI_Scatter`被调用的时候,每个进程现在都持有`elements_per_proc`个原始数据里面的元素。每个进程计算子数组的平均数,然后根进程收集这些平均数。然后总的平均数就可以在这个小的多的平均数数组里面被计算出来。 + +如果你运行这个[repo]({{ site.github.code }})下面*tutorials*目录下的代码,输出应该跟下面的类似。注意因为数字是随机生成的,所以你的最终结果可能跟我的不一样。 + + +``` +>>> cd tutorials +>>> ./run.py avg +/home/kendall/bin/mpirun -n 4 ./avg 100 +Avg of all elements is 0.478699 +Avg computed across original data is 0.478699 +``` + +## MPI_Allgather 以及修改后的平均程序 +到目前为止,我们讲解了两个用来操作*多对一*或者*一对多*通信模式的MPI方法,也就是说多个进程要么向一个进程发送数据,要么从一个进程接收数据。很多时候发送多个元素到多个进程也很有用(也就是*多对多*通信模式)。`MPI_Allgather`就是这个作用。 + +对于分发在所有进程上的一组数据来说,`MPI_Allgather`会收集所有数据到所有进程上。从最基础的角度来看,`MPI_Allgather`相当于一个`MPI_Gather`操作之后跟着一个`MPI_Bcast`操作。下面的示意图显示了`MPI_Allgather`调用之后数据是如何分布的。 + +![MPI_Allgather](../allgather.png) + +就跟`MPI_Gather`一样,每个进程上的元素是根据他们的秩为顺序被收集起来的,只不过这次是收集到了所有进程上面。很简单吧?`MPI_Allgather`的方法定义跟`MPI_Gather`几乎一样,只不过`MPI_Allgather`不需要root这个参数来指定根节点。 + +```cpp +MPI_Allgather( + void* send_data, + int send_count, + MPI_Datatype send_datatype, + void* recv_data, + int recv_count, + MPI_Datatype recv_datatype, + MPI_Comm communicator) +``` + +我把计算平均数的代码修改成了使用`MPI_Allgather`来计算。你可以在[all_avg.c]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c)这个文件里看到源代码。主要的不同点如下所示。 + +```cpp +// Gather all partial averages down to all the processes +float *sub_avgs = (float *)malloc(sizeof(float) * world_size); +MPI_Allgather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, + MPI_COMM_WORLD); + +// Compute the total average of all numbers. +float avg = compute_avg(sub_avgs, world_size); +``` + +现在每个子平均数被`MPI_Allgather`收集到了所有进程上面。最终平均数在每个进程上面都打印出来了。样例运行之后应该跟下面的输出结果类似。 + + +``` +>>> ./run.py all_avg +/home/kendall/bin/mpirun -n 4 ./all_avg 100 +Avg of all elements from proc 1 is 0.479736 +Avg of all elements from proc 3 is 0.479736 +Avg of all elements from proc 0 is 0.479736 +Avg of all elements from proc 2 is 0.479736 +``` + +跟你注意到的一样,all_avg.c 和 avg.c 之间的唯一的区别就是 all_avg.c 使用`MPI_Allgather`把平均数在每个进程上都打印出来了。 + +## 接下来 +下节课,我会使用`MPI_Gather`和`MPI_Scatter`做一个应用程序来[进行并行等级计算]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/)。 + +你也可以在 [MPI tutorials]({{ site.baseurl }}/tutorials/) 查看所有课程。 From 96e7862805f33bc59f9ce499f027811df7953dd1 Mon Sep 17 00:00:00 2001 From: Jiale Zhi Date: Fri, 12 Oct 2018 16:23:25 -0700 Subject: [PATCH 050/108] Fix typos --- tutorials/mpi-broadcast-and-collective-communication/zh_cn.md | 2 +- tutorials/mpi-scatter-gather-and-allgather/zh_cn.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index b597a94..d7de466 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -153,5 +153,5 @@ Avg MPI_Bcast time = 0.126835 试着自己运行一下代码,用更多的进程试试! ## 结论 / 接下来 -现在对集体通信接口有了更好的理解么?在[接下来的教程]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/zh_cn)里,我会介绍另外的几个常用集体通信接口 - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/zh_cn). +现在对集体通信接口有了更好的理解么?在[接下来的教程]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/zh_cn)里,我会介绍另外的几个常用集体通信接口 - [gathering and scattering]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/zh_cn). 需要看所有教程的话,可以去 [MPI 教程]({{ site.baseurl }}/tutorials/) 页面。 diff --git a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md index 6ba9a42..24c81d4 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md +++ b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md @@ -60,7 +60,7 @@ MPI_Gather( 1. 在根进程(进程0)上生成一个充满随机数字的数组。 2. 把所有数字用`MPI_Scatter`分发给每个进程,每个进程得到的同样多的数字。 3. 每个进程计算它们各自得到的数字的平均数。 -4. 根进程手机所有的平均数,然后计算这个平均数的平均数,得出最后结果。 +4. 根进程收集所有的平均数,然后计算这个平均数的平均数,得出最后结果。 代码里面有 MPI 调用的主要部分如下所示: From 1b1f1bb5003da43817d86d5a09450ef7ac805e60 Mon Sep 17 00:00:00 2001 From: Brando Zhang <347830597@qq.com> Date: Thu, 18 Oct 2018 18:15:21 +0800 Subject: [PATCH 051/108] Fix: typo change from "MPO_Send" to "MPI_Recv" --- tutorials/mpi-broadcast-and-collective-communication/zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index b597a94..7f9ffa8 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -54,7 +54,7 @@ MPI_Bcast( 尽管根节点和接收节点做不同的事情,它们都是调用同样的这个 `MPI_Bcast` 函数来实现广播。当根节点(在我们的例子是节点0)调用 `MPI_Bcast` 函数的时候,`data` 变量里的值会被发送到其他的节点上。当其他的节点调用 `MPI_Bcast` 的时候,`data` 变量会被赋值成从根节点接受到的数据。 -## 使用 MPO_Send 和 MPI_Recv 来做广播 +## 使用 MPI_Send 和 MPI_Recv 来做广播 粗略看的话,似乎 `MPI_Bcast` 仅仅是在 `MPI_Send` 和 `MPI_Recv` 基础上进行了一层包装。事实上,我们现在就可以自己来做这层封装。我们的函数叫做 `my_bcast`,在这里可以看到: [bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c)。它跟 `MPI_Bcast` 接受一样的参数,看起来像这样: ```cpp From 619ab354806b8c71bac0cfeba0197ad9bbc4f12d Mon Sep 17 00:00:00 2001 From: Nicola Landolfi Date: Mon, 10 Dec 2018 18:28:51 +0100 Subject: [PATCH 052/108] Fix broken link to next tutorial [next MPI tutorial] and [gathering and scattering] both had a missing "/tutorials/" folder in their path. --- tutorials/mpi-broadcast-and-collective-communication/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index c3e84b9..106926f 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -155,6 +155,6 @@ As you can see, there is no difference between the two implementations at two pr Try running the code yourself and experiment at larger scales! ## Conclusions / up next -Feel a little better about collective routines? In the [next MPI tutorial]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/), I go over other essential collective communication routines - [gathering and scattering]({{ site.baseurl }}/mpi-scatter-gather-and-allgather/). +Feel a little better about collective routines? In the [next MPI tutorial]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/), I go over other essential collective communication routines - [gathering and scattering]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/). For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorials/) page. From b96de58cbce2ab8410305b4045b004c47a39b341 Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Sat, 5 Jan 2019 22:51:44 -0800 Subject: [PATCH 053/108] Parameter comments for the mpi-send-recv sample --- tutorials/mpi-send-and-receive/code/send_recv.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-send-and-receive/code/send_recv.c b/tutorials/mpi-send-and-receive/code/send_recv.c index 3c78250..1af8f40 100644 --- a/tutorials/mpi-send-and-receive/code/send_recv.c +++ b/tutorials/mpi-send-and-receive/code/send_recv.c @@ -30,9 +30,22 @@ int main(int argc, char** argv) { if (world_rank == 0) { // If we are rank 0, set the number to -1 and send it to process 1 number = -1; - MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); + MPI_Send( + /* data = */ &number, + /* count = */ 1, + /* datatype = */ MPI_INT, + /* destination = */ 1, + /* tag = */ 0, + /* communicator = */ MPI_COMM_WORLD); } else if (world_rank == 1) { - MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + MPI_Recv( + /* data = */ &number, + /* count = */ 1, + /* datatype = */ MPI_INT, + /* source = */ 0, + /* tag = */ 0, + /* communicator = */ MPI_COMM_WORLD, + /* status = */ MPI_STATUS_IGNORE); printf("Process 1 received number %d from process 0\n", number); } MPI_Finalize(); From fe8d3fd10c2846fa7cf657f37c23cbdcc52d2294 Mon Sep 17 00:00:00 2001 From: Cesar Arroyo Cardenas Date: Thu, 2 May 2019 17:50:50 -0500 Subject: [PATCH 054/108] Typo in run.py mpitutorial.com says that random_walk runs with 5 processes when using run.py it runs with 2 instead of 5. --- tutorials/run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/run.py b/tutorials/run.py index f2a407a..e3f655d 100755 --- a/tutorials/run.py +++ b/tutorials/run.py @@ -19,7 +19,7 @@ 'probe': ('dynamic-receiving-with-mpi-probe-and-mpi-status', 2), # From the point-to-point-communication-application-random-walk tutorial - 'random_walk': ('point-to-point-communication-application-random-walk', 2, ['100', '500', '20']), + 'random_walk': ('point-to-point-communication-application-random-walk', 5, ['100', '500', '20']), # From the mpi-broadcast-and-collective-communication tutorial 'my_bcast': ('mpi-broadcast-and-collective-communication', 4), From 976637670f1700ee9febc430bdeaa1ff38cdb854 Mon Sep 17 00:00:00 2001 From: indiagolph99 Date: Tue, 14 May 2019 20:53:09 +0300 Subject: [PATCH 055/108] typos in prints --- tutorials/run.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/run.py b/tutorials/run.py index e3f655d..4e90a32 100755 --- a/tutorials/run.py +++ b/tutorials/run.py @@ -43,7 +43,7 @@ program_to_run = sys.argv[1] if len(sys.argv) > 1 else None if not program_to_run in programs: - print 'Must enter program name to run. Possible programs are: {0}'.format(programs.keys()) + print('Must enter program name to run. Possible programs are: {0}'.format(programs.keys())) else: # Try to compile before running with open(os.devnull, 'wb') as devnull: @@ -60,5 +60,5 @@ if len(programs[program_to_run]) > 2: sys_call = '{0} {1}'.format(sys_call, ' '.join(programs[program_to_run][2])) - print sys_call + print(sys_call) subprocess.call([sys_call], shell=True) From 58a29a65233aba7354703a1c561e8f51fd033bc0 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Tue, 14 May 2019 16:50:00 -0700 Subject: [PATCH 056/108] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index 1f74f64..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -mpitutorial.com From 12c6151030d1795681d31c356d433f4eddff0489 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Tue, 14 May 2019 16:50:09 -0700 Subject: [PATCH 057/108] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..89259f5 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +mpitutorial.com \ No newline at end of file From 7d187af7d21e246224f7ba7b0e47762e87c5bbd9 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Tue, 14 May 2019 17:04:51 -0700 Subject: [PATCH 058/108] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index 89259f5..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -mpitutorial.com \ No newline at end of file From 71b53c1e5fe2b1d3ccc7378e69439e7a30aa6de5 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Tue, 14 May 2019 17:04:59 -0700 Subject: [PATCH 059/108] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..89259f5 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +mpitutorial.com \ No newline at end of file From 83c598298a3bcc79affefc114745471a80386c08 Mon Sep 17 00:00:00 2001 From: jed-z Date: Fri, 24 May 2019 19:38:37 +0800 Subject: [PATCH 060/108] Fix a typo in a link in zh version --- tutorials/mpi-broadcast-and-collective-communication/zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index 37a8ce7..aad8aa3 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -9,7 +9,7 @@ redirect_from: '/mpi-broadcast-and-collective-communication/zh_cn' [MPI 教程]({{ site.baseurl }}/tutorials/) 到目前为止,我们讲解了点对点的通信,这种通信只会同时涉及两个不同的进程。这节课是我们 MPI *集体通信*(collective communication)的第一节课。集体通信指的是一个涉及 communicator 里面所有进程的一个方法。这节课我们会解释集体通信以及一个标准的方法 - broadcasting (广播)。 -> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code)。 +> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/mpi-broadcast-and-collective-communication/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code)。 ## 集体通信以及同步点 关于集体通信需要记住的一点是它在进程间引入了同步点的概念。这意味着所有的进程在执行代码的时候必须首先*都*到达一个同步点才能继续执行后面的代码。 From 359ef257f7e444c4e3f10fb7baaf076ea675ee6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20K=C3=B6rner?= Date: Tue, 16 Jun 2020 22:18:26 +0200 Subject: [PATCH 061/108] correcting comment --- tutorials/mpi-send-and-receive/code/ping_pong.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-send-and-receive/code/ping_pong.c b/tutorials/mpi-send-and-receive/code/ping_pong.c index 665b0c1..776de7e 100644 --- a/tutorials/mpi-send-and-receive/code/ping_pong.c +++ b/tutorials/mpi-send-and-receive/code/ping_pong.c @@ -22,7 +22,7 @@ int main(int argc, char** argv) { int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); - // We are assuming at least 2 processes for this task + // We are assuming 2 processes for this task if (world_size != 2) { fprintf(stderr, "World size must be two for %s\n", argv[0]); MPI_Abort(MPI_COMM_WORLD, 1); From 2f5220e92fa74d2137740a8c13a0c866ff622f88 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Fri, 17 Jul 2020 12:20:19 -0400 Subject: [PATCH 062/108] Replace outdated/offensive language with more inclusive terminology --- .../index.md | 2 +- .../index.md | 4 +- tutorials/mpi-introduction/index.md | 4 +- tutorials/mpi-introduction/zh_cn.md | 2 +- .../index.md | 72 +++++++++---------- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md index df24ad3..950efbb 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md @@ -133,7 +133,7 @@ mpirun -n 2 ./probe 1 dynamically received 93 numbers from 0 ``` -Although this example is trivial, `MPI_Probe` forms the basis of many dynamic MPI applications. For example, master/slave programs will often make heavy use of `MPI_Probe` when exchanging variable-sized worker messages. As an exercise, make a wrapper around `MPI_Recv` that uses `MPI_Probe` for any dynamic applications you might write. It makes the code look much nicer :-) +Although this example is trivial, `MPI_Probe` forms the basis of many dynamic MPI applications. For example, manager/worker programs will often make heavy use of `MPI_Probe` when exchanging variable-sized worker messages. As an exercise, make a wrapper around `MPI_Recv` that uses `MPI_Probe` for any dynamic applications you might write. It makes the code look much nicer :-) ## Up next Do you feel comfortable using the standard blocking point-to-point communication routines? If so, then you already have the ability to write endless amounts of parallel applications! Let's look at a more advanced example of using the routines you have learned. Check out [the application example using MPI_Send, MPI_Recv, and MPI_Probe]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/). diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index ac4b935..44e6677 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -125,10 +125,10 @@ starcluster start mpicluster The process to start a cluster can take a bit of time depending on your configuration. After the command is complete, StarCluster will print out the available commands for accessing, stopping, and restarting your cluster. -SSH into the master node of your cluster by typing: +SSH into the manager node of your cluster by typing: ``` -starcluster sshmaster mpicluster +starcluster ssh manager mpicluster ``` Once you are logged into the cluster, your current working directory will be `/root`. Change into the `/home/ubuntu` or `/home/sgeadmin` areas to compile code. These directories are mounted on a network file system and are viewable by all nodes in your cluster. diff --git a/tutorials/mpi-introduction/index.md b/tutorials/mpi-introduction/index.md index eef6955..a7648d5 100644 --- a/tutorials/mpi-introduction/index.md +++ b/tutorials/mpi-introduction/index.md @@ -19,7 +19,7 @@ Although I am by no means an MPI expert, I decided that it would be useful for m ## A brief history of MPI Before the 1990's, programmers weren't as lucky as us. Writing parallel applications for different computing architectures was a difficult and tedious task. At that time, many libraries could facilitate building parallel applications, but there was not a standard accepted way of doing it. -During this time, most parallel applications were in the science and research domains. The model most commonly adopted by the libraries was the message passing model. What is the message passing model? All it means is that an application passes messages among processes in order to perform a task. This model works out quite well in practice for parallel applications. For example, a master process might assign work to slave processes by passing them a message that describes the work. Another example is a parallel merge sorting application that sorts data locally on processes and passes results to neighboring processes to merge sorted lists. Almost any parallel application can be expressed with the message passing model. +During this time, most parallel applications were in the science and research domains. The model most commonly adopted by the libraries was the message passing model. What is the message passing model? All it means is that an application passes messages among processes in order to perform a task. This model works out quite well in practice for parallel applications. For example, a manager process might assign work to worker processes by passing them a message that describes the work. Another example is a parallel merge sorting application that sorts data locally on processes and passes results to neighboring processes to merge sorted lists. Almost any parallel application can be expressed with the message passing model. Since most libraries at this time used the same message passing model with only minor feature differences among them, the authors of the libraries and others came together at the Supercomputing 1992 conference to define a standard interface for performing message passing - the Message Passing Interface. This standard interface would allow programmers to write parallel applications that were portable to all major parallel architectures. It would also allow them to use the features and models they were already used to using in the current popular libraries. @@ -33,6 +33,6 @@ Before starting the tutorial, I will cover a couple of the classic concepts behi The foundation of communication is built upon send and receive operations among processes. A process may send a message to another process by providing the rank of the process and a unique *tag* to identify the message. The receiver can then post a receive for a message with a given tag (or it may not even care about the tag), and then handle the data accordingly. Communications such as this which involve one sender and receiver are known as *point-to-point* communications. -There are many cases where processes may need to communicate with everyone else. For example, when a master process needs to broadcast information to all of its worker processes. In this case, it would be cumbersome to write code that does all of the sends and receives. In fact, it would often not use the network in an optimal manner. MPI can handle a wide variety of these types of *collective* communications that involve all processes. +There are many cases where processes may need to communicate with everyone else. For example, when a manager process needs to broadcast information to all of its worker processes. In this case, it would be cumbersome to write code that does all of the sends and receives. In fact, it would often not use the network in an optimal manner. MPI can handle a wide variety of these types of *collective* communications that involve all processes. Mixtures of point-to-point and collective communications can be used to create highly complex parallel programs. In fact, this functionality is so powerful that it is not even necessary to start describing the advanced mechanisms of MPI. We will save that until a later lesson. For now, you should work on [installing MPI on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) or [launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you already have MPI installed, great! You can head over to the [MPI Hello World lesson]({{ site.baseurl }}/tutorials/mpi-hello-world). diff --git a/tutorials/mpi-introduction/zh_cn.md b/tutorials/mpi-introduction/zh_cn.md index 669e385..b9e5465 100644 --- a/tutorials/mpi-introduction/zh_cn.md +++ b/tutorials/mpi-introduction/zh_cn.md @@ -18,7 +18,7 @@ redirect_from: '/mpi-introduction/zh_cn' ## MPI 的历史简介 在 90 年代之前,程序员可没我们这么幸运。对于不同的计算架构写并发程序是一件困难而且冗长的事情。当时,很多软件库可以帮助写并发程序,但是没有一个大家都接受的标准来做这个事情。 -在当时,大多数的并发程序只出现在科学和研究的领域。最广为接受的模型就是消息传递模型。什么是消息传递模型?它其实只是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。在实践中,并发程序用这个模型去实现特别容易。举例来说,主进程(master process)可以通过对从进程(slave process)发送一个描述工作的消息来把这个工作分配给它。另一个例子就是一个并发的排序程序可以在当前进程中对当前进程可见的(我们称作本地的,locally)数据进行排序,然后把排好序的数据发送的邻居进程上面来进行合并的操作。几乎所有的并行程序可以使用消息传递模型来描述。 +在当时,大多数的并发程序只出现在科学和研究的领域。最广为接受的模型就是消息传递模型。什么是消息传递模型?它其实只是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。在实践中,并发程序用这个模型去实现特别容易。举例来说,主进程(manager process)可以通过对从进程(worker process)发送一个描述工作的消息来把这个工作分配给它。另一个例子就是一个并发的排序程序可以在当前进程中对当前进程可见的(我们称作本地的,locally)数据进行排序,然后把排好序的数据发送的邻居进程上面来进行合并的操作。几乎所有的并行程序可以使用消息传递模型来描述。 由于当时很多软件库都用到了这个消息传递模型,但是在定义上有些微小的差异,这些库的作者以及一些其他人为了解决这个问题就在 Supercomputing 1992 大会上定义了一个消息传递接口的标准- 也就是 MPI。这个标准接口使得程序员写的并发程序可以在所有主流的并发框架中运行。并且允许他们可以使用当时已经在使用的一些流行库的特性和模型。 diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index 36223c0..6992bba 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -9,7 +9,7 @@ redirect_from: '/running-an-mpi-cluster-within-a-lan' Earlier, we looked at running MPI programs in a [single machine]({{ site.baseurl }}/tutorials/mpi-hello-world/) to parallel process the code, taking advantage of having more than a single core in CPU. Now, let's widen our scope a bit, taking the same from more than just one computer to a network of nodes connected together in a Local Area Network. To keep things simple, let's just consider two computers for now. It is fairly straight to implement the same with many more nodes. -As with other tutorials, I am assuming you run Linux machines. The following tutorial was tested with Ubuntu, but it should be the same with any other distribution. And also, let's consider your machine to be **master** and the other one as **client** +As with other tutorials, I am assuming you run Linux machines. The following tutorial was tested with Ubuntu, but it should be the same with any other distribution. And also, let's consider your machine to be **manager** and the other one as **worker** ## Pre-requisite @@ -24,9 +24,9 @@ You are gonna need to communicate between the computers and you don't want to ty $ cat /etc/hosts 127.0.0.1 localhost -172.50.88.34 client +172.50.88.34 worker ``` -The ```client``` here is the machine you'd like to do your computation with. Likewise, do the same about ```master``` in the client. +The ```worker``` here is the machine you'd like to do your computation with. Likewise, do the same about ```manager``` in the worker. ## Step 2: Create a new user @@ -56,15 +56,15 @@ Since the ```ssh``` server is already installed, you must be able to login to ot $ ssh-keygen -t dsa ``` -You can as well generate RSA keys. But again, it is totally up to you. If you want more security, go with RSA. Else, DSA should do just fine. Now, add the generated key to each of the other computers. In our case, the client machine. +You can as well generate RSA keys. But again, it is totally up to you. If you want more security, go with RSA. Else, DSA should do just fine. Now, add the generated key to each of the other computers. In our case, the worker machine. ```bash -$ ssh-copy-id client #ip-address may also be used +$ ssh-copy-id worker #ip-address may also be used ``` -Do the above step for each of the client machines and your own user (localhost). +Do the above step for each of the worker machines and your own user (localhost). -This will setup ```openssh-server``` for you to securely communicate with the client machines. ```ssh``` all machines once, so they get added to your list of ```known_hosts```. This is a very simple but essential step failing which passwordless ```ssh``` will be a trouble. +This will setup ```openssh-server``` for you to securely communicate with the worker machines. ```ssh``` all machines once, so they get added to your list of ```known_hosts```. This is a very simple but essential step failing which passwordless ```ssh``` will be a trouble. Now, to enable passwordless ssh, @@ -75,14 +75,14 @@ $ ssh-add ~/.ssh/id_dsa Now, assuming you've properly added your keys to other machines, you must be able to login to other machines without any password prompt. ```bash -$ ssh client +$ ssh worker ``` -> **Note** - Since I've assumed that you've created ```mpiuser``` as the common user account in all of the client machines, this should just work fine. If you've created user accounts with different names in master and client machines, you'll need to work around that. +> **Note** - Since I've assumed that you've created ```mpiuser``` as the common user account in all of the worker machines, this should just work fine. If you've created user accounts with different names in manager and worker machines, you'll need to work around that. ## Step 4: Setting up NFS -You share a directory via NFS in **master** which the **client** mounts to exchange data. +You share a directory via NFS in **manager** which the **worker** mounts to exchange data. ### NFS-Server @@ -127,7 +127,7 @@ If required, restart the ```nfs``` server $ sudo service nfs-kernel-server restart ``` -### NFS-Client +### NFS-worker Install the required packages @@ -135,7 +135,7 @@ Install the required packages $ sudo apt-get install nfs-common ``` -Create a directory in the client's machine with the samename ```cloud``` +Create a directory in the worker's machine with the samename ```cloud``` ```bash $ mkdir cloud @@ -144,7 +144,7 @@ $ mkdir cloud And now, mount the shared directory like ```bash -$ sudo mount -t nfs master:/home/mpiuser/cloud ~/cloud +$ sudo mount -t nfs manager:/home/mpiuser/cloud ~/cloud ``` To check the mounted directories, @@ -152,7 +152,7 @@ To check the mounted directories, ```bash $ df -h Filesystem Size Used Avail Use% Mounted on -master:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud +manager:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud ``` To make the mount permanent so you don't have to manually mount the shared directory everytime you do a system reboot, you can create an entry in your file systems table - i.e., ```/etc/fstab``` file like this: @@ -160,7 +160,7 @@ To make the mount permanent so you don't have to manually mount the shared direc ```bash $ cat /etc/fstab #MPI CLUSTER SETUP -master:/home/mpiuser/cloud /home/mpiuser/cloud nfs +manager:/home/mpiuser/cloud /home/mpiuser/cloud nfs ``` ## Step 5: Running MPI programs @@ -190,7 +190,7 @@ $ mpirun -np 2 ./cpi # No. of processes = 2 Now, to run it within a cluster, ```bash -$ mpirun -np 5 -hosts client,localhost ./cpi +$ mpirun -np 5 -hosts worker,localhost ./cpi #hostnames can also be substituted with ip addresses. ``` @@ -200,14 +200,14 @@ Or specify the same in a hostfile and $ mpirun -np 5 --hostfile mpi_file ./cpi ``` -This should spin up your program in all of the machines that your **master** is connected to. +This should spin up your program in all of the machines that your **manager** is connected to. ## Common errors and tips * Make sure all the machines you are trying to run the executable on, has the same version of MPI. Recommended is [MPICH2](http://www.mpich.org/downloads/). -* The ```hosts``` file of ```master``` should contain the local network IP address entries of ```master``` and all of the slave nodes. For each of the slave, you need to have the IP address entry of ```master``` and the corresponding slave node. +* The ```hosts``` file of ```manager``` should contain the local network IP address entries of ```manager``` and all of the worker nodes. For each of the workers, you need to have the IP address entry of ```manager``` and the corresponding worker node. -For e.g. a sample hostfile entry of a ```master``` node can be, +For e.g. a sample hostfile entry of a ```manager``` node can be, ```bash $ cat /etc/hosts @@ -215,14 +215,14 @@ $ cat /etc/hosts #127.0.1.1 1944 #MPI CLUSTER SETUP -172.50.88.22 master -172.50.88.56 slave1 -172.50.88.34 slave2 -172.50.88.54 slave3 -172.50.88.60 slave4 -172.50.88.46 slave5 +172.50.88.22 manager +172.50.88.56 worker1 +172.50.88.34 worker2 +172.50.88.54 worker3 +172.50.88.60 worker4 +172.50.88.46 worker5 ``` -A sample hostfile entry of ```slave3``` node can be, +A sample hostfile entry of ```worker3``` node can be, ```bash $ cat /etc/hosts @@ -230,30 +230,30 @@ $ cat /etc/hosts #127.0.1.1 1947 #MPI CLUSTER SETUP -172.50.88.22 master -172.50.88.54 slave3 +172.50.88.22 manager +172.50.88.54 worker3 ``` * Whenever you try to run a process parallely using MPI, you can either run the process locally or run it as a combination of local and remote nodes. You **cannot** invoke a process **only on other nodes**. -To make this more clear, from ```master``` node, this script can be invoked. +To make this more clear, from ```manager``` node, this script can be invoked. ```bash -$ mpirun -np 10 --hosts master ./cpi -# To run the program only on the same master node +$ mpirun -np 10 --hosts manager./cpi +# To run the program only on the same manager node ``` So can this be. The following will also run perfectly. ```bash -$ mpirun -np 10 --hosts master,slave1,slave2 ./cpi -# To run the program on master and slave nodes. +$ mpirun -np 10 --hosts manager,worker1,worker2 ./cpi +# To run the program on manager and worker nodes. ``` -But, the following is **not correct** and will result in an error if invoked from ```master```. +But, the following is **not correct** and will result in an error if invoked from ```manager```. ```bash -$ mpirun -np 10 --hosts slave1 ./cpi -# Trying to run the program only on remote slave +$ mpirun -np 10 --hosts worker1 ./cpi +# Trying to run the program only on remote worker ``` ## So, what's next? From a6f7c41566fb3b90672d169bf7afed62070ec111 Mon Sep 17 00:00:00 2001 From: matthiasbe Date: Mon, 3 Aug 2020 14:20:03 +0200 Subject: [PATCH 063/108] Typo "aplies" in group tutorial --- tutorials/introduction-to-groups-and-communicators/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index 5a4a2dd..c89acaa 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -102,7 +102,7 @@ There are other more advanced features of communicators that we do not cover her While `MPI_Comm_split` is the simplest way to create a new communicator, it isn't the only way to do so. There are more flexible ways to create communicators, but they use a new kind of MPI object, `MPI_Group`. Before going into lots of detail about groups, let's look a little more at what a communicator actually is. Internally, MPI has to keep up with (among other things) two major parts of a communicator, the context (or ID) that differentiates one communicator from another and the group of processes contained by the communicator. The context is what prevents an operation on one communicator from matching with a similar operation on another communicator. MPI keeps an ID for each communicator internally to prevent the mixups. The group is a little simpler to understand since it is just the set of all processes in the communicator. For `MPI_COMM_WORLD`, this is all of the processes that were started by `mpiexec`. For other communicators, the group will be different. In the example code above, the group is all of the processes which passed in the same `color` to `MPI_Comm_split`. -MPI uses these groups in the same way that set theory generally works. You don't have to be familiar with all of set theory to understand things, but it's helpful to know what two operations mean. Here, instead of referring to "sets", we'll use the term "groups" as it aplies to MPI. First, the union operation creates a new, (potentially) bigger set from two other sets. The new set includes all of the members of the first two sets (without duplicates). Second, the intersection operation creates a new, (potentially) smaller set from two other sets. The new set includes all of the members that are present in both of the original sets. You can see examples of both of these operations graphically below. +MPI uses these groups in the same way that set theory generally works. You don't have to be familiar with all of set theory to understand things, but it's helpful to know what two operations mean. Here, instead of referring to "sets", we'll use the term "groups" as it applies to MPI. First, the union operation creates a new, (potentially) bigger set from two other sets. The new set includes all of the members of the first two sets (without duplicates). Second, the intersection operation creates a new, (potentially) smaller set from two other sets. The new set includes all of the members that are present in both of the original sets. You can see examples of both of these operations graphically below. ![Group Operation Examples](groups.png) From 4e80837439c55cc0e98e02d107590b16e03fdcfb Mon Sep 17 00:00:00 2001 From: Alon Bukai Date: Sat, 8 Aug 2020 14:50:29 +0300 Subject: [PATCH 064/108] docs: Fix grammar. Missing `is` --- tutorials/performing-parallel-rank-with-mpi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index 5493cf0..a58837d 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -12,7 +12,7 @@ In the [previous lesson]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-all > **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/performing-parallel-rank-with-mpi/code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code). ## Parallel rank - problem overview -When processes all have a single number stored in their local memory, it can be useful to know what order their number is in respect to the entire set of numbers contained by all processes. For example, a user might be benchmarking the processors in an MPI cluster and want to know the order of how fast each processor relative to the others. This information can be used for scheduling tasks and so on. As you can imagine, it is rather difficult to find out a number's order in the context of all other numbers if they are spread across processes. This problem - the parallel rank problem - is what we are going to solve in this lesson. +When processes all have a single number stored in their local memory, it can be useful to know what order their number is in respect to the entire set of numbers contained by all processes. For example, a user might be benchmarking the processors in an MPI cluster and want to know the order of how fast each processor is relative to the others. This information can be used for scheduling tasks and so on. As you can imagine, it is rather difficult to find out a number's order in the context of all other numbers if they are spread across processes. This problem - the parallel rank problem - is what we are going to solve in this lesson. An illustration of the input and output of parallel rank is below: From 508d9a6937b3750598bf6e4f1f7c060bf3c2bec1 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Fri, 17 Jul 2020 12:00:42 -0500 Subject: [PATCH 065/108] Remove affiliate links --- recommended-books.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/recommended-books.md b/recommended-books.md index 4f89a04..b37824a 100644 --- a/recommended-books.md +++ b/recommended-books.md @@ -3,33 +3,34 @@ layout: page title: Recommended Books --- -Here are the books that helped me out the most when learning MPI. Most of these are written by the primary designers of the Message Passing Interface. Some also include tutorials on how to use OpenMP with MPI. The very first book is a compilation of the beginner tutorials of this site as well and helps support mpitutorial.com. +Here are the books that helped me out the most when learning MPI. Most of these are written by the primary designers of the Message Passing Interface. Some also include tutorials on how to use OpenMP with MPI. -> **Disclaimer** - The links on this page are Amazon affiliate links. If you click on the links and purchase books, the primary author (Wes Kendall) receives commission. - -## Beginning MPI (An Introduction in C) -This book is a compilation of all of the beginner tutorials on this site. It goes over everything from installing MPI on an Amazon EC2 cluster to the basics of sending and receiving with MPI to performing collective operations and reductions. If you have enjoyed the tutorials on this site and wish to have a copy of it in book format (while also supporting mpitutorial.com), then [click here for more info](http://www.amazon.com/gp/product/B00HM7O0M8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B00HM7O0M8&linkCode=as2&tag=softengiintet-20). - -[![Beginning MPI - An Introduction in C](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=B00HM7O0M8&MarketPlace=US&ID=AsinImage&WS=1&tag=softengiintet-20&ServiceVersion=20070822)](http://www.amazon.com/gp/product/B00HM7O0M8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B00HM7O0M8&linkCode=as2&tag=softengiintet-20) +> **Disclaimer** - The last book is primarily a compilation of these tutorials by the original mpitutorial.com author (Wes Kendall). ## Parallel Programming with MPI -My personal favorite MPI book. The book gives a good overview of parallel computing before delving into all the various topics of MPI programming. It goes into detail about almost every essential MPI routine, and then it provides examples of parallel programs such as matrix multiplication and sorting. The end of the book discusses libraries and debugging routines. [Click here for more info](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395). +My personal favorite MPI book. The book gives a good overview of parallel computing before delving into all the various topics of MPI programming. It goes into detail about almost every essential MPI routine, and then it provides examples of parallel programs such as matrix multiplication and sorting. The end of the book discusses libraries and debugging routines. [Click here for more info](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395). -[![Parallel Programming with MPI](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=1558603395&MarketPlace=US&ID=AsinImage&WS=1&tag=softengiintet-20&ServiceVersion=20070822)](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395) +[![Parallel Programming with MPI](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=1558603395&MarketPlace=US&ID=AsinImage&WS=1&ServiceVersion=20070822)](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395) -## Using MPI - 2nd Edition -This is a more up-to-date book than the previous, but it mostly focuses on the newer and more advanced MPI routines in the second MPI standard. These include parallel I/O, remote memory access, and dynamic process management. The book also discusses using MPI with threads. This is a must have for advanced MPI development. [Click here for more info](http://www.amazon.com/gp/product/0262571323/ref=as_li_tf_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262571323). +## Using MPI - 3rd Edition +This is a more up-to-date book than the previous, but it mostly focuses on the newer and more advanced MPI routines in the third MPI standard. These include parallel I/O, remote memory access, and dynamic process management. The book also discusses using MPI with threads. This is a must have for advanced MPI development. [Click here for more info](https://www.amazon.com/gp/product/0262527391/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0262527391&linkCode=as2&linkId=52cc270bc3a798b37c787740d00c19d1). -[![Using MPI - 2nd Edition](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=0262571323&MarketPlace=US&ID=AsinImage&WS=1&tag=softengiintet-20&ServiceVersion=20070822)](http://www.amazon.com/gp/product/0262571323/ref=as_li_tf_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262571323) +[![Using MPI - 3rd Edition](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&MarketPlace=US&ASIN=0262527391&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_)](https://www.amazon.com/gp/product/0262527391/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0262527391&linkCode=as2&linkId=52cc270bc3a798b37c787740d00c19d1) ## Parallel Programming in C with MPI and OpenMP -This book is a bit older than the others, but it is still a classic. One strong point of this book is the huge amount of parallel programming examples, along with its focus on MPI and OpenMP. Many parallel programs are discussed in great detail, including matrix multiplication, fast fourier transforms, sorting, and combinatorial searching. [Click here for more info](http://www.amazon.com/gp/product/0071232656/ref=as_li_tf_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0071232656). +This book is a bit older than the others, but it is still a classic. One strong point of this book is the huge amount of parallel programming examples, along with its focus on MPI and OpenMP. Many parallel programs are discussed in great detail, including matrix multiplication, fast fourier transforms, sorting, and combinatorial searching. [Click here for more info](http://www.amazon.com/gp/product/0071232656/ref=as_li_tf_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=0071232656). -[![Parallel Programming in C with MPI and OpenMP](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=0071232656&MarketPlace=US&ID=AsinImage&WS=1&tag=softengiintet-20&ServiceVersion=20070822)](http://www.amazon.com/gp/product/0071232656/ref=as_li_tf_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0071232656) +[![Parallel Programming in C with MPI and OpenMP](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=0071232656&MarketPlace=US&ID=AsinImage&WS=1&ServiceVersion=20070822)](http://www.amazon.com/gp/product/0071232656/ref=as_li_tf_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=0071232656) ## MPI: The Complete Reference -A complete reference guide to MPI one and two. The book does not necessarily teach MPI, but it provides a great reference and complete descriptions of every single function. One advantage of this book is that it includes Fortran routines as well as C routines. [Click here for more info](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163). +A complete reference guide to MPI one and two. The book does not necessarily teach MPI, but it provides a great reference and complete descriptions of every single function. One advantage of this book is that it includes Fortran routines as well as C routines. [Click here for more info](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163). + +[![MPI: The Complete Reference](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=0262692163&MarketPlace=US&ID=AsinImage&WS=1&ServiceVersion=20070822)](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163) + +![](http://www.assoc-amazon.com/e/ir?l=as2&o=1&a=0262692163&camp=217145&creative=399377) + +## Beginning MPI (An Introduction in C) +This book is a compilation of all of the beginner tutorials on this site. It goes over everything from installing MPI on an Amazon EC2 cluster to the basics of sending and receiving with MPI to performing collective operations and reductions. If you have enjoyed the tutorials on this site and wish to have a copy of it in book format, then [click here for more info](http://www.amazon.com/gp/product/B00HM7O0M8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B00HM7O0M8&linkCode=as2). -[![MPI: The Complete Reference](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=0262692163&MarketPlace=US&ID=AsinImage&WS=1&tag=softengiintet-20&ServiceVersion=20070822)](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_il?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163) +[![Beginning MPI - An Introduction in C](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=B00HM7O0M8&MarketPlace=US&ID=AsinImage&WS=1&ServiceVersion=20070822)](http://www.amazon.com/gp/product/B00HM7O0M8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=B00HM7O0M8&linkCode=as2) -![](http://www.assoc-amazon.com/e/ir?t=softengiintet-20&l=as2&o=1&a=0262692163&camp=217145&creative=399377) \ No newline at end of file From 4253c91fca56e598141ef0b9350e225ad0fcfc24 Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Tue, 11 Aug 2020 11:37:37 -0500 Subject: [PATCH 066/108] Change old links to reflect new github organization --- _config.yml | 4 ++-- tutorials/launching-an-amazon-ec2-mpi-cluster/index.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index 476ea30..7af44e7 100644 --- a/_config.yml +++ b/_config.yml @@ -20,8 +20,8 @@ plugins: # Custom vars version: 1.0.0 github: - repo: https://github.com/wesleykendall/mpitutorial - code: https://github.com/wesleykendall/mpitutorial/tree/gh-pages + repo: https://github.com/mpitutorial/mpitutorial + code: https://github.com/mpitutorial/mpitutorial/tree/gh-pages pages_list: Tutorials: 'tutorials' Recommended Books: 'recommended-books' diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index 44e6677..b529e44 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -136,7 +136,7 @@ Once you are logged into the cluster, your current working directory will be `/r While you are in one of the mounted home directories, go ahead and check out the MPI tutorial code from its GitHub repository. The code is used by every lesson on this site: ``` -git clone git://github.com/wesleykendall/mpitutorial.git +git clone git://github.com/mpitutorial/mpitutorial.git ``` After you feel comfortable with accessing your cluster, log out of it and stop your cluster: From c180e8646ae4df0c0ebb05f5672dfbb638236a1b Mon Sep 17 00:00:00 2001 From: Aksel Lenes Date: Wed, 9 Sep 2020 10:20:27 +0200 Subject: [PATCH 067/108] Fix typo --- tutorials/mpi-broadcast-and-collective-communication/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index 106926f..6b6cd7d 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -106,7 +106,7 @@ Do you think you can code this? Writing this code is a bit outside of the purpos ## Comparison of MPI_Bcast with MPI_Send and MPI_Recv The `MPI_Bcast` implementation utilizes a similar tree broadcast algorithm for good network utilization. How does our broadcast function compare to `MPI_Bcast`? We can run `compare_bcast`, an example program included in the lesson code ([compare_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c)). Before looking at the code, let's first go over one of MPI's timing functions - `MPI_Wtime`. `MPI_Wtime` takes no arguments, and it simply returns a floating-point number of seconds since a set time in the past. Similar to C's `time` function, you can call multiple `MPI_Wtime` functions throughout your program and subtract their differences to obtain timing of code segments. -Let's take a look of our code that compares my_bcast to MPI_Bcast. +Let's take a look at our code that compares my_bcast to MPI_Bcast. ```cpp for (i = 0; i < num_trials; i++) { From 09ee1d7ef6dd0ffa549765b2ba466de98cfcc0fa Mon Sep 17 00:00:00 2001 From: Z-Y00 Date: Wed, 23 Sep 2020 10:17:02 +0800 Subject: [PATCH 068/108] Update url --- tutorials/mpi-broadcast-and-collective-communication/zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index aad8aa3..c507cf0 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -81,7 +81,7 @@ void my_bcast(void* data, int count, MPI_Datatype datatype, int root, } ``` -根节点把数据传递给所有其他的节点,其他的节点接收根节点的数据。很简单对吧?如果你从这个 [repo]({{ site.github.code }}) *tutorials* 目录下面运行这个程序的话,输出看起来应该像这样: +根节点把数据传递给所有其他的节点,其他的节点接收根节点的数据。很简单对吧?如果你从这个 [repo]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/) *tutorials* 目录下面运行这个程序的话,输出看起来应该像这样: ``` From d09d7a89b91657fa209755c2bc3e49896ecb1cd9 Mon Sep 17 00:00:00 2001 From: Z-Y00 Date: Wed, 23 Sep 2020 10:17:51 +0800 Subject: [PATCH 069/108] Update URL --- tutorials/mpi-broadcast-and-collective-communication/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index 6b6cd7d..aa0ec49 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -82,7 +82,7 @@ void my_bcast(void* data, int count, MPI_Datatype datatype, int root, } ``` -The root process sends the data to everyone else while the others receive from the root process. Easy, right? If you run the my_bcast program from the *tutorials* directory of the [repo]({{ site.github.code }}), the output should look similar to this. +The root process sends the data to everyone else while the others receive from the root process. Easy, right? If you run the my_bcast program from the *tutorials* directory of the [repo]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/), the output should look similar to this. ``` From b1301262b6a04d46eaa550e06c50c35d3f28777d Mon Sep 17 00:00:00 2001 From: Z-Y00 Date: Sat, 26 Sep 2020 19:21:00 +0800 Subject: [PATCH 070/108] fix typo --- tutorials/mpi-scatter-gather-and-allgather/zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md index 24c81d4..f61231e 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md +++ b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md @@ -31,7 +31,7 @@ MPI_Scatter( 这个函数看起来确实很大很吓人,别怕,我们来详细解释一下。第一个参数,`send_data`,是在根进程上的一个数据数组。第二个和第三个参数,`send_count` 和 `send_datatype` 分别描述了发送给每个进程的数据数量和数据类型。如果 `send_count` 是1,`send_datatype` 是 `MPI_INT`的话,进程0会得到数据里的第一个整数,以此类推。如果`send_count`是2的话,进程0会得到前两个整数,进程1会得到第三个和第四个整数,以此类推。在实践中,一般来说`send_count`会等于数组的长度除以进程的数量。除不尽怎么办?我们会在后面的课程中讲这个问题 :-)。 -函数定义里面接收数据的参数跟发送的参数几乎相同。`recv_data` 参数是一个缓存,它里面存了`recv_count`个`recv_datatype`数据类型的元素。最后两个参数,`root` 和 `communicator` 分别指定开始分发数组的了根进程以及对应的communicator。 +函数定义里面接收数据的参数跟发送的参数几乎相同。`recv_data` 参数是一个缓存,它里面存了`recv_count`个`recv_datatype`数据类型的元素。最后两个参数,`root` 和 `communicator` 分别指定开始分发数组的根进程以及对应的communicator。 ## MPI_Gather 的介绍 `MPI_Gather` 跟 `MPI_Scatter` 是相反的。`MPI_Gather` 从好多进程里面收集数据到一个进程上面而不是从一个进程分发数据到多个进程。这个机制对很多平行算法很有用,比如并行的排序和搜索。下图是这个算法的一个示例。 From bcb40bee68ec056caecceee90971c186ba6d8f29 Mon Sep 17 00:00:00 2001 From: Peihao Ren Date: Sun, 22 Nov 2020 14:05:42 +0000 Subject: [PATCH 071/108] add Chinese translation for performing-parallel-rank-with-mpi --- .../zh_cn.md | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 tutorials/performing-parallel-rank-with-mpi/zh_cn.md diff --git a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md new file mode 100644 index 0000000..f66c593 --- /dev/null +++ b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md @@ -0,0 +1,210 @@ +--- +layout: post +title: 使用MPI计算并行排名 +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Type_size +redirect_from: '/performing-parallel-rank-with-mpi/zh_cn' +--- + +在[之前的课程]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/)里,我们介绍了 `MPI_Scatter`、`MPI_Gather` 和 `MPI_Allgather`。在这一节中,我们将通过为MPI工具包编写一个实用的功能——并行排名来拓展基本的集体通信(collective communication)。 + +> **注意** - 这个网站的提到的所有代码都在 [GitHub]({{ site.github.repo }}) 上面。这篇教程的代码在 [tutorials/performing-parallel-rank-with-mpi/code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)。 + +## 并行排名 - 问题概述 +当每一个进程都在其本地内存中存储了一​​个数,所有进程中存储的数字构成了一个数字集合(set of numbers),了解该数相对于整个数字集合的顺序是有用的。例如,用户可能正在对MPI群集中的处理器进行基准测试,并想知道每个处理器相对于其他处理器有多快。这个信息可用于安排、调度任务等。可以想象,如果所有其他数字分散在各个进程中,那么很难找出一个数字相对于所有其他数字的顺序。这个并行排名问题是我们在本课中要解决的问题。 + +下图说明了并行排名的输入和输出: + +![Parallel Rank](parallel_rank_1.png) + +图示中的进程(标记为0到3)开始时有四个数字—— 5、2、7和4。然后,并行排名算法算出进程1在数字集合中的排名为0(即第一个数字),进程3排名为1,进程0排名为2,进程2排在整个数字集合的最后。很简单,对吧? + +## 并行排名API定义 +在深入研究并行排名问题之前,让我们首先确定函数的行为方式。我们的函数需要在每个进程上取一个数字,并返回其相对于所有其他进程中的数字的排名。与此同时,我们将需要其他各种信息,例如正在使用的通信器(communicator)以及被排名的数字的数据类型。 给定这个函数定义后,我们的排名函数原型如下所示: + + ```cpp +TMPI_Rank( + void *send_data, + void *recv_data, + MPI_Datatype datatype, + MPI_Comm comm) +``` + +`TMPI_Rank` 把 `send_data` 作为缓冲区,其中包含一个类型为 `datatype` 的数字。 +`recv_data` 在每个进程中只接收一个整数,即 `send_data` 的排名。`comm` 变量是进行排名的通信器。 + +> **注意** - MPI标准明确指出,用户不应以 `MPI` 起头命名自己的函数,如 `MPI_`,以避免将用户函数与MPI标准本身的函数混淆。 因此,在这些教程中,我们将在函数前面加上 `T`。 + +## 解决并行排名问题 +现在我们有了API定义,我们可以深入研究如何解决并行排名问题。解决并行排名问题的第一步是对所有进程中的数字进行排序。 这一点必须做到,以便我们找到整个数字集中每个数字的排名。我们可以通过多种方式来实现这一目标。最简单的方法是将所有数字收集到一个进程中并对数字进行排序。在示例代码([tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c))中,`gather_numbers_to_root` 函数负责将所有数字收集到根进程(root process)。 + +```cpp +// 为进程0的TMPI_Rank收集数字。为MPI的数据类型分配空间 +// 对进程0返回 void * 指向的缓冲区 +// 对所有其他进程返回NULL +void *gather_numbers_to_root(void *number, MPI_Datatype datatype, + MPI_Comm comm) { + int comm_rank, comm_size; + MPI_Comm_rank(comm, &comm_rank); + MPI_Comm_size(comm, &comm_size); + + // 在根进程上分配一个数组 + // 数组大小取决于所用的MPI数据类型 + int datatype_size; + MPI_Type_size(datatype, &datatype_size); + void *gathered_numbers; + if (comm_rank == 0) { + gathered_numbers = malloc(datatype_size * comm_size); + } + + // 在根进程上收集所有数字 + MPI_Gather(number, 1, datatype, gathered_numbers, 1, + datatype, 0, comm); + + return gathered_numbers; +} +``` + +`gather_numbers_to_root` 函数获取要收集的数字(即 `send_data` 变量)、数字的数据类型 `datatype` 和 `comm` 通信器。根进程必须在此函数中收集 `comm_size` 个数字,因此它会分配 `datatype_size * comm_size` 长度的数组。在本教程中,通过使用新的MPI函数- `MPI_Type_size` 来收集`datatype_size`变量。尽管我们的代码仅支持将 `MPI_INT` 和 `MPI_FLOAT` 作为数据类型,但可将其扩展以支持不同大小的数据类型。 在使用 `MPI_Gather` 在根进程上收集了数字之后,必须在根进程上对数字进行排序,以确定它们排名。 + +## 排序数字并维护所属 +在我们的排名函数中,排序数字不一定是难题。 C标准库为我们提供了流行的排序算法,例如 `qsort`。 在并行排名问题中,排序的困难在于,我们必须维护各个进程将数字发送到根进程的次序。 如果我们要对收集到根进程的数组进行排序而不给数字附加信息,则根进程将不知道如何将数字的排名发送回原来请求的进程! + +为了便于将所属进程附到对应数字上,我们在代码中创建了一个结构体(struct)来保存此信息。 我们的结构定义如下: + +```cpp +// 保存进程在通信器中的次序(rank)和对应数字 +// 该结构体用于数组排序, +// 并同时完整保留所属进程信息 + +typedef struct { + int comm_rank; + union { + float f; + int i; + } number; +} CommRankNumber; +``` + +`CommRankNumber` 结构体保存了我们要排序的数字(记住它可以是浮点数或整数,因此我们使用联合体union),并且它拥有该数字所属进程在通信器中的次序(rank)。 代码的下一部分,即 `get_ranks` 函数,负责创建这些结构体并对它们进行排序。 + + +```cpp +// 这个函数在根进程上对收集到的数字排序 +// 返回一个数组,数组按进程在通信器中的次序排序 +// 注意 - 该函数只在根进程上运行 + +int *get_ranks(void *gathered_numbers, int gathered_number_count, + MPI_Datatype datatype) { + int datatype_size; + MPI_Type_size(datatype, &datatype_size); + + // 将收集到的数字数组转换为CommRankNumbers数组 + // 这允许我们在排序的同时,完整保留数字所属进程的信息 + + CommRankNumber *comm_rank_numbers = malloc( + gathered_number_count * sizeof(CommRankNumber)); + int i; + for (i = 0; i < gathered_number_count; i++) { + comm_rank_numbers[i].comm_rank = i; + memcpy(&(comm_rank_numbers[i].number), + gathered_numbers + (i * datatype_size), + datatype_size); + } + + // 根据数据类型对comm_rank_numbers排序 + if (datatype == MPI_FLOAT) { + qsort(comm_rank_numbers, gathered_number_count, + sizeof(CommRankNumber), &compare_float_comm_rank_number); + } else { + qsort(comm_rank_numbers, gathered_number_count, + sizeof(CommRankNumber), &compare_int_comm_rank_number); + } + + // 现在comm_rank_numbers是排好序的,下面生成一个数组, + // 包含每个进程的排名,数组第i个元素是进程i的数字的排名 + + int *ranks = (int *)malloc(sizeof(int) * gathered_number_count); + for (i = 0; i < gathered_number_count; i++) { + ranks[comm_rank_numbers[i].comm_rank] = i; + } + + // 清理并返回排名数组 + free(comm_rank_numbers); + return ranks; +} +``` + +`get_ranks` 函数首先创建一个CommRankNumber结构体数组,并附上该数字所属进程在通信器中的次序。 如果数据类型为 `MPI_FLOAT` ,则对我们的结构体数组调用 `qsort` 时,会使用特殊的排序函数,(代码见[tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)。 类似的,如果数据类型为 `MPI_INT` ,我们将使用不同的排序函数。 + +在对数字进行排序之后,我们必须以适当的顺序创建一个排名数组(array of ranks),以便将它们分散(scatter)回到请求的进程中。这是通过创建 `ranks` 数组并为每个已排序的 `CommRankNumber` 结构体填充适当的排名来实现的。 + +## 整合 +现在我们有了两个主要函数,我们可以将它们全部整合到我们的 `TMPI_Rank` 函数中。此函数将数字收集到根进程,并对数字进行排序以确定其排名,然后将排名分散回请求的进程。 代码如下所示: + +```cpp +// 获取recv_data的排名, 类型为datatype +// 排名用send_data返回,类型为datatype +int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, + MPI_Comm comm) { + // 首先检查基本情况 - 此函数只支持MPI_INT和MPI_FLOAT + + if (datatype != MPI_INT && datatype != MPI_FLOAT) { + return MPI_ERR_TYPE; + } + + int comm_size, comm_rank; + MPI_Comm_size(comm, &comm_size); + MPI_Comm_rank(comm, &comm_rank); + + // 为了计算排名,必须将数字收集到一个进程中 + // 对数字排序, 然后将排名结果分散传回 + // 首先在进程0上收集数字 + void *gathered_numbers = gather_numbers_to_root(send_data, datatype, + comm); + + // 获取每个进程的次序(rank) + int *ranks = NULL; + if (comm_rank == 0) { + ranks = get_ranks(gathered_numbers, comm_size, datatype); + } + + // 分散发回排名结果 + MPI_Scatter(ranks, 1, MPI_INT, recv_data, 1, MPI_INT, 0, comm); + + // 清理 + if (comm_rank == 0) { + free(gathered_numbers); + free(ranks); + } +} +``` + +`TMPI_Rank` 函数使用我们刚刚创建的两个函数 `gather_numbers_to_root` 和 `get_ranks` 来获取数字的排名。然后,函数执行最后的 `MPI_Scatter`,以将所得的排名分散传回进程。 + +如果你在阅读并行排名问题的解决方案时遇到麻烦,那么我将使用一组示例数据对问题的整个数据流进行了说明: + +![Parallel Rank](parallel_rank_2.png) + +对并行秩算法如何工作有疑问吗? 把它们留在下面! + +## 运行我们的并行排名算法 +我已在示例代码中包含了一个小程序,以帮助测试我们的并行排名算法。代码见[课程代码]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)中的[random_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c)文件。 + +该示例应用程序只是在每个进程上创建一个随机数,然后调用 `TMPI_Rank` 以获取每个数的排名。如果从[代码库]({{ site.github.code }})的 *tutorials* 目录中运行 `random_rank` 程序,则输出应与此类似。 + +``` +>>> cd tutorials +>>> ./run.py random_rank +mpirun -n 4 ./random_rank 100 +Rank for 0.242578 on process 0 - 0 +Rank for 0.894732 on process 1 - 3 +Rank for 0.789463 on process 2 - 2 +Rank for 0.684195 on process 3 - 1 +``` + +## 接下来 +在下一节中,我们将开始介绍进阶的集体通信。 下一节课是关于[用 MPI_Reduce 和 MPI_Allreduce 对数字执行reduce]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/)。 + +For all lessons, go the the [MPI tutorials]({{ site.baseurl }}/tutorials/). From 671f4943d7b50b752b990e6064cf15385dcdd903 Mon Sep 17 00:00:00 2001 From: Peihao Ren Date: Sun, 22 Nov 2020 14:14:50 +0000 Subject: [PATCH 072/108] add links --- tutorials.md | 2 +- tutorials/mpi-scatter-gather-and-allgather/zh_cn.md | 2 +- tutorials/performing-parallel-rank-with-mpi/index.md | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tutorials.md b/tutorials.md index 4be8204..f662f88 100644 --- a/tutorials.md +++ b/tutorials.md @@ -23,7 +23,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L ## Basic collective communication * [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) ([中文版]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)) * [Common collectives - MPI_Scatter, MPI_Gather, and MPI_Allgather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/) ([中文版]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/zh_cn)) -* [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) +* [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) ([中文版]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/zh_cn)) ## Advanced collective communication * [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) diff --git a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md index f61231e..5eee930 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md +++ b/tutorials/mpi-scatter-gather-and-allgather/zh_cn.md @@ -152,6 +152,6 @@ Avg of all elements from proc 2 is 0.479736 跟你注意到的一样,all_avg.c 和 avg.c 之间的唯一的区别就是 all_avg.c 使用`MPI_Allgather`把平均数在每个进程上都打印出来了。 ## 接下来 -下节课,我会使用`MPI_Gather`和`MPI_Scatter`做一个应用程序来[进行并行等级计算]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/)。 +下节课,我会使用`MPI_Gather`和`MPI_Scatter`做一个应用程序来[计算并行排名]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/zh_cn)。 你也可以在 [MPI tutorials]({{ site.baseurl }}/tutorials/) 查看所有课程。 diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index a58837d..60552d0 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -4,6 +4,7 @@ title: Performing Parallel Rank with MPI author: Wes Kendall categories: Beginner MPI tags: MPI_Type_size +translations: zh_cn redirect_from: '/performing-parallel-rank-with-mpi/' --- From c36c63e5b9af62710eea1dd40f9d61e8ec21703d Mon Sep 17 00:00:00 2001 From: jokervTv Date: Tue, 24 Nov 2020 17:05:11 +0800 Subject: [PATCH 073/108] Add Chinese translation for Installing MPICH2 on a Single Machine --- tutorials/installing-mpich2/index.md | 1 + tutorials/installing-mpich2/zh_cn.md | 73 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 tutorials/installing-mpich2/zh_cn.md diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index ba1ab05..723b2f3 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -4,6 +4,7 @@ title: Installing MPICH2 on a Single Machine author: Wes Kendall categories: Beginner MPI tags: +translations: zh_cn redirect_from: '/installing-mpich2/' --- diff --git a/tutorials/installing-mpich2/zh_cn.md b/tutorials/installing-mpich2/zh_cn.md new file mode 100644 index 0000000..73b9de0 --- /dev/null +++ b/tutorials/installing-mpich2/zh_cn.md @@ -0,0 +1,73 @@ +--- +layout: post +title: Installing MPICH2 on a Single Machine +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/installing-mpich2/' +--- + +MPI 只是众多实现中所遵循的一个标准。 +因此,这里有各种各样的 MPI 实现。 +本站点提供的所有示例都将使用最受欢迎的实现之一 MPICH2。 +用户可以自由使用他们希望的任何实现,但是仅提供安装 MPICH2 的说明。 +此外,仅保证为课程提供的脚本和代码可以在最新版本的 MPICH2 上执行和运行。 + +MPICH2 是 MPI 的一种广泛使用的实现,主要由美国的 Argonne 国家实验室开发。 +选择 MPICH2 而不是其他实现的主要原因是由于我对界面的熟悉以及与 Argonne 国家实验室的密切关系。 +我还鼓励其他人使用 OpenMPI,这也是一种广泛使用的实现。 + +## Installing MPICH2 + +MPICH2 的最新版本可在 [此处](http://www.mcs.anl.gov/research/projects/mpich2/) 获取。 +网站上所有示例的版本是 1.4,该版本于 2011 年 6 月 16 日发布。 +下载源代码,解压缩文件夹,然后切换到 MPICH2 目录。 + +``` +>>> tar -xzf mpich2-1.4.tar.gz +>>> cd mpich2-1.4 +``` + +完成之后,您应该能够通过执行`./configure`来配置安装。 +我在配置中添加了两个参数,以避免构建 MPI Fortran 库。 +如果需要将 MPICH2 安装到本地目录(例如,如果您没有对计算机的 root 访问权限),请使用`./configure --prefix=/installation/directory/path`,输入`./configure --help`以获取有关可能的配置参数的更多信息。 + +``` +>>> ./configure --disable-fortran +Configuring MPICH2 version 1.4 with '--disable-f77' '--disable-fc' +Running on system: Darwin Wes-Kendalls-Macbook-Pro.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu1504.9.37~1/RELEASE_I386 i386 +checking for gcc... gcc +``` + +配置完成后,应显示 *"Configuration completed."* +一旦完成,就该使用`make; sudo make install`命令来构建和安装 MPICH2 了。 + +``` +>>> make; sudo make install +Beginning make +Using variables CC='gcc' CFLAGS=' -O2' LDFLAGS=' ' F77='' FFLAGS=' ' FC='' FCFLAGS=' ' CXX='c++' CXXFLAGS=' -O2' AR='ar' CPP='gcc-E' CPP +``` + +如果构建成功,则应该可以输入`mpiexec --version`并看到以下类似的内容。 + +``` +>>> mpiexec --version +HYDRA build details: + Version: 3.1.4 + Release Date: Fri Feb 20 15:02:56 CST 2015 + CC: gcc + CXX: g++ + F77: + F90: +``` + +希望您的构建成功完成。 +如果没有,您可能会遇到缺少依赖项的问题。 +对于任何问题,我强烈建议您将错误消息直接复制并粘贴到 Google 中。 + +## 下一步 + +现在,您已经在本地构建了 MPICH2,您可以在该站点上进行一些选择。 +如果您已经具有用于设置本地集群的硬件和资源,建议您继续阅读有关 [在 LAN 中运行 MPI 集群]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan) 的教程。 +如果您无权访问集群或想了解有关构建虚拟化 MPI 集群的更多信息,请阅读有关 [在 Amazon EC2 上构建和运行自己的集群]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/)。 +如果您以任何一种方式构建了集群,或者只是想从计算机上运行其余课程,请继续阅读 [MPI hello world 课程]({{ site.baseurl }}/tutorials/mpi-hello-world/),其中概述了编程和运行第一个 MPI 程序的基础知识。 From d84aa9840f718ac714042192a108ec04ab98b6e6 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Tue, 24 Nov 2020 17:06:21 +0800 Subject: [PATCH 074/108] Add links for translation --- tutorials.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials.md b/tutorials.md index f662f88..b05df3b 100644 --- a/tutorials.md +++ b/tutorials.md @@ -10,7 +10,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L ## Introduction and MPI installation * [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) ([中文版]({{ site.baseurl }}/tutorials/mpi-introduction/zh_cn)) -* [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) +* [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) ([中文版]({{ site.baseurl }}/tutorials/installing-mpich2/zh_cn)) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) * [Running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan/) * [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) ([中文版]({{ site.baseurl }}/tutorials/mpi-hello-world/zh_cn)) From a4fa84d4fbcf2e2d039d955c3a38809b75afb444 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Wed, 25 Nov 2020 10:12:52 +0800 Subject: [PATCH 075/108] Add Chinese translation for Dynamic Receiving with MPI Probe (and MPI Status) --- tutorials.md | 2 +- .../index.md | 1 + .../zh_cn.md | 185 ++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md diff --git a/tutorials.md b/tutorials.md index b05df3b..ca58688 100644 --- a/tutorials.md +++ b/tutorials.md @@ -17,7 +17,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L ## Blocking point-to-point communication * [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) ([中文版]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn)) -* [Dynamic receiving with MPI_Probe and MPI_Status]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) +* [Dynamic receiving with MPI_Probe and MPI_Status]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) ([中文版]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn)) * [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) ## Basic collective communication diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md index 950efbb..2cff7a3 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md @@ -4,6 +4,7 @@ title: Dynamic Receiving with MPI Probe (and MPI Status) author: Wes Kendall categories: Beginner MPI tags: MPI_Get_count, MPI_Probe +translations: zh_cn redirect_from: '/dynamic-receiving-with-mpi-probe-and-mpi-status/' --- diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md new file mode 100644 index 0000000..273429c --- /dev/null +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md @@ -0,0 +1,185 @@ +--- +layout: post +title: Dynamic Receiving with MPI Probe (and MPI Status) +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Get_count, MPI_Probe +redirect_from: '/dynamic-receiving-with-mpi-probe-and-mpi-status/' +--- + +在 [上一节]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) 中,讨论了如何使用 `MPI_Send` 和 `MPI_Recv` 执行标准的点对点通信。 +但仅仅只介绍了如何发送事先知道消息长度的消息。 +尽管可以将消息的长度作为单独的发送/接收操作发送,但是 MPI 本身仅通过几个额外的函数调用即可支持动态消息。 +在本节中,将讨论如何使用这些功能。 + +> **注意** - 教程所涉及的所有代码都在 [GitHub 上]({{ site.github.repo }})。本文的代码在 [tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code) 下。 + +## MPI_Status 结构体 + +如 [上节]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) 所述,`MPI_Recv` 将 `MPI_Status` 结构体的地址作为参数(可以使用 `MPI_STATUS_IGNORE` 忽略)。 +如果我们将 `MPI_Status` 结构体传递给 `MPI_Recv` 函数,则操作完成后将在该结构体中填充有关接收操作的其他信息。 +三个主要的信息包括: + +1. **发送端秩**. 发送端的秩存储在结构体的 `MPI_SOURCE` 元素中。也就是说,如果我们声明一个 `MPI_Status stat` 变量,则可以通过 `stat.MPI_SOURCE` 访问秩。 +2. **消息的标签**. 消息的标签可以通过结构体的 `MPI_TAG` 元素访问(类似于 `MPI_SOURCE`)。 +3. **消息的长度**. 消息的长度在结构体中没有预定义的元素。相反,我们必须使用 `MPI_Get_count` 找出消息的长度。 + +```cpp +MPI_Get_count( + MPI_Status* status, + MPI_Datatype datatype, + int* count) +``` + +在 `MPI_Get_count` 函数中,使用者需要传递 `MPI_Status` 结构体,消息的 `datatype`(数据类型),并返回 `count`。 +变量 `count` 是已接收的 `datatype` 元素的数目。 + +为什么需要这些信息? +事实证明,`MPI_Recv` 可以将 `MPI_ANY_SOURCE` 用作发送端的秩,将 `MPI_ANY_TAG` 用作消息的标签。 +在这种情况下,`MPI_Status` 结构体是找出消息的实际发送端和标签的唯一方法。 +Furthermore, `MPI_Recv` is not guaranteed to receive the entire amount of elements passed as the argument to the function call. +此外,并不能保证 `MPI_Recv` 能够接收函数调用参数的全部元素。 +相反,它只接收已发送给它的元素数量(如果发送的元素多于所需的接收数量,则返回错误。) +`MPI_Get_count` 函数用于确定实际的接收量。 + +## `MPI_Status` 结构体查询的示例 + +查询 `MPI_Status` 结构体的程序在 [check_status.c]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c) 中。 +程序将随机数量的数字发送给接收端,然后接收端找出发送了多少个数字。 +代码的主要部分如下所示。 + +```cpp +const int MAX_NUMBERS = 100; +int numbers[MAX_NUMBERS]; +int number_amount; +if (world_rank == 0) { + // Pick a random amount of integers to send to process one + srand(time(NULL)); + number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS; + + // Send the amount of integers to process one + MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD); + printf("0 sent %d numbers to 1\n", number_amount); +} else if (world_rank == 1) { + MPI_Status status; + // Receive at most MAX_NUMBERS from process zero + MPI_Recv(numbers, MAX_NUMBERS, MPI_INT, 0, 0, MPI_COMM_WORLD, + &status); + + // After receiving the message, check the status to determine + // how many numbers were actually received + MPI_Get_count(&status, MPI_INT, &number_amount); + + // Print off the amount of numbers, and also print additional + // information in the status object + printf("1 received %d numbers from 0. Message source = %d, " + "tag = %d\n", + number_amount, status.MPI_SOURCE, status.MPI_TAG); +} +``` + +如我们所见,进程 0 将最多 `MAX_NUMBERS` 个整数以随机数量发送到进程 1。 +进程 1 然后调用 `MPI_Recv` 以获取总计 `MAX_NUMBERS` 个整数。 +Although process one is passing `MAX_NUMBERS` as the argument to `MPI_Recv`, process one will receive **at most** this amount of numbers. +尽管进程 1 以 `MAX_NUMBERS` 作为 `MPI_Recv` 函数参数,但进程 1 将最多接收到此数量的数字。 +In the code, process one calls `MPI_Get_count` with `MPI_INT` as the datatype to find out how many integers were actually received. +在代码中,进程 1 使用 `MPI_INT` 作为数据类型的参数,调用 `MPI_Get_count`,以找出实际接收了多少个整数。 +除了打印出接收到的消息的大小外,进程 1 还通过访问 status 结构体的 `MPI_SOURCE` 和 `MPI_TAG` 元素来打印消息的来源和标签。 + +为了澄清起见,`MPI_Get_count` 的返回值是相对于传递的数据类型而言的。 +如果用户使用 `MPI_CHAR` 作为数据类型,则返回的数量将是原来的四倍(假设整数是四个字节,而 char 是一个字节)。 +如果你从 [库]({{ site.github.code }}) 的 *tutorials* 目录中运行 check_status 程序,则输出应类似于: + +``` +>>> cd tutorials +>>> ./run.py check_status +mpirun -n 2 ./check_status +0 sent 92 numbers to 1 +1 received 92 numbers from 0. Message source = 0, tag = 0 +``` + +正如预期的那样,进程 0 将随机数目的整数发送给进程 1,进程 1 将打印出接收到的消息的有关信息。 + +## 使用 `MPI_Probe` 找出消息大小 + +现在您了解了 `MPI_Status` 的工作原理,现在我们可以使用它来发挥更高级的优势。 +除了传递接收消息并简易地配备一个很大的缓冲区来为所有可能的大小的消息提供处理(就像我们在上一个示例中所做的那样),您可以使用 `MPI_Probe` 在实际接收消息之前查询消息大小。 +函数原型看起来像这样: + +```cpp +MPI_Probe( + int source, + int tag, + MPI_Comm comm, + MPI_Status* status) +``` + +`MPI_Probe` 看起来与 `MPI_Recv` 非常相似。 +实际上,您可以将 `MPI_Probe` 视为 `MPI_Recv`,除了不接收消息外,它们执行相同的功能。 +与 `MPI_Recv` 类似,`MPI_Probe` 将阻塞具有匹配标签和发送端的消息。 +当消息可用时,它将填充 status 结构体。 +然后,用户可以使用 `MPI_Recv` 接收实际的消息。 + +The [lesson code]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code) has an example of this in [probe.c]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c). +[教程代码]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code) 在 probe.c 中有一个示例。 +以下是源代码的主要部分 + +```cpp +int number_amount; +if (world_rank == 0) { + const int MAX_NUMBERS = 100; + int numbers[MAX_NUMBERS]; + // Pick a random amount of integers to send to process one + srand(time(NULL)); + number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS; + + // Send the random amount of integers to process one + MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD); + printf("0 sent %d numbers to 1\n", number_amount); +} else if (world_rank == 1) { + MPI_Status status; + // Probe for an incoming message from process zero + MPI_Probe(0, 0, MPI_COMM_WORLD, &status); + + // When probe returns, the status object has the size and other + // attributes of the incoming message. Get the message size + MPI_Get_count(&status, MPI_INT, &number_amount); + + // Allocate a buffer to hold the incoming numbers + int* number_buf = (int*)malloc(sizeof(int) * number_amount); + + // Now receive the message with the allocated buffer + MPI_Recv(number_buf, number_amount, MPI_INT, 0, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("1 dynamically received %d numbers from 0.\n", + number_amount); + free(number_buf); +} +``` + +与上一个示例类似,进程 0 选择随机数量的数字发送给进程 1。 +不同之处在于,进程 1 现在调用 `MPI_Probe`,以找出进程 0 试图发送多少个元素(利用 `MPI_Get_count`)。 +然后,进程 1 分配适当大小的缓冲区并接收数字。 +执行本示例代码,结果看起来类似于: + +``` +>>> ./run.py probe +mpirun -n 2 ./probe +0 sent 93 numbers to 1 +1 dynamically received 93 numbers from 0 +``` + +尽管这个例子很简单,但是 `MPI_Probe` 构成了许多动态 MPI 应用程序的基础。 +例如,控制端/执行子程序在交换变量大小的消息时通常会大量使用 `MPI_Probe`。 +作为练习,对 `MPI_Recv` 进行包装,将 `MPI_Probe` 用于您可能编写的任何动态应用程序。 +它将使代码看起来更美好:-) + +## 接下来 + +对于使用标准的阻塞点对点通信例程的理解是否清晰? +如果是的,那么您已经有能力编写无数的并行应用程序! +让我们来看一个使用所学例程的高级示例。 +查看 [使用 `MPI_Send`,`MPI_Recv` 和 `MPI_Probe` 的应用程序示例]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/). + +遇到麻烦? 困惑? +随时在下面发表评论,也许我或其他读者会有所帮助。 From ff1663f28abcbaebe314afd68499b704442eba4e Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Mon, 30 Nov 2020 05:40:44 +1100 Subject: [PATCH 076/108] docs: fix simple typo, orignal -> original There is a small typo in tutorials/introduction-to-groups-and-communicators/index.md. Should read `original` rather than `orignal`. --- tutorials/introduction-to-groups-and-communicators/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index c89acaa..0693330 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -57,7 +57,7 @@ printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", MPI_Comm_free(&row_comm); ``` -The first few lines get the rank and size for the original communicator, `MPI_COMM_WORLD`. The next line does the important operation of determining the "color" of the local process. Remember that color decides to which communicator the process will belong after the split. Next, we see the all important split operation. The new thing here is that we're using the orignal rank (`world_rank`) as the key for the split operation. Since we want all of the processes in the new communicator to be in the same order that they were in the original communicator, using the original rank value makes the most sense here as it will already be ordered correctly. After that, we print out the new rank and size just to make sure it works. Your output should look something like this: +The first few lines get the rank and size for the original communicator, `MPI_COMM_WORLD`. The next line does the important operation of determining the "color" of the local process. Remember that color decides to which communicator the process will belong after the split. Next, we see the all important split operation. The new thing here is that we're using the original rank (`world_rank`) as the key for the split operation. Since we want all of the processes in the new communicator to be in the same order that they were in the original communicator, using the original rank value makes the most sense here as it will already be ordered correctly. After that, we print out the new rank and size just to make sure it works. Your output should look something like this: ``` WORLD RANK/SIZE: 0/16 ROW RANK/SIZE: 0/4 From 9a057a141809e383d375cfdd1d3031dce6ec1123 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Thu, 17 Dec 2020 15:53:17 +0800 Subject: [PATCH 077/108] Add Chinese translation for Random walking --- tutorials.md | 2 +- .../index.md | 1 + .../zh_cn.md | 371 ++++++++++++++++++ 3 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 tutorials/point-to-point-communication-application-random-walk/zh_cn.md diff --git a/tutorials.md b/tutorials.md index ca58688..7776ab3 100644 --- a/tutorials.md +++ b/tutorials.md @@ -18,7 +18,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L ## Blocking point-to-point communication * [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) ([中文版]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn)) * [Dynamic receiving with MPI_Probe and MPI_Status]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) ([中文版]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn)) -* [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) +* [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) ([中文版]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/zh_cn)) ## Basic collective communication * [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) ([中文版]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)) diff --git a/tutorials/point-to-point-communication-application-random-walk/index.md b/tutorials/point-to-point-communication-application-random-walk/index.md index 9ffa56f..db510f3 100644 --- a/tutorials/point-to-point-communication-application-random-walk/index.md +++ b/tutorials/point-to-point-communication-application-random-walk/index.md @@ -4,6 +4,7 @@ title: Point-to-Point Communication Application - Random Walk author: Wes Kendall categories: Beginner MPI tags: +translations: zh_cn redirect_from: '/point-to-point-communication-application-random-walk/' --- diff --git a/tutorials/point-to-point-communication-application-random-walk/zh_cn.md b/tutorials/point-to-point-communication-application-random-walk/zh_cn.md new file mode 100644 index 0000000..687a93f --- /dev/null +++ b/tutorials/point-to-point-communication-application-random-walk/zh_cn.md @@ -0,0 +1,371 @@ +--- +layout: post +title: Point-to-Point Communication Application - Random Walk +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/point-to-point-communication-application-random-walk/' +--- + +是时候使用 [发送和接收教程]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) 以及 [`MPI_Probe` 和 `MPI_Status` 教程]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) 中介绍的一些概念来研究具体的应用程序示例了。 +本文应用程序模拟了一个被称之为“随机游走”的过程。 + +> **注意** - 该站点的所有代码都位于 [GitHub]({{ site.github.repo }})。本文的代码位于此 [tutorials/point-to-point-communication-application-random-walk/code]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code) 目录下。 + +随机游走的基本问题定义如下: +给定 *Min*,*Max* 和随机游走器 *W*,让游走器 *W* 向右以任意长度的 *S* 随机移动。 +如果该过程越过边界,它就会绕回。 +*W* 一次只能左右移动一个单位。 + +![随机游走图](random_walk.png) + +尽管程序本身是非常基础的,但是并行化的随机游走可以模拟各种并行程序的行为。 +具体内容以后再说。 +现在,让我们概述一下如何并行化随机游走问题。 + +## 随机游走问题的并行化 + +在许多并行程序的应用中,首要任务是在各个进程之间划分域。 +随机行走问题的一维域大小为 *Max - Min + 1*(因为游走器包含 *Max* 和 *Min*)。 +假设游走器只能采取整数大小的步长,我们可以轻松地将域在每个进程中划分为大小近乎相等的块。 +例如,如果 *Min* 为 0,*Max* 为 20,并且我们有四个进程,则将像这样拆分域。 + +![Domain decomposition example](domain_decomp.png) + +前三个进程拥有域的五个单元,而最后一个进程则拥有最后五个单元并且再加上一个剩余的单元。 +一旦对域进行了分区,应用程序将初始化游走器。 +如前所述,游走器将以步长 *S* 进行总步数随机的游走。 +例如,如果游走器在进程 0(使用先前的分解域)上进行了移动总数为 6 的游走,则游走器的执行将如下所示: + +1. 游走器的步行长度开始增加。但是,当它的值达到 4 时,它已到达进程 0 的边界。因此,进程 0 必须与进程 1 交流游走器的信息。 + +2. 进程 1 接收游走器,并继续移动,直到达到移动总数 6。然后,游走器可以继续进行新的随机移动。 + +![Random walk, step one](walk_step_one.png) + +在此示例中,*W* 仅需从进程 0 到进程 1 进行一次通信。 +但是,如果 *W* 必须移动更长的距离,则可能需要沿其通过域的路径将其传递给更多的进程。 + +## 使用 `MPI_Send` 和 `MPI_Recv` 组织代码 + +可以使用 `MPI_Send` 和 `MPI_Recv` 对组织代码。 +在开始查看代码之前,让我们建立程序的一些初步特征和功能: + +* 明确每个进程在域中的部分。 +* 每个进程初始化 *N* 个 walker,所有这些 walker 都从其局部域的第一个值开始。 +* 每个 walker 都有两个相关的整数值:当前位置和剩余步数。 +* Walkers 开始遍历该域,并传递到其他进程,直到完成所有移动。 +* 当所有 walker 完成时,该进程终止。 + +让我们从编写用于分解域的代码开始。 +该函数将考虑域的总大小,并为 MPI 进程找到合适的子域。 +它还会将域的其余部分交给最终的进程。 +为了简单起见,我会调用 `MPI_Abort` 处理发现的任何错误。 +名为 `decompose_domain` 的函数如下所示: + +```cpp +void decompose_domain(int domain_size, int world_rank, + int world_size, int* subdomain_start, + int* subdomain_size) { + if (world_size > domain_size) { + // Don't worry about this special case. Assume the domain + // size is greater than the world size. + MPI_Abort(MPI_COMM_WORLD, 1); + } + *subdomain_start = domain_size / world_size * world_rank; + *subdomain_size = domain_size / world_size; + if (world_rank == world_size - 1) { + // Give remainder to last process + *subdomain_size += domain_size % world_size; + } + } +``` + +如您所见,该函数将域分成偶数个块,并考虑了存在余数的情况。 +该函数返回一个子域开始和一个子域大小。 + +接下来,我们需要创建一个初始化 walkers 的函数。 +我们首先定义一个如下所示的 walker 结构: + +```cpp +typedef struct { + int location; + int num_steps_left_in_walk; +} Walker; +``` + +我们的初始化函数为 `initialize_walkers`,它采用子域边界,并将 walker 添加到 `incoming_walkers` `vector` 中(顺便说一下,该程序采用 C++)。 +Our initialization function, called `initialize_walkers`, takes the subdomain bounds and adds walkers to an `incoming_walkers` vector (by the way, this application is in C++). + +```cpp +void initialize_walkers(int num_walkers_per_proc, int max_walk_size, + int subdomain_start, int subdomain_size, + vector* incoming_walkers) { + Walker walker; + for (int i = 0; i < num_walkers_per_proc; i++) { + // Initialize walkers in the middle of the subdomain + walker.location = subdomain_start; + walker.num_steps_left_in_walk = + (rand() / (float)RAND_MAX) * max_walk_size; + incoming_walkers->push_back(walker); + } +} +``` + +初始化之后,就该使 walkers 前进了。 +让我们从一个移动功能开始。 +此功能负责使 walkers 前进,直到完成移动为止。 +如果超出局部域范围,则将其添加到 `outgoing_walkers` `vector` 中。 + +```cpp +void walk(Walker* walker, int subdomain_start, int subdomain_size, + int domain_size, vector* outgoing_walkers) { + while (walker->num_steps_left_in_walk > 0) { + if (walker->location == subdomain_start + subdomain_size) { + // Take care of the case when the walker is at the end + // of the domain by wrapping it around to the beginning + if (walker->location == domain_size) { + walker->location = 0; + } + outgoing_walkers->push_back(*walker); + break; + } else { + walker->num_steps_left_in_walk--; + walker->location++; + } + } +} +``` + +现在,我们已经建立了初始化函数(用于填充传入的 walker 列表)和移动函数(用于填充传出的 walker 列表),我们仅再需要两个函数:发送待传出的 walker 的函数和接收待传入的 walker 的函数。 +发送功能如下所示: + +```cpp +void send_outgoing_walkers(vector* outgoing_walkers, + int world_rank, int world_size) { + // Send the data as an array of MPI_BYTEs to the next process. + // The last process sends to process zero. + MPI_Send((void*)outgoing_walkers->data(), + outgoing_walkers->size() * sizeof(Walker), MPI_BYTE, + (world_rank + 1) % world_size, 0, MPI_COMM_WORLD); + + // Clear the outgoing walkers + outgoing_walkers->clear(); +} +``` + +接收传入的 walkers 的函数应该使用 `MPI_Probe`,因为它事先不知道将接收多少 walkers。 +看起来是这样的: + +```cpp +void receive_incoming_walkers(vector* incoming_walkers, + int world_rank, int world_size) { + MPI_Status status; + + // Receive from the process before you. If you are process zero, + // receive from the last process + int incoming_rank = + (world_rank == 0) ? world_size - 1 : world_rank - 1; + MPI_Probe(incoming_rank, 0, MPI_COMM_WORLD, &status); + + // Resize your incoming walker buffer based on how much data is + // being received + int incoming_walkers_size; + MPI_Get_count(&status, MPI_BYTE, &incoming_walkers_size); + incoming_walkers->resize( + incoming_walkers_size / sizeof(Walker)); + MPI_Recv((void*)incoming_walkers->data(), incoming_walkers_size, + MPI_BYTE, incoming_rank, 0, MPI_COMM_WORLD, + MPI_STATUS_IGNORE); +} +``` + +现在我们已经建立了程序的主要功能。 +我们必须将所有这些功能集成在一起,如下所示: + +1. 初始化 walkers. +2. 使用 `walk` 函数使 walkers 前进。 +3. 发出 `outgoing_walkers` 向量中的所有的 walkers。 +4. 将新接收的 walkers 放入 `incoming_walkers` 向量中。 +5. 重复步骤 2 到 4,直到所有 walkers 完成。 + +下面是完成此程序的第一次尝试。 +此刻,我们不必担心如何确定所有 walkers 完成的时间。 +但在查看代码之前,我必须警告您-该代码不正确! +知晓这个问题以后,让我们看一下代码,希望您能发现它可能有什么问题。 + +```cpp +// Find your part of the domain +decompose_domain(domain_size, world_rank, world_size, + &subdomain_start, &subdomain_size); + +// Initialize walkers in your subdomain +initialize_walkers(num_walkers_per_proc, max_walk_size, + subdomain_start, subdomain_size, + &incoming_walkers); + +while (!all_walkers_finished) { // Determine walker completion later + // Process all incoming walkers + for (int i = 0; i < incoming_walkers.size(); i++) { + walk(&incoming_walkers[i], subdomain_start, subdomain_size, + domain_size, &outgoing_walkers); + } + + // Send all outgoing walkers to the next process. + send_outgoing_walkers(&outgoing_walkers, world_rank, + world_size); + + // Receive all the new incoming walkers + receive_incoming_walkers(&incoming_walkers, world_rank, + world_size); +} +``` + +一切看起来都很正常,但是函数调用的顺序引入了一种非常可能的情形 - 死锁。 + +## 死锁及预防 + +根据 Wikipedia 的说法,死锁 *是指两个或多个进程各自在等待另一个进程释放资源,或者两个或多个进程在循环链中等待资源的特定条件。* 代码将导致 `MPI_Send` 调用的循环链。 + +![Deadlock](deadlock-1.png) + +值得注意的是,上面的代码在大多数情况下实际上不会“死锁”。 +It is worth noting that the above code will actually **not** deadlock most of the time. +尽管 `MPI_Send` 是一个阻塞调用,但是 [MPI 规范](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_tl?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163) 表明 `MPI_Send` 会一直阻塞,直到可以**回收发送缓冲区为止**。 +这意味着当网络可以缓冲消息时,`MPI_Send` 将返回。 +如果发送最终无法被网络缓冲,它们将一直阻塞直到发布匹配的接收。 +在我们的例子中,有足够多的小发送和频繁匹配的接收而不必担心死锁,但是,永远不该假定有足够大的网络缓冲区。 + +由于在本文中我们仅关注 `MPI_Send` 和 `MPI_Recv`,因此避免可能发生的发送和接收死锁的最佳方法是对消息进行排序,以使发送将具有匹配的接收,反之亦然。 +一种简单的方法是更改循环,以使偶数编号的进程在接收 walkers 之前发送传出的 walkers,而奇数编号的进程则相反。 +在执行的两个阶段,发送和接收现在看起来像这样: + +![Deadlock prevention](deadlock-2.png) + +> **注意** - 使用一个进程执行此操作仍可能会死锁。为了避免这种情况,仅在使用一个进程时不要执行发送和接收。 + +您可能会问,这仍然适用于奇数个进程吗? +我们可以通过三个过程再次查看相似的图表: + +![Deadlock solution](deadlock-3.png) + +如您所见,在所有三个阶段中,至少有一个发布的 `MPI_Send` 与发布的 `MPI_Recv` 匹配,因此我们不必担心死锁的发生。 + +## Determining completion of all walkers + +现在是程序的最后一步 - 确定每个 walker 何时结束。 +由于 walkers 可以随机行走,因此它们可以在任何一个进程中结束它们的旅程。 +因此,如果没有某种额外的通信,所有进程都很难知道 walkers 何时全部结束。 +一种可能的解决方案是让进程零跟踪所有已完成的 walker,然后告诉其他所有进程何时终止。 +但是,这样的解决方案非常麻烦,因为每个进程都必须向进程 0 报告所有完成的 walker,然后还要处理不同类型的传入消息。 + +在本文中,我们让这件事情稍微简单一点。 +由于我们知道任意一个 walker 可以行进的最大距离和每对发送和接收对它可以行进的最小总大小(子域大小),因此我们可以计算出终止之前每个进程应该执行的发送和接收量。 +在我们避免死锁的策略中考虑这一特征,该程序的最后主要部分如下所示: + +```cpp +// Find your part of the domain +decompose_domain(domain_size, world_rank, world_size, + &subdomain_start, &subdomain_size); + +// Initialize walkers in your subdomain +initialize_walkers(num_walkers_per_proc, max_walk_size, + subdomain_start, subdomain_size, + &incoming_walkers); + +// Determine the maximum amount of sends and receives needed to +// complete all walkers +int maximum_sends_recvs = + max_walk_size / (domain_size / world_size) + 1; +for (int m = 0; m < maximum_sends_recvs; m++) { + // Process all incoming walkers + for (int i = 0; i < incoming_walkers.size(); i++) { + walk(&incoming_walkers[i], subdomain_start, subdomain_size, + domain_size, &outgoing_walkers); + } + + // Send and receive if you are even and vice versa for odd + if (world_rank % 2 == 0) { + send_outgoing_walkers(&outgoing_walkers, world_rank, + world_size); + receive_incoming_walkers(&incoming_walkers, world_rank, + world_size); + } else { + receive_incoming_walkers(&incoming_walkers, world_rank, + world_size); + send_outgoing_walkers(&outgoing_walkers, world_rank, + world_size); + } +} +``` + +## Running the application + +代码可在 [此处查看]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code). +与其他教程相反,此处代码使用 C++。 +在 [安装 MPICH2]({{ site.baseurl }}/tutorials/installing-mpich2/) 时,还安装了 C++ MPI 编译器(除非您另有明确配置)。 +如果将 MPICH2 安装在本地目录中,请确保已将 MPICXX 环境变量设置为指向正确的 mpicxx 编译器,以便使用我的 makefile。 + +在我的代码中,我设置了运行脚本来提供运行的默认值:域大小为 100,最大步行大小为 500,每个进程的步行者数量为 20。 +如果您从 [repo]({{ site.github.code }}) 的 *tutorials* 目录运行 random_walk 程序,它应该产生 5 个进程,并产生与下方类似的输出。 + +``` +>>> cd tutorials +>>> ./run.py random_walk +mpirun -n 5 ./random_walk 100 500 20 +Process 2 initiated 20 walkers in subdomain 40 - 59 +Process 2 sending 18 outgoing walkers to process 3 +Process 3 initiated 20 walkers in subdomain 60 - 79 +Process 3 sending 20 outgoing walkers to process 4 +Process 3 received 18 incoming walkers +Process 3 sending 18 outgoing walkers to process 4 +Process 4 initiated 20 walkers in subdomain 80 - 99 +Process 4 sending 18 outgoing walkers to process 0 +Process 0 initiated 20 walkers in subdomain 0 - 19 +Process 0 sending 17 outgoing walkers to process 1 +Process 0 received 18 incoming walkers +Process 0 sending 16 outgoing walkers to process 1 +Process 0 received 20 incoming walkers +``` + +输出将一直持续到各个进程完成所有 walkers 的发送和接收。 + +## 下一步是什么? + +接下来,我们将开始学习 MPI 中的*集体*通信。 +我们将从 [MPI Broadcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) 开始,对于所有教程,请转到 [MPI tutorials]({{ site.baseurl }}/tutorials/). + +另外,在一开始,我告诉您本文中的程序的概念适用于许多并行程序。 +我不想让您垂涎三尺,因此,我在下面提供了一些其他阅读材料,供那些希望了解更多信息的人使用。 +请享用 :-) + +## 附加阅读 - 随机游走及其与并行粒子跟踪的相似性 + +我们刚刚实现的随机游走问题虽然看似微不足道,但实际上可以构成模拟多种并行应用程序的基础。 +科学领域中的某些并行应用程序需要多种类型的随机发送和接收。 +一种示例应用是并行粒子跟踪。 + +![Flow visualization of tornado](tornado.png) + +并行粒子跟踪是用于可视化流场的主要方法之一。 +将粒子插入流场,然后使用数值积分技术(例如 Runge-Kutta)沿流线跟踪。 +然后可以呈现跟踪的路径以用于可视化目的。 +一个示例渲染是左上方的龙卷风图像。 + +执行有效的并行粒子跟踪可能非常困难。 +这样做的主要原因是,只有在积分的每个增量步骤之后才能确定粒子行进的方向。 +因此,线程很难协调和平衡所有通信和计算。 +为了更好地理解这一点,让我们看一下粒子跟踪的典型并行化。 + +![Parallel particle tracing illustration](parallel_particle_tracing.png) + +在此插图中,我们看到该域分为六个过程。 +然后将粒子(有时称为*种子*)放置在子域中(类似于我们将 walkers 放置在子域中的方式),然后开始跟踪它们。 +当粒子超出范围时,必须与具有适当子域的进程进行交换。 +重复此过程,直到粒子离开整个域或达到最大迹线长度为止。 + +可以使用 `MPI_Send`,`MPI_Recv` 和 `MPI_Probe` 来解决并行粒子跟踪问题,其方式与我们刚刚实现的应用程序类似。 +当然,还有许多更复杂的 MPI 例程可以更有效地完成这样的工作。 +我们将在接下来的教程中讨论这些问题:-) + +我只是希望您现在至少可以看到一个例子来说明随机游走问题与其他并行应用程序有何相似之处! From 895e0ea73b879fb03e80ceea2698573336587efb Mon Sep 17 00:00:00 2001 From: Benson Muite Date: Sat, 19 Dec 2020 08:57:24 +0300 Subject: [PATCH 078/108] Update MPICH version --- tutorials/installing-mpich2/index.md | 41 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index 723b2f3..c368782 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -8,33 +8,34 @@ translations: zh_cn redirect_from: '/installing-mpich2/' --- -MPI is simply a standard which others follow in their implementation. Because of this, there are a wide variety of MPI implementations out there. One of the most popular implementations, MPICH2, will be used for all of the examples provided through this site. Users are free to use any implementation they wish, but only instructions for installing MPICH2 will be provided. Furthermore, the scripts and code provided for the lessons are only guaranteed to execute and run with the lastest version of MPICH2. +MPI is simply a standard which others follow in their implementation. Because of this, there are a wide variety of MPI implementations out there. One of the most popular implementations, MPICH, will be used for all of the examples provided through this site. Users are free to use any implementation they wish, but only instructions for installing MPICH will be provided. Furthermore, the scripts and code provided for the lessons are only guaranteed to execute and run with the lastest version of MPICH. -MPICH2 is a widely-used implementation of MPI that is developed primarily by Argonne National Laboratory in the United States. The main reason for choosing MPICH2 over other implementations is simply because of my familiarity with the interface and because of my close relationship with Argonne National Laboratory. I also encourage others to check out OpenMPI, which is also a widely-used implementation. +MPICH is a widely-used implementation of MPI that is developed primarily by Argonne National Laboratory in the United States. The main reason for choosing MPICH over other implementations is simply because of my familiarity with the interface and because of my close relationship with Argonne National Laboratory. I also encourage others to check out [OpenMPI](https://www.open-mpi.org/), which is also a widely-used implementation. -## Installing MPICH2 -The latest version of MPICH2 is available [here](http://www.mcs.anl.gov/research/projects/mpich2/). The version that I will be using for all of the examples on the site is 1.4, which was released June 16, 2011. Go ahead and download the source code, uncompress the folder, and change into the MPICH2 directory. +## Installing MPICH +The latest version of MPICH is available [here](https://www.mpich.org/). The version that I will be using for all of the examples on the site is 3.3-2, which was released 13 November 2019. Go ahead and download the source code, uncompress the folder, and change into the MPICH3 directory. ``` ->>> tar -xzf mpich2-1.4.tar.gz ->>> cd mpich2-1.4 +>>> tar -xzf mpich3-3.2.tar.gz +>>> cd mpich3-3.2 ``` -Once doing this, you should be able to configure your installation by performing `./configure`. I added a couple of parameters to my configuration to avoid building the MPI Fortran library. If you need to install MPICH2 to a local directory (for example, if you don't have root access to your machine), type `./configure --prefix=/installation/directory/path` For more information about possible configuration parameters, type `./configure --help` +Once doing this, you should be able to configure your installation by performing `./configure`. If you need to install MPICH to a local directory (for example, if you don't have root access to your machine), type `./configure --prefix=/installation/directory/path`. It is possible to avoid building the MPI Fortran library by using `./configure --disable-fortran` if you do not have Fortran compilers. For more information about possible configuration parameters, type `./configure --help` ``` ->>> ./configure --disable-fortran -Configuring MPICH2 version 1.4 with '--disable-f77' '--disable-fc' -Running on system: Darwin Wes-Kendalls-Macbook-Pro.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu1504.9.37~1/RELEASE_I386 i386 -checking for gcc... gcc +>>> ./configure +Configuring MPICH version 3.3.2 +Running on system: Linux localhost.localdomain 5.8.18-100.fc31.x86_64 #1 SMP Mon Nov 2 20:32:55 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux +checking build system type... x86_64-unknown-linux-gnu ``` When configuration is done, it should say *"Configuration completed."* Once this is through, it is time to build and install MPICH2 with `make; sudo make install`. ``` >>> make; sudo make install -Beginning make -Using variables CC='gcc' CFLAGS=' -O2' LDFLAGS=' ' F77='' FFLAGS=' ' FC='' FCFLAGS=' ' CXX='c++' CXXFLAGS=' -O2' AR='ar' CPP='gcc-E' CPP +make +make all-recursive + ``` If your build was successful, you should be able to type `mpiexec --version` and see something similar to this. @@ -42,15 +43,15 @@ If your build was successful, you should be able to type `mpiexec --version` and ``` >>> mpiexec --version HYDRA build details: - Version: 3.1.4 - Release Date: Fri Feb 20 15:02:56 CST 2015 - CC: gcc - CXX: g++ - F77: - F90: + Version: 3.3.2 + Release Date: Tue Nov 12 21:23:16 CST 2019 + CC: gcc + CXX: g++ + F77: gfortran + F90: gfortran ``` Hopefully your build finished successfully. If not, you may have issues with missing dependencies. For any issue, I highly recommend copying and pasting the error message directly into Google. ## Up next -Now that you have built MPICH2 locally, you have some options of where you can proceed on this site. If you already have the hardware and resources to setup a local cluster, I suggest you proceed to the tutorial about [running an MPI cluster in LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan). If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you have built a cluster in either way or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. +Now that you have built MPICH locally, you have some options of where you can proceed on this site. If you already have the hardware and resources to setup a local cluster, I suggest you proceed to the tutorial about [running an MPI cluster in LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan). If you don't have access to a cluster or want to learn more about building a virtual MPI cluster, check out the lesson about [building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/). If you have built a cluster in either way or simply want to run the rest of the lessons from your machine, proceed to the [MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/), which provides an overview of the basics of programming and running your first MPI program. From a776a31a2ff38f6b5be70cfe096e3691ce72fd21 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Tue, 22 Dec 2020 15:36:07 +0800 Subject: [PATCH 079/108] Delete lines which has translated and forgot to delete --- .../dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md index 273429c..f289d30 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn.md @@ -37,7 +37,6 @@ MPI_Get_count( 为什么需要这些信息? 事实证明,`MPI_Recv` 可以将 `MPI_ANY_SOURCE` 用作发送端的秩,将 `MPI_ANY_TAG` 用作消息的标签。 在这种情况下,`MPI_Status` 结构体是找出消息的实际发送端和标签的唯一方法。 -Furthermore, `MPI_Recv` is not guaranteed to receive the entire amount of elements passed as the argument to the function call. 此外,并不能保证 `MPI_Recv` 能够接收函数调用参数的全部元素。 相反,它只接收已发送给它的元素数量(如果发送的元素多于所需的接收数量,则返回错误。) `MPI_Get_count` 函数用于确定实际的接收量。 @@ -80,9 +79,7 @@ if (world_rank == 0) { 如我们所见,进程 0 将最多 `MAX_NUMBERS` 个整数以随机数量发送到进程 1。 进程 1 然后调用 `MPI_Recv` 以获取总计 `MAX_NUMBERS` 个整数。 -Although process one is passing `MAX_NUMBERS` as the argument to `MPI_Recv`, process one will receive **at most** this amount of numbers. 尽管进程 1 以 `MAX_NUMBERS` 作为 `MPI_Recv` 函数参数,但进程 1 将最多接收到此数量的数字。 -In the code, process one calls `MPI_Get_count` with `MPI_INT` as the datatype to find out how many integers were actually received. 在代码中,进程 1 使用 `MPI_INT` 作为数据类型的参数,调用 `MPI_Get_count`,以找出实际接收了多少个整数。 除了打印出接收到的消息的大小外,进程 1 还通过访问 status 结构体的 `MPI_SOURCE` 和 `MPI_TAG` 元素来打印消息的来源和标签。 @@ -120,7 +117,6 @@ MPI_Probe( 当消息可用时,它将填充 status 结构体。 然后,用户可以使用 `MPI_Recv` 接收实际的消息。 -The [lesson code]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code) has an example of this in [probe.c]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c). [教程代码]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code) 在 probe.c 中有一个示例。 以下是源代码的主要部分 From fdc37da4dedfff4fa89dee326f37941a29dacd95 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Wed, 23 Dec 2020 23:32:07 +0800 Subject: [PATCH 080/108] Add Chinese translation for 'mpi reduce and allreduce' --- tutorials.md | 2 +- tutorials/mpi-reduce-and-allreduce/index.md | 1 + tutorials/mpi-reduce-and-allreduce/zh_cn.md | 226 ++++++++++++++++++++ 3 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 tutorials/mpi-reduce-and-allreduce/zh_cn.md diff --git a/tutorials.md b/tutorials.md index 7776ab3..3f65e63 100644 --- a/tutorials.md +++ b/tutorials.md @@ -26,7 +26,7 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L * [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) ([中文版]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/zh_cn)) ## Advanced collective communication -* [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) +* [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) ([中文版]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/zh_cn)) ## Groups and communicators * [Introduction to groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) diff --git a/tutorials/mpi-reduce-and-allreduce/index.md b/tutorials/mpi-reduce-and-allreduce/index.md index b808cab..209d263 100644 --- a/tutorials/mpi-reduce-and-allreduce/index.md +++ b/tutorials/mpi-reduce-and-allreduce/index.md @@ -3,6 +3,7 @@ layout: post title: MPI Reduce and Allreduce author: Wes Kendall categories: Beginner MPI +translations: zh_cn tags: MPI_Allreduce, MPI_Reduce redirect_from: '/mpi-reduce-and-allreduce/' --- diff --git a/tutorials/mpi-reduce-and-allreduce/zh_cn.md b/tutorials/mpi-reduce-and-allreduce/zh_cn.md new file mode 100644 index 0000000..bd853b4 --- /dev/null +++ b/tutorials/mpi-reduce-and-allreduce/zh_cn.md @@ -0,0 +1,226 @@ +--- +layout: post +title: MPI Reduce and Allreduce +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Allreduce, MPI_Reduce +redirect_from: '/mpi-reduce-and-allreduce/' +--- + +在 [上一节]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi) 中,我们介绍了一个使用`MPI_Scatter`和`MPI_Gather`的计算并行排名的示例。 。 +在本课中,我们将通过`MPI_Reduce`和`MPI_Allreduce`进一步扩展集体通信例程。 + +> **Note** - 本教程的所有代码都在 [GitHub]({{ site.github.repo }}) 上。本教程的代码位于 [tutorials/mpi-reduce-and-allreduce/code]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code) 下。 + +## 归约简介 + +*归约* 是函数式编程中的经典概念。 +数据归约包括通过函数将一组数字归约为较小的一组数字。 +例如,假设我们有一个数字列表 `[1,2,3,4,5]`。 +用 sum 函数归约此数字列表将产生 `sum([1、2、3、4、5]) = 15`。 +类似地,乘法归约将产生 `multiply([1、2、3、4、5]) = 120`。 + +就像您想象的那样,在一组分布式数字上应用归约函数可能非常麻烦。 +随之而来的是,难以有效地实现非可交换的归约,即必须以设定顺序发生的缩减。 +幸运的是,MPI 有一个方便的函数,`MPI_Reduce`,它将处理程序员在并行程序中需要执行的几乎所有常见的归约操作。 + +## MPI_Reduce + +与 `MPI_Gather` 类似,`MPI_Reduce` 在每个进程上获取一个输入元素数组,并将输出元素数组返回给根进程。 +输出元素包含减少的结果。 +`MPI_Reduce` 的原型如下所示: + +```cpp +MPI_Reduce( + void* send_data, + void* recv_data, + int count, + MPI_Datatype datatype, + MPI_Op op, + int root, + MPI_Comm communicator) +``` + +`send_data` 参数是每个进程都希望归约的 `datatype` 类型元素的数组。 +`recv_data` 仅与具有 `root` 秩的进程相关。 +`recv_data` 数组包含归约的结果,大小为`sizeof(datatype)* count`。 +`op` 参数是您希望应用于数据的操作。 +MPI 包含一组可以使用的常见归约运算。 +尽管可以定义自定义归约操作,但这超出了本教程的范围。 +MPI 定义的归约操作包括: + +* `MPI_MAX` - 返回最大元素。 +* `MPI_MIN` - 返回最小元素。 +* `MPI_SUM` - 对元素求和。 +* `MPI_PROD` - 将所有元素相乘。 +* `MPI_LAND` - 对元素执行逻辑*与*运算。 +* `MPI_LOR` - 对元素执行逻辑*或*运算。 +* `MPI_BAND` - 对元素的各个位按位*与*执行。 +* `MPI_BOR` - 对元素的位执行按位*或*运算。 +* `MPI_MAXLOC` - 返回最大值和所在的进程的秩。 +* `MPI_MINLOC` - 返回最小值和所在的进程的秩。 + +下面是 `MPI_Reduce` 通信模式的说明。 + +![MPI_Reduce](mpi_reduce_1.png) + +在上图中,每个进程包含一个整数。 +调用 `MPI_Reduce` 的根进程为 0,并使用 `MPI_SUM` 作为归约运算。 +这四个数字相加后将结果存储在根进程中。 + +查看当进程拥有多个元素时会发生什么也很有用。 +下图显示了每个进程归约多个数字的情况。 + +![MPI_Reduce](mpi_reduce_2.png) + +上图中的每个进程都有两个元素。 +结果求和基于每个元素进行。 +换句话说,不是将所有数组中的所有元素累加到一个元素中,而是将每个数组中的第 i 个元素累加到进程 0 结果数组中的第 i 个元素中。 + +现在您了解了 `MPI_Reduce` 的外观,我们可以尝试一些代码示例。 + +## 使用 MPI_Reduce 计算均值 + +在 [上一节]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather) 中,我们展示了如何使用 `MPI_Scatter` 和 `MPI_Gather` 计算平均值。 +使用 `MPI_Reduce` 可以简化上一节的代码。 +以下是本节示例代码中 [reduce_avg.c]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c) 的片段。 + +```cpp +float *rand_nums = NULL; +rand_nums = create_rand_nums(num_elements_per_proc); + +// Sum the numbers locally +float local_sum = 0; +int i; +for (i = 0; i < num_elements_per_proc; i++) { + local_sum += rand_nums[i]; +} + +// Print the random numbers on each process +printf("Local sum for process %d - %f, avg = %f\n", + world_rank, local_sum, local_sum / num_elements_per_proc); + +// Reduce all of the local sums into the global sum +float global_sum; +MPI_Reduce(&local_sum, &global_sum, 1, MPI_FLOAT, MPI_SUM, 0, + MPI_COMM_WORLD); + +// Print the result +if (world_rank == 0) { + printf("Total sum = %f, avg = %f\n", global_sum, + global_sum / (world_size * num_elements_per_proc)); +} +``` + +在上面的代码中,每个进程都会创建随机数并计算和保存在 `local_sum` 中。 +然后使用 `MPI_SUM` 将 `local_sum` 归约至根进程。 +然后,全局平均值为 `global_sum / (world_size * num_elements_per_proc)`。 +如果您从 [repo]({{site.github.code}}) 的 *tutorials* 目录中运行 reduce_avg 程序,则输出应与此类似。 + +``` +>>> cd tutorials +>>> ./run.py reduce_avg +mpirun -n 4 ./reduce_avg 100 +Local sum for process 0 - 51.385098, avg = 0.513851 +Local sum for process 1 - 51.842468, avg = 0.518425 +Local sum for process 2 - 49.684948, avg = 0.496849 +Local sum for process 3 - 47.527420, avg = 0.475274 +Total sum = 200.439941, avg = 0.501100 +``` + +Now it is time to move on to the sibling of `MPI_Reduce` - `MPI_Allreduce`. +现在是时候接触 `MPI_Reduce` 的同级对象 - `MPI_Allreduce` 了。 + +## MPI_Allreduce + +许多并行程序中,需要在所有进程而不是仅仅在根进程中访问归约的结果。 +以与 `MPI_Gather` 相似的补充方式,`MPI_Allreduce` 将归约值并将结果分配给所有进程。 +函数原型如下: + +```cpp +MPI_Allreduce( + void* send_data, + void* recv_data, + int count, + MPI_Datatype datatype, + MPI_Op op, + MPI_Comm communicator) +``` + +您可能已经注意到,`MPI_Allreduce` 与 `MPI_Reduce` 相同,不同之处在于它不需要根进程 ID(因为结果分配给所有进程)。 +下图介绍了 `MPI_Allreduce` 的通信模式: +![MPI_Allreduce](mpi_allreduce_1.png) + +`MPI_Allreduce` is the equivalent of doing `MPI_Reduce` followed by an `MPI_Bcast`. +`MPI_Allreduce` 等效于先执行 `MPI_Reduce`,然后执行 `MPI_Bcast`。 +很简单,对吧? + +## 使用 MPI_Allreduce 计算标准差 + +许多计算问题需要进行多次归约来解决。 +一个这样的问题是找到一组分布式数字的标准差。 +或许您可能已经遗忘了什么是标准差,标准差是数字与均值之间的离散程度的度量。 +较低的标准差表示数字靠得更近,对于较高的标准差则相反。 + +要找到标准差,必须首先计算所有数字的平均值。 +总和均值的平方根是最终结果。 +给定问题描述,我们知道所有数字至少会有两个和,转化为两个归约。 +本文代码 [reduce_stddev.c]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c) 中的一个片段展示了如何应用 MPI 解决此问题的概况。 + +```cpp +rand_nums = create_rand_nums(num_elements_per_proc); + +// Sum the numbers locally +float local_sum = 0; +int i; +for (i = 0; i < num_elements_per_proc; i++) { + local_sum += rand_nums[i]; +} + +// Reduce all of the local sums into the global sum in order to +// calculate the mean +float global_sum; +MPI_Allreduce(&local_sum, &global_sum, 1, MPI_FLOAT, MPI_SUM, + MPI_COMM_WORLD); +float mean = global_sum / (num_elements_per_proc * world_size); + +// Compute the local sum of the squared differences from the mean +float local_sq_diff = 0; +for (i = 0; i < num_elements_per_proc; i++) { + local_sq_diff += (rand_nums[i] - mean) * (rand_nums[i] - mean); +} + +// Reduce the global sum of the squared differences to the root +// process and print off the answer +float global_sq_diff; +MPI_Reduce(&local_sq_diff, &global_sq_diff, 1, MPI_FLOAT, MPI_SUM, 0, + MPI_COMM_WORLD); + +// The standard deviation is the square root of the mean of the +// squared differences. +if (world_rank == 0) { + float stddev = sqrt(global_sq_diff / + (num_elements_per_proc * world_size)); + printf("Mean - %f, Standard deviation = %f\n", mean, stddev); +} +``` + +在上面的代码中,每个进程都会计算元素的局部总和 `local_sum`,并使用 `MPI_Allreduce `对它们求和。 +在所有进程上都有全局总和后,将计算均值 `mean`,以便可以计算局部距平的平方 `local_sq_diff`。 +一旦计算出所有局部距平的平方,就可以通过使用 `MPI_Reduce` 得到全局距平的平方 `global_sq_diff`。 +然后,根进程可以通过取全局距平的平方的平均值的平方根来计算标准差。 + +使用运行脚本运行示例代码将产生如下输出: + +``` +>>> ./run.py reduce_stddev +mpirun -n 4 ./reduce_stddev 100 +Mean - 0.501100, Standard deviation = 0.301126 +``` + +## Up next + +现在您可以轻松使用所有常见的集合 - `MPI_Bcast`,`MPI_Scatter`,`MPI_Gather` 和 `MPI_Reduce`,我们可以利用它们来构建复杂的并行程序。 +在下一节中,我们将开始研究 [MPI 组和通讯器]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/). + +对于所有教程,请转到 [MPI 教程部分]({{ site.baseurl }}/tutorials/). From b7c717474a55f22b298136a1128f643783f5bdbb Mon Sep 17 00:00:00 2001 From: jokervTv Date: Tue, 29 Dec 2020 11:15:38 +0800 Subject: [PATCH 081/108] Improve translation and ensure consistency --- .../performing-parallel-rank-with-mpi/zh_cn.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md index f66c593..bfa4828 100644 --- a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md +++ b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md @@ -21,7 +21,7 @@ redirect_from: '/performing-parallel-rank-with-mpi/zh_cn' 图示中的进程(标记为0到3)开始时有四个数字—— 5、2、7和4。然后,并行排名算法算出进程1在数字集合中的排名为0(即第一个数字),进程3排名为1,进程0排名为2,进程2排在整个数字集合的最后。很简单,对吧? ## 并行排名API定义 -在深入研究并行排名问题之前,让我们首先确定函数的行为方式。我们的函数需要在每个进程上取一个数字,并返回其相对于所有其他进程中的数字的排名。与此同时,我们将需要其他各种信息,例如正在使用的通信器(communicator)以及被排名的数字的数据类型。 给定这个函数定义后,我们的排名函数原型如下所示: +在深入研究并行排名问题之前,让我们首先确定函数的行为方式。我们的函数需要在每个进程上取一个数字,并返回其相对于所有其他进程中的数字的排名。与此同时,我们将需要其他各种信息,例如正在使用的通讯器(communicator)以及被排名的数字的数据类型。 给定这个函数定义后,我们的排名函数原型如下所示: ```cpp TMPI_Rank( @@ -32,7 +32,7 @@ TMPI_Rank( ``` `TMPI_Rank` 把 `send_data` 作为缓冲区,其中包含一个类型为 `datatype` 的数字。 -`recv_data` 在每个进程中只接收一个整数,即 `send_data` 的排名。`comm` 变量是进行排名的通信器。 +`recv_data` 在每个进程中只接收一个整数,即 `send_data` 的排名。`comm` 变量是进行排名的通讯器。 > **注意** - MPI标准明确指出,用户不应以 `MPI` 起头命名自己的函数,如 `MPI_`,以避免将用户函数与MPI标准本身的函数混淆。 因此,在这些教程中,我们将在函数前面加上 `T`。 @@ -66,7 +66,7 @@ void *gather_numbers_to_root(void *number, MPI_Datatype datatype, } ``` -`gather_numbers_to_root` 函数获取要收集的数字(即 `send_data` 变量)、数字的数据类型 `datatype` 和 `comm` 通信器。根进程必须在此函数中收集 `comm_size` 个数字,因此它会分配 `datatype_size * comm_size` 长度的数组。在本教程中,通过使用新的MPI函数- `MPI_Type_size` 来收集`datatype_size`变量。尽管我们的代码仅支持将 `MPI_INT` 和 `MPI_FLOAT` 作为数据类型,但可将其扩展以支持不同大小的数据类型。 在使用 `MPI_Gather` 在根进程上收集了数字之后,必须在根进程上对数字进行排序,以确定它们排名。 +`gather_numbers_to_root` 函数获取要收集的数字(即 `send_data` 变量)、数字的数据类型 `datatype` 和 `comm` 通讯器。根进程必须在此函数中收集 `comm_size` 个数字,因此它会分配 `datatype_size * comm_size` 长度的数组。在本教程中,通过使用新的MPI函数- `MPI_Type_size` 来收集`datatype_size`变量。尽管我们的代码仅支持将 `MPI_INT` 和 `MPI_FLOAT` 作为数据类型,但可将其扩展以支持不同大小的数据类型。 在使用 `MPI_Gather` 在根进程上收集了数字之后,必须在根进程上对数字进行排序,以确定它们排名。 ## 排序数字并维护所属 在我们的排名函数中,排序数字不一定是难题。 C标准库为我们提供了流行的排序算法,例如 `qsort`。 在并行排名问题中,排序的困难在于,我们必须维护各个进程将数字发送到根进程的次序。 如果我们要对收集到根进程的数组进行排序而不给数字附加信息,则根进程将不知道如何将数字的排名发送回原来请求的进程! @@ -74,7 +74,7 @@ void *gather_numbers_to_root(void *number, MPI_Datatype datatype, 为了便于将所属进程附到对应数字上,我们在代码中创建了一个结构体(struct)来保存此信息。 我们的结构定义如下: ```cpp -// 保存进程在通信器中的次序(rank)和对应数字 +// 保存进程在通讯器中的次序(rank)和对应数字 // 该结构体用于数组排序, // 并同时完整保留所属进程信息 @@ -87,12 +87,12 @@ typedef struct { } CommRankNumber; ``` -`CommRankNumber` 结构体保存了我们要排序的数字(记住它可以是浮点数或整数,因此我们使用联合体union),并且它拥有该数字所属进程在通信器中的次序(rank)。 代码的下一部分,即 `get_ranks` 函数,负责创建这些结构体并对它们进行排序。 +`CommRankNumber` 结构体保存了我们要排序的数字(记住它可以是浮点数或整数,因此我们使用联合体union),并且它拥有该数字所属进程在通讯器中的次序(rank)。 代码的下一部分,即 `get_ranks` 函数,负责创建这些结构体并对它们进行排序。 ```cpp // 这个函数在根进程上对收集到的数字排序 -// 返回一个数组,数组按进程在通信器中的次序排序 +// 返回一个数组,数组按进程在通讯器中的次序排序 // 注意 - 该函数只在根进程上运行 int *get_ranks(void *gathered_numbers, int gathered_number_count, @@ -136,7 +136,7 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, } ``` -`get_ranks` 函数首先创建一个CommRankNumber结构体数组,并附上该数字所属进程在通信器中的次序。 如果数据类型为 `MPI_FLOAT` ,则对我们的结构体数组调用 `qsort` 时,会使用特殊的排序函数,(代码见[tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)。 类似的,如果数据类型为 `MPI_INT` ,我们将使用不同的排序函数。 +`get_ranks` 函数首先创建一个CommRankNumber结构体数组,并附上该数字所属进程在通讯器中的次序。 如果数据类型为 `MPI_FLOAT` ,则对我们的结构体数组调用 `qsort` 时,会使用特殊的排序函数,(代码见[tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)。 类似的,如果数据类型为 `MPI_INT` ,我们将使用不同的排序函数。 在对数字进行排序之后,我们必须以适当的顺序创建一个排名数组(array of ranks),以便将它们分散(scatter)回到请求的进程中。这是通过创建 `ranks` 数组并为每个已排序的 `CommRankNumber` 结构体填充适当的排名来实现的。 From bb520f0d948713f83e913079180db741879348bf Mon Sep 17 00:00:00 2001 From: jokervTv Date: Tue, 29 Dec 2020 11:18:25 +0800 Subject: [PATCH 082/108] Add Chinese translation for 'Groups and Communicators' --- tutorials.md | 2 +- .../index.md | 1 + .../zh_cn.md | 288 ++++++++++++++++++ 3 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 tutorials/introduction-to-groups-and-communicators/zh_cn.md diff --git a/tutorials.md b/tutorials.md index 3f65e63..e477fbe 100644 --- a/tutorials.md +++ b/tutorials.md @@ -29,4 +29,4 @@ The tutorials assume that the reader has a basic knowledge of C, some C++, and L * [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) ([中文版]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/zh_cn)) ## Groups and communicators -* [Introduction to groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) +* [Introduction to groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) ([中文版]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/zh_cn)) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index c89acaa..078c4fb 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -3,6 +3,7 @@ layout: post title: Introduction to Groups and Communicators author: Wesley Bland categories: Advanced MPI +translations: zh_cn tags: MPI_Group, MPI_Comm redirect_from: '/introduction-to-groups-and-communicators/' --- diff --git a/tutorials/introduction-to-groups-and-communicators/zh_cn.md b/tutorials/introduction-to-groups-and-communicators/zh_cn.md new file mode 100644 index 0000000..c3cd193 --- /dev/null +++ b/tutorials/introduction-to-groups-and-communicators/zh_cn.md @@ -0,0 +1,288 @@ +--- +layout: post +title: Introduction to Groups and Communicators +author: Wesley Bland +categories: Advanced MPI +tags: MPI_Group, MPI_Comm +redirect_from: '/introduction-to-groups-and-communicators/' +--- + +在以前的教程中,我们使用了通讯器 `MPI_COMM_WORLD`。 +对于简单的程序,这已经足够了,因为我们的进程数量相对较少,并且通常要么一次要与其中之一对话,要么一次要与所有对话。 +当程序规模开始变大时,这变得不那么实用了,我们可能只想一次与几个进程进行对话。 +在本次教程中,我们将展示如何创建新的通讯器,以便一次与原始线程组的子集进行沟通。 + +> **注意**- 本站点的所有代码都在 [GitHub]({{ site.github.repo }}) 上。本教程的代码在 [tutorials/introduction-to-groups-and-communicators/code]({{ site.github.code }}/tutorials/introduction-to-groups-and-communicators/code) 目录下。 + +## 通讯器概述 + +正如我们在学习集体例程时所看到的那样,MPI 允许您立即与通讯器中的所有进程进行对话,以执行诸如使用 `MPI_Scatter` 将数据从一个进程分发到多个进程或使用 `MPI_Reduce` 执行数据归约的操作。 +但是,到目前为止,我们仅使用了默认的通讯器 `MPI_COMM_WORLD`。 + +对于简单的应用程序,使用 `MPI_COMM_WORLD` 进行所有操作并不罕见,但是对于更复杂的用例,拥有更多的通讯器可能会有所帮助。 +例如,如果您想对网格中进程的子集执行计算。 +例如,每一行中的所有进程都可能希望对一个值求和。 +这将是第一个也是最常见的用于创建新的通讯器的函数: + +```cpp +MPI_Comm_split( + MPI_Comm comm, + int color, + int key, + MPI_Comm* newcomm) +``` + +顾名思义,`MPI_Comm_split` 通过基于输入值 `color` 和 `key` 将通讯器“拆分”为一组子通讯器来创建新的通讯器。 +在这里需要注意的是,原始的通讯器并没有消失,但是在每个进程中都会创建一个新的通讯器。 +第一个参数 `comm` 是通讯器,它将用作新通讯器的基础。 +这可能是 `MPI_COMM_WORLD`,但也可能是其他任何通讯器。 +第二个参数 `color` 确定每个进程将属于哪个新的通讯器。 +为 `color` 传递相同值的所有进程都分配给同一通讯器。 +如果 `color` 为 `MPI_UNDEFINED`,则该进程将不包含在任何新的通讯器中。 +第三个参数 `key` 确定每个新通讯器中的顺序(秩)。 +传递 `key` 最小值的进程将为 0,下一个最小值将为 1,依此类推。 +如果存在平局,则在原始通讯器中秩较低的进程将是第一位。 +最后一个参数 `newcomm` 是 MPI 如何将新的通讯器返回给用户。 + +## 使用多个通讯器的示例 + +现在,让我们看一个简单的示例,在该示例中,我们尝试将单个全局通讯器拆分为一组较小的通讯器。 +在此示例中,我们将想象我们已经在逻辑上将原始通讯器布局为共 16 个进程的 4x4 网格,并且希望按行划分网格。 +为此,每一行将获得自己的颜色(参数 `color`)。 +在下图中,您可以看到左图具有相同颜色的每组进程如何最终变成右图的自己的通讯器。 + +![MPI_Comm_split example](comm_split.png) + +让我们看一下代码。 + +```cpp +// 获取原始通讯器的秩和大小 +int world_rank, world_size; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +int color = world_rank / 4; // 根据行确定颜色 + +// 根据颜色拆分通讯器,然后调用 +// 利用原始秩 +MPI_Comm row_comm; +MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); + +int row_rank, row_size; +MPI_Comm_rank(row_comm, &row_rank); +MPI_Comm_size(row_comm, &row_size); + +printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", + world_rank, world_size, row_rank, row_size); + +MPI_Comm_free(&row_comm); +``` + +前几行获得原始通讯器 `MPI_COMM_WORLD` 的秩和大小。 +下一行执行确定局部进程 `color` 的重要操作。 +请记住,`color` 决定了拆分后该进程所属的通讯器。 +接下来,我们将看到所有重要的拆分操作。 +这里的新事物是,我们使用原始秩(`world_rank`)作为拆分操作的 `key`。 +由于我们希望新通讯器中的所有进程与原始通讯器中的所有进程处于相同的顺序,因此在这里使用原始等级值最有意义,因为它已经正确地排序了。 +之后,我们将打印出新的等级和大小以确保其有效。 +您的输出应如下所示: + +``` +WORLD RANK/SIZE: 0/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 1/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 2/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 3/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 4/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 5/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 6/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 7/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 8/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 9/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 10/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 11/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 12/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 13/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 14/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 15/16 ROW RANK/SIZE: 3/4 +``` + +如果您的顺序不正确,请不要惊慌。 +当您在 MPI 程序中显示内容时,每个进程都必须将其输出发回启动 MPI 作业的位置,然后才能将其打印到屏幕上。 +这往往意味着排序变得混乱,因为您永远无法假设仅以特定的秩顺序打印内容,即输出结果实际上将按照您期望的顺序结束,但是显示不是。 +只是在这里重新排列输出内容,以至看起来不错。 + +最后,我们使用 `MPI_Comm_free` 释放通讯器。 +这似乎不是一个重要的步骤,但与在其他任何程序中使用完内存后释放内存一样重要。 +当不再使用 MPI 对象时,应将其释放,以便以后重用。 +MPI 一次可以创建的对象数量有限,如果 MPI 用完了可分配对象,则不释放对象可能会导致运行时错误。 + +## 其他通讯器创建函数 + +尽管 `MPI_Comm_split` 是最常见的通讯器创建函数,但还有许多其他函数。 +`MPI_Comm_dup` 是最基本的,它创建了一个通讯器的副本。 +似乎存在一个仅创建副本的函数似乎很奇怪,但这对于使用库执行特殊函数的应用(例如数学库)非常有用。 +在这类应用中,重要的是用户代码和库代码不要互相干扰。 +为了避免这种情况,每个应用程序应该做的第一件事是创建 `MPI_COMM_WORLD` 的副本,这将避免其他使用 `MPI_COMM_WORLD` 的库的问题。 +库本身也应该复制 `MPI_COMM_WORLD` 以避免相同的问题。 + +另一个功能是 `MPI_Comm_create`。 +乍一看,此功能与 `MPI_Comm_create_group` 非常相似。 +其原型几乎相同: + +```cpp +MPI_Comm_create( + MPI_Comm comm, + MPI_Group group, + MPI_Comm* newcomm) +``` + +然而,主要区别(除了缺少 `tag` 参数之外)是,`MPI_Comm_create_group` 仅是 `group` 中包含的一组进程的集合,而 `MPI_Comm_create` 是 `comm` 中每个进程的集合。 +当通讯器的规模很大时,这是一个重要的区别。 +如果尝试在运行 1,000,000 个进程时创建 `MPI_COMM_WORLD` 的子集,则重要的是使用尽可能少的进程来执行该操作,因为大型集的开销会变得非常昂贵。 + +通讯器还有其他一些更高级的功能,我们在这里不介绍,例如内部通讯器与内部通讯器之间的差异以及其他高级通讯器创建功能。 +这些仅用于非常特殊的应用,以后的教程中可能会介绍这些应用程序。 + +## 组的概述 + +尽管 `MPI_Comm_split` 是创建新通讯器的最简单的方法,但并非唯一的方法。 +创建通讯器有更灵活的方法,但是它们使用一种新的 MPI 对象 `MPI_Group`。 +在详细讨论组之前,让我们再回顾一下通讯器的实际含义。 +在内部,MPI 必须(除其他事项外)保持通讯器的两个主要部分,即区分一个通讯器与另一个通讯器的上下文(或 ID)以及该通讯器包含的一组进程。 +The context is what prevents an operation on one communicator from matching with a similar operation on another communicator. +上下文阻止了与一个通讯器上的操作匹配的另一通讯器上的类似操作。 +MPI 在内部为每个通讯器保留一个 ID,以防止混淆。 +组更易于理解,因为它只是通讯器中所有进程的集合。 +对于 `MPI_COMM_WORLD`,这是由 `mpiexec` 启动的所有进程。 +对于其他通讯器,组将有所不同。 +在上面的示例代码中,组是所有以相同的 `color` 传参给 `MPI_Comm_split` 的进程。 + +MPI 使用通常起作用集合理论的相同方式来使用这些组。 +您不必熟悉所有的集合理论即可理解 MPI,但是了解两个操作的含义会有所帮助。 +首先,**并**会从其他两个集合中创建一个新的(可能)更大的集合。 +新集合包括前两个集合的所有成员(无重复)。 +其次,**交**会从其他两个集合中创建一个新的(可能)更小的集合。 +新集合包括两个原始集合中都存在的所有成员。 +您可以在下面以图形方式查看这两个操作的示例。 +随后,我们将使用适用于 MPI 的术语“组”(`groups`),而非“集合“(`sets`)。 + +![Group Operation Examples](groups.png) + +在第一个示例中,两个组 `{0,1,2,3}` 和 `{2,3,4,5}` 的并集是 `{0,1,2,3,4,5}`,因为这些项中的每一个都出现在组中。 +在第二个示例中,两个组 `{0,1,2,3}` 和 `{2,3,4,5}` 的交集为 `{2,3}`,因为每个组中同时仅出现那些项。 + +## Using MPI groups + +现在,我们了解了组工作原理的基础,让我们看看如何将其应用于 MPI 操作。 +在 MPI 中,很容易通过 API 调用 `MPI_Comm_group` 来获取通讯器中的进程组。 + +```cpp +MPI_Comm_group( + MPI_Comm comm, + MPI_Group* group) +``` + +如上所述,通讯器包含一个上下文或 ID,以及一个组。 +调用 `MPI_Comm_group` 会得到对该组对象的引用。 +组对象的工作方式与通讯器对象相同,不同之处在于您不能使用它与其他秩进行通信(因为它没有附加上下文)。 +您仍然可以获取组的秩和大小(分别为 `MPI_Group_rank` 和 `MPI_Group_size`)。 +但是,组特有的功能而通讯器无法完成的工作是可以使用组在本地构建新的组。 +在此记住本地操作和远程操作之间的区别很重要。 +远程操作涉及与其他秩的通信,而本地操作则没有。 +创建新的通讯器是一项远程操作,因为所有进程都需要决定相同的上下文和组,而在本地创建组是因为它不用于通信,因此每个进程不需要具有相同的上下文。 +您可以随意操作一个组,而无需执行任何通信。 + +一旦有一个或两个组,对它们执行操作就很简单。 +**并**看起来像这样: + +```cpp +MPI_Group_union( + MPI_Group group1, + MPI_Group group2, + MPI_Group* newgroup) +``` + +您可能会猜到**交**看起来像这样: + +```cpp +MPI_Group_intersection( + MPI_Group group1, + MPI_Group group2, + MPI_Group* newgroup) +``` + +在这两种情况下,操作均在 `group1` 和 `group2` 上执行,结果存储在 `newgroup` 中。 + +MPI 中有许多关于组的用法。 +您可以比较组以查看它们是否相同,从另一个组中减去一个组,从组中排除特定秩,或使用一个组将一个组的秩转换为另一组。 +但是,MPI 中可能是最有用的一个函数是 `MPI_Comm_create_group`。 +这是一个用于创建新通讯器的函数,但无需像 `MPI_Comm_split` 之类那样需要进行计算以决定组成,该函数将使用一个 `MPI_Group` 对象并创建一个与组具有相同进程的新通讯器。 + +```cpp +MPI_Comm_create_group( + MPI_Comm comm, + MPI_Group group, + int tag, + MPI_Comm* newcomm) +``` + +## Example of using groups + +让我们看一下使用组的简单示例。 +在这里,我们将使用另一个函数,该函数允许您选择组中的特定秩并构建为新组,即 `MPI_Group_incl`。 + +```cpp +MPI_Group_incl( + MPI_Group group, + int n, + const int ranks[], + MPI_Group* newgroup) +``` + +该函数中,`newgroup` 将包含 `group` 中的秩存在于 `ranks` 数组中的 `n` 个进程。 +想看看它是如何工作的? +让我们尝试创建一个包含来自 `MPI_COMM_WORLD` 的主要秩的通讯器。 + +```cpp +// 获取原始通讯器的等级和大小 +int world_rank, world_size; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +// 获取 MPI_COMM_WORLD 中的进程组 +MPI_Group world_group; +MPI_Comm_group(MPI_COMM_WORLD, &world_group); + +int n = 7; +const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; + +// 构造一个包含 world_group 中所有主要秩的组 +MPI_Group prime_group; +MPI_Group_incl(world_group, 7, ranks, &prime_group); + +// 根据组创建一个新的通讯器 +MPI_Comm prime_comm; +MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); + +int prime_rank = -1, prime_size = -1; +// 如果此秩不在新的通讯器中,则为 +// MPI_COMM_NULL。使用 MPI_COMM_NULL 作为 MPI_Comm_rank 或 +// MPI_Comm_size 的错误 +if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_rank(prime_comm, &prime_rank); + MPI_Comm_size(prime_comm, &prime_size); +} + +printf("WORLD RANK/SIZE: %d/%d \t PRIME RANK/SIZE: %d/%d\n", + world_rank, world_size, prime_rank, prime_size); + +MPI_Group_free(&world_group); +MPI_Group_free(&prime_group); +MPI_Comm_free(&prime_comm); +``` + +在此示例中,我们通过仅选择 `MPI_COMM_WORLD` 中的主要秩来构建通讯器。 +这是通过 `MPI_Group_incl` 完成的,并将结果存储在 `prime_group` 中。 +接下来,我们将该组传递给 `MPI_Comm_create_group` 以创建 `prime_comm`。 +At the end, we have to be careful to not use `prime_comm` on processes which don't have it, therefore we check to ensure that the communicator is not `MPI_COMM_NULL`, which is returned from `MPI_Comm_create_group` on the ranks not included in `ranks`. +最后,我们必须小心不要在没有 `prime_comm` 的进程上使用 `prime_comm`,因此我们要检查以确保通讯器不是 `MPI_COMM_NULL` 状态 —— 不在 `ranks` 中而从 `MPI_Comm_create_group` 返回的结果。 From d9eae836a45f93e7ae01b385f3163b4f2f7b77e6 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Tue, 29 Dec 2020 11:20:19 +0800 Subject: [PATCH 083/108] Remove extra brackets --- tutorials/introduction-to-groups-and-communicators/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index 078c4fb..96e703c 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -149,7 +149,6 @@ MPI_Comm_create_group( MPI_Group group, int tag, MPI_Comm* newcomm) -) ``` ## Example of using groups From b4410d842a8f53ed2b9554bb389fa548f08b6425 Mon Sep 17 00:00:00 2001 From: jokervTv Date: Thu, 7 Jan 2021 16:15:48 +0800 Subject: [PATCH 084/108] Maintain consistency between Chinese and English --- tutorials/installing-mpich2/zh_cn.md | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/tutorials/installing-mpich2/zh_cn.md b/tutorials/installing-mpich2/zh_cn.md index 73b9de0..cb6abac 100644 --- a/tutorials/installing-mpich2/zh_cn.md +++ b/tutorials/installing-mpich2/zh_cn.md @@ -9,34 +9,33 @@ redirect_from: '/installing-mpich2/' MPI 只是众多实现中所遵循的一个标准。 因此,这里有各种各样的 MPI 实现。 -本站点提供的所有示例都将使用最受欢迎的实现之一 MPICH2。 -用户可以自由使用他们希望的任何实现,但是仅提供安装 MPICH2 的说明。 -此外,仅保证为课程提供的脚本和代码可以在最新版本的 MPICH2 上执行和运行。 +本站点提供的所有示例都将使用最受欢迎的实现之一 MPICH。 +用户可以自由使用他们希望的任何实现,但是仅提供安装 MPICH 的说明。 +此外,仅保证为课程提供的脚本和代码可以在最新版本的 MPICH 上执行和运行。 -MPICH2 是 MPI 的一种广泛使用的实现,主要由美国的 Argonne 国家实验室开发。 -选择 MPICH2 而不是其他实现的主要原因是由于我对界面的熟悉以及与 Argonne 国家实验室的密切关系。 +MPICH 是 MPI 的一种广泛使用的实现,主要由美国的 Argonne 国家实验室开发。 +选择 MPICH 而不是其他实现的主要原因是由于我对界面的熟悉以及与 Argonne 国家实验室的密切关系。 我还鼓励其他人使用 OpenMPI,这也是一种广泛使用的实现。 -## Installing MPICH2 +## Installing MPICH -MPICH2 的最新版本可在 [此处](http://www.mcs.anl.gov/research/projects/mpich2/) 获取。 -网站上所有示例的版本是 1.4,该版本于 2011 年 6 月 16 日发布。 -下载源代码,解压缩文件夹,然后切换到 MPICH2 目录。 +MPICH 的最新版本可在 [此处](https://www.mpich.org/) 获取。 +网站上所有示例的版本是 3.3-2,该版本于 2019 年 9 月 13 日发布。 +下载源代码,解压缩文件夹,然后切换到 MPICH 目录。 ``` ->>> tar -xzf mpich2-1.4.tar.gz ->>> cd mpich2-1.4 +>>> tar -xzf mpich3-3.2.tar.gz +>>> cd mpich3-3.2 ``` -完成之后,您应该能够通过执行`./configure`来配置安装。 -我在配置中添加了两个参数,以避免构建 MPI Fortran 库。 -如果需要将 MPICH2 安装到本地目录(例如,如果您没有对计算机的 root 访问权限),请使用`./configure --prefix=/installation/directory/path`,输入`./configure --help`以获取有关可能的配置参数的更多信息。 +完成之后,您应该能够通过执行 `./configure` 来配置安装。 +如果需要将 MPICH 安装到本地目录(例如,如果您没有对计算机的 root 访问权限),请使用 `./configure --prefix=/installation/directory/path`,如果您没有 Fortran 编译器,则可以通过使用 `./configure --disable-fortran` 来避免构建 MPI Fortran 库。输入 `./configure --help` 以获取有关可能的配置参数的更多信息。 ``` >>> ./configure --disable-fortran -Configuring MPICH2 version 1.4 with '--disable-f77' '--disable-fc' -Running on system: Darwin Wes-Kendalls-Macbook-Pro.local 10.7.0 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu1504.9.37~1/RELEASE_I386 i386 -checking for gcc... gcc +Configuring MPICH version 3.3.2 +Running on system: Linux localhost.localdomain 5.8.18-100.fc31.x86_64 #1 SMP Mon Nov 2 20:32:55 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux +checking build system type... x86_64-unknown-linux-gnu ``` 配置完成后,应显示 *"Configuration completed."* @@ -44,8 +43,9 @@ checking for gcc... gcc ``` >>> make; sudo make install -Beginning make -Using variables CC='gcc' CFLAGS=' -O2' LDFLAGS=' ' F77='' FFLAGS=' ' FC='' FCFLAGS=' ' CXX='c++' CXXFLAGS=' -O2' AR='ar' CPP='gcc-E' CPP +make +make all-recursive + ``` 如果构建成功,则应该可以输入`mpiexec --version`并看到以下类似的内容。 @@ -53,12 +53,12 @@ Using variables CC='gcc' CFLAGS=' -O2' LDFLAGS=' ' F77='' FFLAGS=' ' FC='' FCF ``` >>> mpiexec --version HYDRA build details: - Version: 3.1.4 - Release Date: Fri Feb 20 15:02:56 CST 2015 + Version: 3.3.2 + Release Date: Tue Nov 12 21:23:16 CST 2019 CC: gcc CXX: g++ - F77: - F90: + F77: gfortran + F90: gfortran ``` 希望您的构建成功完成。 @@ -67,7 +67,7 @@ HYDRA build details: ## 下一步 -现在,您已经在本地构建了 MPICH2,您可以在该站点上进行一些选择。 +现在,您已经在本地构建了 MPICH,您可以在该站点上进行一些选择。 如果您已经具有用于设置本地集群的硬件和资源,建议您继续阅读有关 [在 LAN 中运行 MPI 集群]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan) 的教程。 如果您无权访问集群或想了解有关构建虚拟化 MPI 集群的更多信息,请阅读有关 [在 Amazon EC2 上构建和运行自己的集群]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/)。 如果您以任何一种方式构建了集群,或者只是想从计算机上运行其余课程,请继续阅读 [MPI hello world 课程]({{ site.baseurl }}/tutorials/mpi-hello-world/),其中概述了编程和运行第一个 MPI 程序的基础知识。 From 659013dfff955a6437784a973e56c9d6ee56a031 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Tue, 6 Apr 2021 08:30:37 -0500 Subject: [PATCH 085/108] Update dependencies --- Gemfile.lock | 109 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 44 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e2c04c0..1b07f2e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,62 +1,83 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) - faraday (0.14.0) + concurrent-ruby (1.1.8) + em-websocket (0.5.2) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.7) + faraday (1.3.0) + faraday-net_http (~> 1.0) multipart-post (>= 1.2, < 3) - ffi (1.9.21) + ruby2_keywords + faraday-net_http (1.0.1) + ffi (1.15.0) forwardable-extended (2.6.0) - jekyll (3.6.2) + http_parser.rb (0.6.0) + i18n (1.8.10) + concurrent-ruby (~> 1.0) + jekyll (4.2.0) addressable (~> 2.4) colorator (~> 1.0) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 1.1) - kramdown (~> 1.14) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (~> 2.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (~> 0.3.3) + mercenary (~> 0.4.0) pathutil (~> 0.9) - rouge (>= 1.7, < 3) + rouge (~> 3.0) safe_yaml (~> 1.0) - jekyll-feed (0.9.2) - jekyll (~> 3.3) - jekyll-gist (1.4.1) + terminal-table (~> 2.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) octokit (~> 4.2) jekyll-paginate (1.1.0) - jekyll-redirect-from (0.13.0) - jekyll (~> 3.3) - jekyll-sass-converter (1.5.0) - sass (~> 3.4) - jekyll-sitemap (1.1.1) - jekyll (~> 3.3) - jekyll-watch (1.5.1) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-sass-converter (2.1.0) + sassc (> 2.0.1, < 3.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-watch (2.2.1) listen (~> 3.0) - kramdown (1.16.2) - liquid (4.0.0) - listen (3.0.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9.7) - mercenary (0.3.6) - multipart-post (2.0.0) - octokit (4.8.0) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.5.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + multipart-post (2.1.1) + octokit (4.20.0) + faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.1) + pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (2.0.5) - rb-fsevent (0.10.2) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) - rouge (2.2.1) - safe_yaml (1.0.4) - sass (3.5.5) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) + public_suffix (4.0.6) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.5) + rouge (3.26.0) + ruby2_keywords (0.0.4) + safe_yaml (1.0.5) + sassc (2.4.0) + ffi (~> 1.9) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + terminal-table (2.0.0) + unicode-display_width (~> 1.1, >= 1.1.1) + unicode-display_width (1.7.0) PLATFORMS ruby @@ -70,4 +91,4 @@ DEPENDENCIES jekyll-sitemap BUNDLED WITH - 1.16.1 + 1.17.2 From 8de5fd47024107331ec1543de5de117c20262f3b Mon Sep 17 00:00:00 2001 From: Kenvi Zhu Date: Fri, 28 May 2021 18:00:02 +0800 Subject: [PATCH 086/108] fix typo --- tutorials/mpi-broadcast-and-collective-communication/zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index c507cf0..20d2d39 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -94,7 +94,7 @@ Process 3 received data 100 from root process Process 1 received data 100 from root process ``` -不管你信不信,其实我们的函数效率特别低!假设每个进程都只有一个「输出/输入」网络连接。我们的方法只是使用了进程0的一个输出连接来书传递数据。比较聪明的方法是使用一个基于树的沟通算法对网络进行更好的利用。比如这样: +不管你信不信,其实我们的函数效率特别低!假设每个进程都只有一个「输出/输入」网络连接。我们的方法只是使用了进程0的一个输出连接来传递数据。比较聪明的方法是使用一个基于树的沟通算法对网络进行更好的利用。比如这样: ![MPI_Bcast tree](../broadcast_tree.png) From fdd7f8359ca8fd3a765d7aa288a2ddd2a7ba35f7 Mon Sep 17 00:00:00 2001 From: Michael Hinton Date: Fri, 18 Jun 2021 13:31:20 -0600 Subject: [PATCH 087/108] "This is program" --> "This is the program" --- tutorials/mpi-hello-world/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index 775b7d8..00b1953 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -146,7 +146,7 @@ Hello world from processor cetus3, rank 2 out of 4 processors As expected, the MPI program was launched across all of the hosts in my host file. Each process was assigned a unique rank, which was printed off along with the process name. As one can see from my example output, the output of the processes is in an arbitrary order since there is no synchronization involved before printing. -Notice how the script called mpirun. This is program that the MPI implementation uses to launch the job. Processes are spawned across all the hosts in the host file and the MPI program executes across each process. My script automatically supplies the *-n* flag to set the number of MPI processes to four. Try changing the run script and launching more processes! Don't accidentally crash your system though. :-) +Notice how the script called mpirun. This is the program that the MPI implementation uses to launch the job. Processes are spawned across all the hosts in the host file and the MPI program executes across each process. My script automatically supplies the *-n* flag to set the number of MPI processes to four. Try changing the run script and launching more processes! Don't accidentally crash your system though. :-) Now you might be asking, *"My hosts are actually dual-core machines. How can I get MPI to spawn processes across the individual cores first before individual machines?"* The solution is pretty simple. Just modify your hosts file and place a colon and the number of cores per processor after the host name. For example, I specified that each of my hosts has two cores. From 83531a63b269b1fa1c952281a6c09d2fdaa12ba4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jul 2021 22:39:51 +0000 Subject: [PATCH 088/108] Bump addressable from 2.7.0 to 2.8.0 Bumps [addressable](https://github.com/sporkmonger/addressable) from 2.7.0 to 2.8.0. - [Release notes](https://github.com/sporkmonger/addressable/releases) - [Changelog](https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md) - [Commits](https://github.com/sporkmonger/addressable/compare/addressable-2.7.0...addressable-2.8.0) --- updated-dependencies: - dependency-name: addressable dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1b07f2e..2cb55c3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) concurrent-ruby (1.1.8) From 3b4fe6d71f3a2f72826d0ba5491ce0a47b5ed6f8 Mon Sep 17 00:00:00 2001 From: Kenvi Zhu Date: Thu, 19 Aug 2021 11:53:06 +0800 Subject: [PATCH 089/108] Remove already translated English sentences --- tutorials/mpi-reduce-and-allreduce/zh_cn.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/tutorials/mpi-reduce-and-allreduce/zh_cn.md b/tutorials/mpi-reduce-and-allreduce/zh_cn.md index bd853b4..1e2b9e3 100644 --- a/tutorials/mpi-reduce-and-allreduce/zh_cn.md +++ b/tutorials/mpi-reduce-and-allreduce/zh_cn.md @@ -128,7 +128,6 @@ Local sum for process 3 - 47.527420, avg = 0.475274 Total sum = 200.439941, avg = 0.501100 ``` -Now it is time to move on to the sibling of `MPI_Reduce` - `MPI_Allreduce`. 现在是时候接触 `MPI_Reduce` 的同级对象 - `MPI_Allreduce` 了。 ## MPI_Allreduce @@ -151,7 +150,6 @@ MPI_Allreduce( 下图介绍了 `MPI_Allreduce` 的通信模式: ![MPI_Allreduce](mpi_allreduce_1.png) -`MPI_Allreduce` is the equivalent of doing `MPI_Reduce` followed by an `MPI_Bcast`. `MPI_Allreduce` 等效于先执行 `MPI_Reduce`,然后执行 `MPI_Bcast`。 很简单,对吧? From 85ea230d5304c0ac6a5d51e26a3e57977ebaa0cc Mon Sep 17 00:00:00 2001 From: HeGaoYuan Date: Tue, 14 Sep 2021 02:27:21 +0800 Subject: [PATCH 090/108] Typo in running-an-mpi-cluster-within-a-lan --- tutorials/running-an-mpi-cluster-within-a-lan/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index 6992bba..30a0fad 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -238,7 +238,7 @@ $ cat /etc/hosts To make this more clear, from ```manager``` node, this script can be invoked. ```bash -$ mpirun -np 10 --hosts manager./cpi +$ mpirun -np 10 --hosts manager ./cpi # To run the program only on the same manager node ``` From 1fb8969a516518bdf166d99ca75e7bc14bc9eda2 Mon Sep 17 00:00:00 2001 From: HeGaoYuan Date: Tue, 14 Sep 2021 02:56:59 +0800 Subject: [PATCH 091/108] Update mpi-hello-world: for more understandable I think the old expression is confusing. I think this place use four is more accurate. --- tutorials/mpi-hello-world/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index 00b1953..41ba9ed 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -158,7 +158,7 @@ cetus3:2 cetus4:2 ``` -When I execute the run script again, *voila!*, the MPI job spawns two processes on only two of my hosts. +When I execute the run script again, *voila!*, the MPI job spawns four processes on only two of my hosts. ``` >>> ./run.py mpi_hello_world From 0abec1a639193fb9b85595572617850c56951e09 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Mon, 29 Nov 2021 09:07:05 -0600 Subject: [PATCH 092/108] Update book recommendations Closes https://github.com/mpitutorial/mpitutorial/issues/87 --- recommended-books.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recommended-books.md b/recommended-books.md index b37824a..6dd1208 100644 --- a/recommended-books.md +++ b/recommended-books.md @@ -12,8 +12,8 @@ My personal favorite MPI book. The book gives a good overview of parallel comput [![Parallel Programming with MPI](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=1558603395&MarketPlace=US&ID=AsinImage&WS=1&ServiceVersion=20070822)](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_il?ie=UTF8&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395) -## Using MPI - 3rd Edition -This is a more up-to-date book than the previous, but it mostly focuses on the newer and more advanced MPI routines in the third MPI standard. These include parallel I/O, remote memory access, and dynamic process management. The book also discusses using MPI with threads. This is a must have for advanced MPI development. [Click here for more info](https://www.amazon.com/gp/product/0262527391/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0262527391&linkCode=as2&linkId=52cc270bc3a798b37c787740d00c19d1). +## Using MPI - 3rd Edition and Using Advanced MPI - 1st Edition +This is a more up-to-date book than the previous. The "regular" book covers the fundamentals of MPI and the "advnaced" book covers additional topics. The table of contents can be found on [this](https://www.mcs.anl.gov/research/projects/mpi/usingmpi/) website. This is a must have for advanced MPI development. [Click here for Using MPI](https://www.amazon.com/gp/product/0262527391/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0262527391&linkCode=as2&linkId=52cc270bc3a798b37c787740d00c19d1). The "Using Advanced MPI" book is currently out of print. [![Using MPI - 3rd Edition](http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&MarketPlace=US&ASIN=0262527391&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_)](https://www.amazon.com/gp/product/0262527391/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0262527391&linkCode=as2&linkId=52cc270bc3a798b37c787740d00c19d1) From f968ac9a95be92a06e42a150c664e7b6e506b645 Mon Sep 17 00:00:00 2001 From: drbbr <46411993+drbbr@users.noreply.github.com> Date: Sun, 9 Jan 2022 22:37:18 +0800 Subject: [PATCH 093/108] Update zh_cn.md --- tutorials/mpi-hello-world/zh_cn.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tutorials/mpi-hello-world/zh_cn.md b/tutorials/mpi-hello-world/zh_cn.md index 8086380..a651c5b 100644 --- a/tutorials/mpi-hello-world/zh_cn.md +++ b/tutorials/mpi-hello-world/zh_cn.md @@ -109,7 +109,7 @@ clean: rm ${EXECS} ``` -我的 makefile 会去找 MPICC 这个环境变量。如果你把 MPICH2 装在了本地文件夹里面而不是全局 PATH 下面, 手动设置一下 MPICC 这个环境变量,把它指向你的 mpicc 二进制程序。mpicc 二进制程序其实只是对 gcc 做了一层封装,使得编译和链接所有的 MPI 程序更方便。 +我的 makefile 会去找 MPICC 这个环境变量。如果你把 MPICH2 装在了本地文件夹里面而不是全局 PATH 下面, 手动设置一下 MPICC 这个环境变量,把它指向你的 mpicc 二进制程序。mpicc 二进制程序其实只是对 gcc 做了一层封装,使得编译和链接所有的 MPI 程序更方便。 ``` >>> export MPICC=/home/kendall/bin/mpicc @@ -129,7 +129,7 @@ cetus3 cetus4 ``` -为了用我提供的脚本来运行这个程序,你应该设置一个叫 MPI_HOSTS 的环境变量,把它指向 host 文件所在的位置。我的脚本会自动把这个 host 文件的配置项加到 MPI 启动命令里。如果单机跑的话就不用设这个环境变量。另外如果你的 MPI 没有装到全局环境的话,你还需要指定 MPIRUN 这个环境变量指向你的 mpirun 二进制程序。 +为了用我提供的脚本来运行这个程序,你应该设置一个叫 MPI_HOSTS 的环境变量,把它指向 host 文件所在的位置。我的脚本会自动把这个 host 文件的配置项加到 MPI 启动命令里。如果单机跑的话就不用设置这个环境变量。另外如果你的 MPI 没有装到全局环境的话,你还需要指定 MPIRUN 这个环境变量指向你的 mpirun 二进制程序。 准备就绪之后你就可以使用这个项目的我提供的 python 脚本来执行程序。脚本在 *tutorials* 目录下面,这个脚本可以用来跑我们这个教程里面提到的所有程序(而且它会帮你先编译一下程序)。你可以在 mpitutorial 这个文件夹的根目录下执行以下命令: @@ -147,9 +147,9 @@ Hello world from processor cetus3, rank 2 out of 4 processors 跟预想的一样,这个 MPI 程序运行在了我提供的所有节点上面。每个进程都被分配了一个单独的 rank,跟进程的名字一起打印出来了。你可以看到,在我们的输出的结果里,进程之间的打印顺序是任意的,因为我们的代码里并没有涉及到同步的操作。 -我们可以在打印的内容上面那条看到脚本是如何调用 mpirun 这个程序的。mpirun 是 MPI 的实现用来启动任务的一个程序。进程会在 host 文件里指定的所有机器上面生成,MPI 程序就会在所有进程上面运行。我的脚步自定地提供了一个 *-n* 参数告诉 MPI 程序我要运行 4 个进程。你可以试着修改脚步来使用更多进程运行 MPI 程序。当心别把你的操作系统玩蹦了。:-) +我们可以在打印的内容上面那条看到脚本是如何调用 mpirun 这个程序的。mpirun 是 MPI 的实现用来启动任务的一个程序。进程会在 host 文件里指定的所有机器上面生成,MPI 程序就会在所有进程上面运行。我的脚本自定地提供了一个 *-n* 参数告诉 MPI 程序我要运行 4 个进程。你可以试着修改脚本来使用更多进程运行 MPI 程序。当心别把你的操作系统玩崩了。:-) -你可能会问,*"我的节点都都是双核的机器,我怎么样可以让 MPI 先在每个节点上的每个核上生成进程,再去其他的机器?* 其实方案很简单。修改一下你的 host 文件,在每个节点名字的后面加一个冒号和每个处理器有的核数就行了。比如,我在 host 文件里指定我的每个节点有2个核。 +你可能会问,*“我的节点都都是双核的机器,我怎么样可以让 MPI 先在每个节点上的每个核上生成进程,再去其他的机器?”* 其实方案很简单。修改一下你的 host 文件,在每个节点名字的后面加一个冒号和每个处理器有的核数就行了。比如,我在 host 文件里指定我的每个节点有2个核。 ``` >>> cat host_file From 0a724d5c94f5522bbbd2f018bb23773906349005 Mon Sep 17 00:00:00 2001 From: Wesley Bland Date: Fri, 22 Apr 2022 11:59:01 -0700 Subject: [PATCH 094/108] Fix version numbers --- tutorials/installing-mpich2/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index c368782..2b54ad8 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -13,11 +13,11 @@ MPI is simply a standard which others follow in their implementation. Because of MPICH is a widely-used implementation of MPI that is developed primarily by Argonne National Laboratory in the United States. The main reason for choosing MPICH over other implementations is simply because of my familiarity with the interface and because of my close relationship with Argonne National Laboratory. I also encourage others to check out [OpenMPI](https://www.open-mpi.org/), which is also a widely-used implementation. ## Installing MPICH -The latest version of MPICH is available [here](https://www.mpich.org/). The version that I will be using for all of the examples on the site is 3.3-2, which was released 13 November 2019. Go ahead and download the source code, uncompress the folder, and change into the MPICH3 directory. +The latest version of MPICH is available [here](https://www.mpich.org/). The version that I will be using for all of the examples on the site is 3.3-2, which was released 13 November 2019. Go ahead and download the source code, uncompress the folder, and change into the MPICH directory. ``` ->>> tar -xzf mpich3-3.2.tar.gz ->>> cd mpich3-3.2 +>>> tar -xzf mpich-3-3.2.tar.gz +>>> cd mpich-3-3.2 ``` Once doing this, you should be able to configure your installation by performing `./configure`. If you need to install MPICH to a local directory (for example, if you don't have root access to your machine), type `./configure --prefix=/installation/directory/path`. It is possible to avoid building the MPI Fortran library by using `./configure --disable-fortran` if you do not have Fortran compilers. For more information about possible configuration parameters, type `./configure --help` From ec5cf90d72f654cb92cac35b91dedcb6a68714c8 Mon Sep 17 00:00:00 2001 From: lin-yifan1 <77676236+lin-yifan1@users.noreply.github.com> Date: Fri, 6 Jan 2023 10:51:57 +0800 Subject: [PATCH 095/108] Update zh_cn.md fix typo --- tutorials/mpi-hello-world/zh_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mpi-hello-world/zh_cn.md b/tutorials/mpi-hello-world/zh_cn.md index a651c5b..58c15cb 100644 --- a/tutorials/mpi-hello-world/zh_cn.md +++ b/tutorials/mpi-hello-world/zh_cn.md @@ -118,7 +118,7 @@ clean: ``` 当你的程序编译好之后,它就可以被执行了。不过执行之前你也许会需要一些额外配置。比如如果你想要在好几个节点的集群上面跑这个 MPI 程序的话,你需要配置一个 host 文件(不是 /etc/hosts)。如果你在笔记本或者单机上运行的话,可以跳过下面这一段。 -需要配置的 host 文件会包含你想要运行的所有节点的名称。为了运行方便,你需要确认一下所有这些节点之间能通过 SSH 通信,并且需要根据[设置认证文件这个教程]((http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html)配置不需要密码的 SSH 访问。 +需要配置的 host 文件会包含你想要运行的所有节点的名称。为了运行方便,你需要确认一下所有这些节点之间能通过 SSH 通信,并且需要根据[设置认证文件这个教程](http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html)配置不需要密码的 SSH 访问。 我的 host 文件看起来像这样: ``` From c6534e8eaf7e343beb2da74691b88c18afc451b5 Mon Sep 17 00:00:00 2001 From: Wes Bland Date: Wed, 1 Mar 2023 12:35:27 -0600 Subject: [PATCH 096/108] Update Wesley Bland Bio --- about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/about.md b/about.md index 0825c4d..c749748 100644 --- a/about.md +++ b/about.md @@ -31,4 +31,4 @@ Dwaraka Nath is a masters graduate from Birla Institute of Technology and Scienc You can find more about him on his [personal website](https://www.dwarak.in) and follow him on GitHub at [@dtsdwarak](https://github.com/dtsdwarak). ### Wesley Bland -Wesley Bland is a researcher in High Performance Computing and a contributor to both MPICH and Open MPI. He graduated from the University of Tennessee, Knoxville with his PhD under Dr. Jack Dongarra. His research involved fault tolerance at scale using MPI. After leaving the university, he went to Argonne National Laboratory where he worked under Dr. Pavan Balaji as a postdoctoral appointee and continued his fault tolerance research while working on MPICH directly. He currently works at Intel Corporation on high performance runtimes, including MPI. +Wesley Bland is a researcher in High Performance Computing and a contributor to both MPICH and Open MPI. He graduated from the University of Tennessee, Knoxville with his PhD under Dr. Jack Dongarra. His research involved fault tolerance at scale using MPI. After leaving the university, he went to Argonne National Laboratory where he worked under Dr. Pavan Balaji as a postdoctoral appointee and continued his fault tolerance research while working on MPICH directly. He has also worked at Intel and Meta. From 5b67c3a1cde24fa6931940f7336c3f6c076e999a Mon Sep 17 00:00:00 2001 From: ChuFengze Date: Thu, 9 Mar 2023 16:49:59 +0800 Subject: [PATCH 097/108] remove repeats originnal english texts --- tutorials/introduction-to-groups-and-communicators/zh_cn.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tutorials/introduction-to-groups-and-communicators/zh_cn.md b/tutorials/introduction-to-groups-and-communicators/zh_cn.md index c3cd193..37155ee 100644 --- a/tutorials/introduction-to-groups-and-communicators/zh_cn.md +++ b/tutorials/introduction-to-groups-and-communicators/zh_cn.md @@ -284,5 +284,4 @@ MPI_Comm_free(&prime_comm); 在此示例中,我们通过仅选择 `MPI_COMM_WORLD` 中的主要秩来构建通讯器。 这是通过 `MPI_Group_incl` 完成的,并将结果存储在 `prime_group` 中。 接下来,我们将该组传递给 `MPI_Comm_create_group` 以创建 `prime_comm`。 -At the end, we have to be careful to not use `prime_comm` on processes which don't have it, therefore we check to ensure that the communicator is not `MPI_COMM_NULL`, which is returned from `MPI_Comm_create_group` on the ranks not included in `ranks`. 最后,我们必须小心不要在没有 `prime_comm` 的进程上使用 `prime_comm`,因此我们要检查以确保通讯器不是 `MPI_COMM_NULL` 状态 —— 不在 `ranks` 中而从 `MPI_Comm_create_group` 返回的结果。 From c8bcf652a9482b339f880033cc0c756d41d755ae Mon Sep 17 00:00:00 2001 From: ChuFengze Date: Fri, 10 Mar 2023 08:41:18 +0800 Subject: [PATCH 098/108] Remove duplicates --- .../zh_cn.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tutorials/point-to-point-communication-application-random-walk/zh_cn.md b/tutorials/point-to-point-communication-application-random-walk/zh_cn.md index 687a93f..be29600 100644 --- a/tutorials/point-to-point-communication-application-random-walk/zh_cn.md +++ b/tutorials/point-to-point-communication-application-random-walk/zh_cn.md @@ -95,7 +95,7 @@ typedef struct { ``` 我们的初始化函数为 `initialize_walkers`,它采用子域边界,并将 walker 添加到 `incoming_walkers` `vector` 中(顺便说一下,该程序采用 C++)。 -Our initialization function, called `initialize_walkers`, takes the subdomain bounds and adds walkers to an `incoming_walkers` vector (by the way, this application is in C++). + ```cpp void initialize_walkers(int num_walkers_per_proc, int max_walk_size, @@ -230,7 +230,6 @@ while (!all_walkers_finished) { // Determine walker completion later ![Deadlock](deadlock-1.png) 值得注意的是,上面的代码在大多数情况下实际上不会“死锁”。 -It is worth noting that the above code will actually **not** deadlock most of the time. 尽管 `MPI_Send` 是一个阻塞调用,但是 [MPI 规范](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_tl?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163) 表明 `MPI_Send` 会一直阻塞,直到可以**回收发送缓冲区为止**。 这意味着当网络可以缓冲消息时,`MPI_Send` 将返回。 如果发送最终无法被网络缓冲,它们将一直阻塞直到发布匹配的接收。 From 6634c0013a44180c9959be24d76a19760699cecd Mon Sep 17 00:00:00 2001 From: Cabin Zhu Date: Tue, 18 Apr 2023 22:44:26 +0800 Subject: [PATCH 099/108] Comment for TMPI_Rank() flips send_data and recv. - Fix the flips in the source code tmpi_rank.c - Fix the flips in both the en and cn articles --- tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c | 4 ++-- tutorials/performing-parallel-rank-with-mpi/index.md | 4 ++-- tutorials/performing-parallel-rank-with-mpi/zh_cn.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c index 2dd1634..8ecdb3a 100644 --- a/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c +++ b/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c @@ -104,8 +104,8 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, MPI_Datatype d return ranks; } -// Gets the rank of the recv_data, which is of type datatype. The rank is returned -// in send_data and is of type datatype. +// Gets the rank of the send_data, which is of type datatype. The rank is returned +// in recv_data and is of type datatype. int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { // Check base cases first - Only support MPI_INT and MPI_FLOAT for this function. if (datatype != MPI_INT && datatype != MPI_FLOAT) { diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index 60552d0..ad639a3 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -145,8 +145,8 @@ After the numbers are sorted, we must create an array of ranks in the proper ord Now that we have our two primary functions, we can put them all together into our `TMPI_Rank` function. This function gathers the numbers to the root process, sorts the numbers to determine their ranks, and then scatters the ranks back to the requesting processes. The code is shown below: ```cpp -// Gets the rank of the recv_data, which is of type datatype. The rank -// is returned in send_data and is of type datatype. +// Gets the rank of the send_data, which is of type datatype. The rank +// is returned in recv_data and is of type datatype. int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { // Check base cases first - Only support MPI_INT and MPI_FLOAT for diff --git a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md index bfa4828..b1d1b0a 100644 --- a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md +++ b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md @@ -144,8 +144,8 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, 现在我们有了两个主要函数,我们可以将它们全部整合到我们的 `TMPI_Rank` 函数中。此函数将数字收集到根进程,并对数字进行排序以确定其排名,然后将排名分散回请求的进程。 代码如下所示: ```cpp -// 获取recv_data的排名, 类型为datatype -// 排名用send_data返回,类型为datatype +// 获取send_data的排名, 类型为datatype +// 排名用recv_data返回,类型为datatype int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, MPI_Comm comm) { // 首先检查基本情况 - 此函数只支持MPI_INT和MPI_FLOAT From a937237bb528b3bb5484eca21d625b750f03b3a1 Mon Sep 17 00:00:00 2001 From: "Stephen P. Cook" Date: Fri, 15 Sep 2023 16:51:59 +0100 Subject: [PATCH 100/108] Fix mismatch between link and target --- tutorials/mpi-broadcast-and-collective-communication/index.md | 2 +- tutorials/performing-parallel-rank-with-mpi/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index aa0ec49..b009013 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -56,7 +56,7 @@ MPI_Bcast( Although the root process and receiver processes do different jobs, they all call the same `MPI_Bcast` function. When the root process (in our example, it was process zero) calls `MPI_Bcast`, the `data` variable will be sent to all other processes. When all of the receiver processes call `MPI_Bcast`, the `data` variable will be filled in with the data from the root process. ## Broadcasting with MPI_Send and MPI_Recv -At first, it might seem that `MPI_Bcast` is just a simple wrapper around `MPI_Send` and `MPI_Recv`. In fact, we can make this wrapper function right now. Our function, called `my_bcast` is located in [bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c). It takes the same arguments as `MPI_Bcast` and looks like this: +At first, it might seem that `MPI_Bcast` is just a simple wrapper around `MPI_Send` and `MPI_Recv`. In fact, we can make this wrapper function right now. Our function, called `my_bcast` is located in [my_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c). It takes the same arguments as `MPI_Bcast` and looks like this: ```cpp void my_bcast(void* data, int count, MPI_Datatype datatype, int root, diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index ad639a3..caad352 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -137,7 +137,7 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, } ``` -The `get_ranks` function first creates an array of `CommRankNumber` structs and attaches the communicator rank of the process that owns the number. If the datatype is `MPI_FLOAT`, `qsort` is called with a special sorting function for our array of structs (see [tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code) for the code). Likewise, we use a different sorting function if the datatype is `MPI_INT`. +The `get_ranks` function first creates an array of `CommRankNumber` structs and attaches the communicator rank of the process that owns the number. If the datatype is `MPI_FLOAT`, `qsort` is called with a special sorting function for our array of structs (see [tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c) for the code). Likewise, we use a different sorting function if the datatype is `MPI_INT`. After the numbers are sorted, we must create an array of ranks in the proper order so that they can be scattered back to the requesting processes. This is accomplished by making the `ranks` array and filling in the proper rank values for each of the sorted `CommRankNumber` structs. From c83eb9781c44a0519096c5159545c913ffc81922 Mon Sep 17 00:00:00 2001 From: "Stephen P. Cook" Date: Fri, 15 Sep 2023 17:00:41 +0100 Subject: [PATCH 101/108] Fix mismatch links in zn_ch version --- tutorials/mpi-broadcast-and-collective-communication/zh_cn.md | 2 +- tutorials/performing-parallel-rank-with-mpi/zh_cn.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md index 20d2d39..25758c9 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md +++ b/tutorials/mpi-broadcast-and-collective-communication/zh_cn.md @@ -55,7 +55,7 @@ MPI_Bcast( 尽管根节点和接收节点做不同的事情,它们都是调用同样的这个 `MPI_Bcast` 函数来实现广播。当根节点(在我们的例子是节点0)调用 `MPI_Bcast` 函数的时候,`data` 变量里的值会被发送到其他的节点上。当其他的节点调用 `MPI_Bcast` 的时候,`data` 变量会被赋值成从根节点接受到的数据。 ## 使用 MPI_Send 和 MPI_Recv 来做广播 -粗略看的话,似乎 `MPI_Bcast` 仅仅是在 `MPI_Send` 和 `MPI_Recv` 基础上进行了一层包装。事实上,我们现在就可以自己来做这层封装。我们的函数叫做 `my_bcast`,在这里可以看到: [bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c)。它跟 `MPI_Bcast` 接受一样的参数,看起来像这样: +粗略看的话,似乎 `MPI_Bcast` 仅仅是在 `MPI_Send` 和 `MPI_Recv` 基础上进行了一层包装。事实上,我们现在就可以自己来做这层封装。我们的函数叫做 `my_bcast`,在这里可以看到: [my_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c)。它跟 `MPI_Bcast` 接受一样的参数,看起来像这样: ```cpp void my_bcast(void* data, int count, MPI_Datatype datatype, int root, diff --git a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md index b1d1b0a..4145f9d 100644 --- a/tutorials/performing-parallel-rank-with-mpi/zh_cn.md +++ b/tutorials/performing-parallel-rank-with-mpi/zh_cn.md @@ -136,7 +136,7 @@ int *get_ranks(void *gathered_numbers, int gathered_number_count, } ``` -`get_ranks` 函数首先创建一个CommRankNumber结构体数组,并附上该数字所属进程在通讯器中的次序。 如果数据类型为 `MPI_FLOAT` ,则对我们的结构体数组调用 `qsort` 时,会使用特殊的排序函数,(代码见[tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)。 类似的,如果数据类型为 `MPI_INT` ,我们将使用不同的排序函数。 +`get_ranks` 函数首先创建一个CommRankNumber结构体数组,并附上该数字所属进程在通讯器中的次序。 如果数据类型为 `MPI_FLOAT` ,则对我们的结构体数组调用 `qsort` 时,会使用特殊的排序函数,(代码见[tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c)。 类似的,如果数据类型为 `MPI_INT` ,我们将使用不同的排序函数。 在对数字进行排序之后,我们必须以适当的顺序创建一个排名数组(array of ranks),以便将它们分散(scatter)回到请求的进程中。这是通过创建 `ranks` 数组并为每个已排序的 `CommRankNumber` 结构体填充适当的排名来实现的。 From f845c972a9def7f100dec1f88f542d677e95696d Mon Sep 17 00:00:00 2001 From: "Stephen P. Cook" Date: Thu, 28 Sep 2023 11:09:09 +0100 Subject: [PATCH 102/108] Rename code from groups and communicators tutorial To avoid clashing with the linux tools split and groups. --- .../code/{groups.c => comm_groups.c} | 0 .../code/{split.c => comm_split.c} | 0 .../code/makefile | 10 +++++----- tutorials/run.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename tutorials/introduction-to-groups-and-communicators/code/{groups.c => comm_groups.c} (100%) rename tutorials/introduction-to-groups-and-communicators/code/{split.c => comm_split.c} (100%) diff --git a/tutorials/introduction-to-groups-and-communicators/code/groups.c b/tutorials/introduction-to-groups-and-communicators/code/comm_groups.c similarity index 100% rename from tutorials/introduction-to-groups-and-communicators/code/groups.c rename to tutorials/introduction-to-groups-and-communicators/code/comm_groups.c diff --git a/tutorials/introduction-to-groups-and-communicators/code/split.c b/tutorials/introduction-to-groups-and-communicators/code/comm_split.c similarity index 100% rename from tutorials/introduction-to-groups-and-communicators/code/split.c rename to tutorials/introduction-to-groups-and-communicators/code/comm_split.c diff --git a/tutorials/introduction-to-groups-and-communicators/code/makefile b/tutorials/introduction-to-groups-and-communicators/code/makefile index 60887ac..6ecc3dc 100644 --- a/tutorials/introduction-to-groups-and-communicators/code/makefile +++ b/tutorials/introduction-to-groups-and-communicators/code/makefile @@ -1,13 +1,13 @@ -EXECS=groups split +EXECS=comm_groups comm_split MPICC?=mpicc all: ${EXECS} -split: split.c - ${MPICC} -o split split.c +split: comm_split.c + ${MPICC} -o comm_split comm_split.c -groups: groups.c - ${MPICC} -o groups groups.c +groups: comm_groups.c + ${MPICC} -o comm_groups comm_groups.c clean: rm -f ${EXECS} diff --git a/tutorials/run.py b/tutorials/run.py index 4e90a32..2215481 100755 --- a/tutorials/run.py +++ b/tutorials/run.py @@ -37,8 +37,8 @@ 'reduce_stddev': ('mpi-reduce-and-allreduce', 4, ['100']), # From the groups-and-communicators tutorial - 'split': ('introduction-to-groups-and-communicators', 16), - 'groups': ('introduction-to-groups-and-communicators', 16) + 'comm_split': ('introduction-to-groups-and-communicators', 16), + 'comm_groups': ('introduction-to-groups-and-communicators', 16) } program_to_run = sys.argv[1] if len(sys.argv) > 1 else None From 29c156cf845727aef48cb21612b324386ff15d7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 May 2024 19:00:10 +0000 Subject: [PATCH 103/108] Bump rexml from 3.2.5 to 3.2.8 Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.2.8. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.2.8) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2cb55c3..2ad0def 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -66,7 +66,8 @@ GEM rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) + rexml (3.2.8) + strscan (>= 3.0.9) rouge (3.26.0) ruby2_keywords (0.0.4) safe_yaml (1.0.5) @@ -75,6 +76,7 @@ GEM sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) + strscan (3.1.0) terminal-table (2.0.0) unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (1.7.0) From 78d20522bab61a9f967213448664133fd468f5cb Mon Sep 17 00:00:00 2001 From: Akira KANAI Date: Sun, 28 Jul 2024 11:52:23 +0900 Subject: [PATCH 104/108] add ja_jp --- _layouts/post.html | 3 + tutorials.md | 46 ++- .../index.md | 2 +- .../ja_jp.md | 141 ++++++++ tutorials/installing-mpich2/index.md | 2 +- tutorials/installing-mpich2/ja_jp.md | 55 ++++ .../index.md | 2 +- .../ja_jp.md | 217 +++++++++++++ .../index.md | 1 + .../ja_jp.md | 162 ++++++++++ .../index.md | 2 +- .../ja_jp.md | 158 +++++++++ tutorials/mpi-hello-world/index.md | 2 +- tutorials/mpi-hello-world/ja_jp.md | 186 +++++++++++ tutorials/mpi-introduction/index.md | 2 +- tutorials/mpi-introduction/ja_jp.md | 37 +++ tutorials/mpi-reduce-and-allreduce/index.md | 2 +- tutorials/mpi-reduce-and-allreduce/ja_jp.md | 178 +++++++++++ .../mpi-scatter-gather-and-allgather/index.md | 2 +- .../mpi-scatter-gather-and-allgather/ja_jp.md | 154 +++++++++ tutorials/mpi-send-and-receive/index.md | 2 +- tutorials/mpi-send-and-receive/ja_jp.md | 200 ++++++++++++ .../index.md | 3 +- .../ja_jp.md | 199 ++++++++++++ .../index.md | 2 +- .../ja_jp.md | 302 ++++++++++++++++++ .../index.md | 1 + .../ja_jp.md | 262 +++++++++++++++ 28 files changed, 2303 insertions(+), 22 deletions(-) create mode 100644 tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/ja_jp.md create mode 100644 tutorials/installing-mpich2/ja_jp.md create mode 100644 tutorials/introduction-to-groups-and-communicators/ja_jp.md create mode 100644 tutorials/launching-an-amazon-ec2-mpi-cluster/ja_jp.md create mode 100644 tutorials/mpi-broadcast-and-collective-communication/ja_jp.md create mode 100644 tutorials/mpi-hello-world/ja_jp.md create mode 100644 tutorials/mpi-introduction/ja_jp.md create mode 100644 tutorials/mpi-reduce-and-allreduce/ja_jp.md create mode 100644 tutorials/mpi-scatter-gather-and-allgather/ja_jp.md create mode 100644 tutorials/mpi-send-and-receive/ja_jp.md create mode 100644 tutorials/performing-parallel-rank-with-mpi/ja_jp.md create mode 100644 tutorials/point-to-point-communication-application-random-walk/ja_jp.md create mode 100644 tutorials/running-an-mpi-cluster-within-a-lan/ja_jp.md diff --git a/_layouts/post.html b/_layouts/post.html index 7d6a247..7bc2ad6 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -19,7 +19,10 @@ output += "中文版"; } else if (languages[i] == "es") { output += "Español"; + } else if (languages[i] == "ja_jp") { + output += "日本語"; } + } return output; diff --git a/tutorials.md b/tutorials.md index e477fbe..a80dd8d 100644 --- a/tutorials.md +++ b/tutorials.md @@ -9,24 +9,48 @@ Welcome to the MPI tutorials! In these tutorials, you will learn a wide array of The tutorials assume that the reader has a basic knowledge of C, some C++, and Linux. ## Introduction and MPI installation -* [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) ([中文版]({{ site.baseurl }}/tutorials/mpi-introduction/zh_cn)) -* [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) ([中文版]({{ site.baseurl }}/tutorials/installing-mpich2/zh_cn)) +* [MPI tutorial introduction]({{ site.baseurl }}/tutorials/mpi-introduction/) +([中文版]({{ site.baseurl }}/tutorials/mpi-introduction/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/mpi-introduction/ja_jp)) +* [Installing MPICH2 on a single machine]({{ site.baseurl }}/tutorials/installing-mpich2/) +([中文版]({{ site.baseurl }}/tutorials/installing-mpich2/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/installing-mpich2/ja_jp)) * [Launching an Amazon EC2 MPI cluster]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/) +([日本語]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/ja_jp)) * [Running an MPI cluster within a LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan/) -* [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) ([中文版]({{ site.baseurl }}/tutorials/mpi-hello-world/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan/ja_jp)) +* [Running an MPI hello world application]({{ site.baseurl }}/tutorials/mpi-hello-world/) +([中文版]({{ site.baseurl }}/tutorials/mpi-hello-world/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/mpi-hello-world/ja_jp)) ## Blocking point-to-point communication -* [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) ([中文版]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn)) -* [Dynamic receiving with MPI_Probe and MPI_Status]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) ([中文版]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn)) -* [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) ([中文版]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/zh_cn)) +* [Sending and receiving with MPI_Send and MPI_Recv]({{ site.baseurl }}/tutorials/mpi-send-and-receive/) +([中文版]({{ site.baseurl }}/tutorials/mpi-send-and-receive/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/mpi-send-and-receive/ja_jp)) +* [Dynamic receiving with MPI_Probe and MPI_Status]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) +([中文版]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/ja_jp)) +* [Point-to-point communication application - Random walking]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) +([中文版]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/ja_jp)) ## Basic collective communication -* [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) ([中文版]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)) -* [Common collectives - MPI_Scatter, MPI_Gather, and MPI_Allgather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/) ([中文版]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/zh_cn)) -* [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) ([中文版]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/zh_cn)) +* [Collective communication introduction with MPI_Bcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/) +([中文版]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/ja_jp)) +* [Common collectives - MPI_Scatter, MPI_Gather, and MPI_Allgather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/) +([中文版]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/ja_jp)) +* [Application example - Performing parallel rank computation with basic collectives]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/) +([中文版]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/ja_jp)) ## Advanced collective communication -* [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) ([中文版]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/zh_cn)) +* [Using MPI_Reduce and MPI_Allreduce for parallel number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/) +([中文版]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/ja_jp)) ## Groups and communicators -* [Introduction to groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) ([中文版]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/zh_cn)) +* [Introduction to groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/) +([中文版]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/zh_cn)) +([日本語]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/ja_jp)) diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md index 2cff7a3..82af8aa 100644 --- a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/index.md @@ -4,7 +4,7 @@ title: Dynamic Receiving with MPI Probe (and MPI Status) author: Wes Kendall categories: Beginner MPI tags: MPI_Get_count, MPI_Probe -translations: zh_cn +translations: zh_cn,ja_jp redirect_from: '/dynamic-receiving-with-mpi-probe-and-mpi-status/' --- diff --git a/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/ja_jp.md b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/ja_jp.md new file mode 100644 index 0000000..e551213 --- /dev/null +++ b/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/ja_jp.md @@ -0,0 +1,141 @@ +--- +layout: post +title: MPI Probeを用いた可変長メッセージの受信 - Dynamic Receiving with MPI Probe (and MPI Status) +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Get_count, MPI_Probe +redirect_from: '/dynamic-receiving-with-mpi-probe-and-mpi-status/' +--- + +[前回のレッスン]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)ではMPI_SendとMPI_Recvを使用した基本的なポイントツーポイント通信を学びました。前回はメッセージ長が固定である場合のみを説明しました。可変長メッセージを送る方法として1つ目のメッセージ長をsend/recvするという方法もとれます。しかし、MPIには追加の関数呼び出しだけで可変長のメッセージをサポートすることが可能です。このレッスンではこの方法を学びます。 + +> **Note** - このサイトのコードはすべて[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは[tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code)にあります。 + +## MPI_Status構造体 - The MPI_Status structure +[前回のレッスン]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)で説明したように、`MPI_Recv`は受信したメッセージに関する情報を`MPI_Status`として受け取ります(`MPI_STATUS_IGNORE`で無視することもできます)。`MPI_Recv`関数に`MPI_Status`を渡していると受信操作が完了した後に次の3つの追加情報を得ることができます。 + +1. **送信者のランク**: 送信者のランクは`MPI_SOURCE`構造体に格納されます。`MPI_Status stat`と宣言すると、ランクには`stat.MPI_SOURCE`でアクセスできます。 +2. **メッセージタグ**: メッセージのタグは`MPI_TAG`に格納されます。`MPI_SOURCE`と同じようにアクセスできます。 +3. **メッセージ長**: メッセージ長は、ステータス構造内には含まれません。そこで`MPI_Get_count`を使用してメッセージの長さを調べる必要があります。 + +```cpp +MPI_Get_count( + MPI_Status* status, + MPI_Datatype datatype, + int* count) +``` + +`MPI_Get_count`関数に`MPI_Status`渡すとメッセージの`datatype`と`count`が返されます。`count`には受信した要素の合計数が入ります。 + +なぜこの2つの情報が必要になるのかを説明します。`MPI_Recv`受信のために`MPI_ANY_SOURCE`を送信者のランクに、`MPI_ANY_TAG`をメッセージのタグとして受信動作を行えます。この場合には`MPI_Status`が送信者とメッセージタグを知る唯一の手がかりになります(訳注:rankとtagを指定してrecvしていない場合、という意味です。)。また、`MPI_Recv`関数は引数として指定した要素数を全て受信することが保証されていないことに注意します。受信した要素数を得ることができます。しかしながら、指定した受信できる数以上の要素が送信された場合はエラーになることに注意してください。`MPI_Get_count`は実際に受信する量を決定するのに使われます。 + +## MPI_Status構造体をクエリする例 - An example of querying the MPI_Status structure + +`MPI_Status`構造体をクエリするプログラム[check_status.c]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/check_status.c)を見ていきます。プログラムは数字を適当な個数送信します。受信者は送信された数字の数を調べます。コードのメイン部分は次のようになります。 + +```cpp +const int MAX_NUMBERS = 100; +int numbers[MAX_NUMBERS]; +int number_amount; +if (world_rank == 0) { + // プロセス1に送る数字の数を決定する + srand(time(NULL)); + number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS; + + // その分の数をプロセス1に送る + MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD); + printf("0 sent %d numbers to 1\n", number_amount); +} else if (world_rank == 1) { + MPI_Status status; + // 最大でMAX_NUMBERS個のMPI_INTをプロセス0から受け取る + MPI_Recv(numbers, MAX_NUMBERS, MPI_INT, 0, 0, MPI_COMM_WORLD, + &status); + + // メッセージを受信した後、そのメッセージにいくつの整数が含まれていたかを + // 取得する + MPI_Get_count(&status, MPI_INT, &number_amount); + + // 含まれていた数字の数、ランク、タグを出力する。 + printf("1 received %d numbers from 0. Message source = %d, " + "tag = %d\n", + number_amount, status.MPI_SOURCE, status.MPI_TAG); +} +``` + +プロセス0は最大で`MAX_NUMBERS`個の整数をランダムに決めてプロセス1に送信します。プロセス1は最大で`MAX_NUMBERS`個の整数を読み込む`MPI_Recv`を実行します。プロセス1は`MPI_Recv` の引数として `MAX_NUMBERS` を渡しています。繰り返しになりますが、プロセス1が受け取ることができるのは**最大**この個数であることに注意してください。プロセス1では`MPI_Get_count`を呼び出して、実際に受信した`MPI_INT`の数をを調べます。プロセス1は受信したメッセージのサイズを表示すると同時に、`MPI_SOURCE`と`MPI_TAG`、つまり送信元ランクとタグも表示します。 + +ここで注意があります。`MPI_Get_count`で得られるのはデータ型の数でバイト数でないことです。もしユーザーが`MPI_CHAR`をデータ型として(recvを)使用したとすると、返されるデータ量は4倍になります(intを4バイト、charを1バイトと仮定した場合)。このプログラムを[レポジトリ]({{ site.github.code }})の*tutorials*ディレクトリから実行すると、出力はこのようになるでしょう。 + +``` +>>> cd tutorials +>>> ./run.py check_status +mpirun -n 2 ./check_status +0 sent 92 numbers to 1 +1 received 92 numbers from 0. Message source = 0, tag = 0 +``` + +プロセス0はプロセス1にランダムな数の整数を送信して、プロセス1は受信したメッセージに関する情報を出力できました。 + +## MPI_Probeを使用してメッセージサイズを調べる - Using MPI_Probe to find out the message size +`MPI_Status`への理解が深まってきました。前回の例では受信前にすべてのサイズのメッセージを処理できるように大きなバッファを用意しました。実は、`MPI_Probe`を使用すると受信前にメッセージ長を調べることができます。 + +```cpp +MPI_Probe( + int source, + int tag, + MPI_Comm comm, + MPI_Status* status) +``` + +`MPI_Probe`は`MPI_Recv`と似た呼び出しです。`MPI_Probe`は`MPI_Recv`で実際に受信する以外の処理を行うと考えて良いです。`MPI_Recv`と同様に`MPI_Probe`は指定したタグかつ指定した送信者ランクであるメッセージが来るまでブロッキングします。メッセージを受信するとstatus構造体に情報が格納されます。その後にユーザは(そのデータを受信するのに十分なバッファを用意して)`MPI_Recv`で実際にメッセージを受信すれば良いのです。 + +[レポジトリ]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/code)の[probe.c]({{ site.github.code }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/code/probe.c)にこの例を示します。 + +```cpp +int number_amount; +if (world_rank == 0) { + const int MAX_NUMBERS = 100; + int numbers[MAX_NUMBERS]; + // プロセス1に送る数字の数を決定する + srand(time(NULL)); + number_amount = (rand() / (float)RAND_MAX) * MAX_NUMBERS; + + // その分の数をプロセス1に送る + MPI_Send(numbers, number_amount, MPI_INT, 1, 0, MPI_COMM_WORLD); + printf("0 sent %d numbers to 1\n", number_amount); +} else if (world_rank == 1) { + MPI_Status status; + // プロセス0からのメッセージを"probe"する + MPI_Probe(0, 0, MPI_COMM_WORLD, &status); + + // probeが完了した時、statusにはメッセージ長などの情報が含まれている + // MPI_Get_countを使ってメッセージ長を得る + MPI_Get_count(&status, MPI_INT, &number_amount); + + // probeで判明したメッセージ長文のメモリを確保する + int* number_buf = (int*)malloc(sizeof(int) * number_amount); + + // そのバッファを使用してrecv処理を行う + MPI_Recv(number_buf, number_amount, MPI_INT, 0, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("1 dynamically received %d numbers from 0.\n", + number_amount); + free(number_buf); +} +``` + +先程の例と同様、プロセス0はプロセス1に送信する変数の数をランダムに決定します。変更点は、プロセス1が `MPI_Probe`を呼び出してプロセス0が送信しようとしている要素の数を(`MPI_Get_count`を使用して)得ることです。この後、プロセス1が適切なサイズのバッファを確保してから数値を受信します。 + +``` +>>> ./run.py probe +mpirun -n 2 ./probe +0 sent 93 numbers to 1 +1 dynamically received 93 numbers from 0 +``` + +ここで示した例はシンプルなものです。`MPI_Probe`は多くのMPIアプリケーションで用いられる基本的な機能です。例えばマネージャ/ワーカプログラムは、可変サイズのメッセージを交換する際に`MPI_Probe`を多用します。練習として、`MPI_Probe`を使用した`MPI_Recv`のラッパーを作成し、動的なアプリケーションを書いてみてください。コードの見栄えが格段に良くなるでしょう :-) + +## Up next +さて、標準的なブロック型ポイント・ツー・ポイント通信に抵抗はなくなってきましたか?そうなら、あなたはすでにいくらでも並列アプリケーションを書く能力を持っています!では、学んだルーチンを使ったより高度な例を見てみましょう。[the application example using MPI_Send, MPI_Recv, and MPI_Probe]({{ site.baseurl }}/tutorials/point-to-point-communication-application-random-walk/) をチェックしてください。 + +困っていますか?混乱していますか?お気軽に下記にコメントを残してください。私や他の読者がお役に立てるかもしれません。 diff --git a/tutorials/installing-mpich2/index.md b/tutorials/installing-mpich2/index.md index 2b54ad8..92e032e 100644 --- a/tutorials/installing-mpich2/index.md +++ b/tutorials/installing-mpich2/index.md @@ -4,7 +4,7 @@ title: Installing MPICH2 on a Single Machine author: Wes Kendall categories: Beginner MPI tags: -translations: zh_cn +translations: zh_cn,ja_jp redirect_from: '/installing-mpich2/' --- diff --git a/tutorials/installing-mpich2/ja_jp.md b/tutorials/installing-mpich2/ja_jp.md new file mode 100644 index 0000000..e73efc5 --- /dev/null +++ b/tutorials/installing-mpich2/ja_jp.md @@ -0,0 +1,55 @@ +--- +layout: post +title: MPIをシングルマシンにインストールする - Installing MPICH2 on a Single Machine +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/installing-mpich2/' +--- + +MPIとは標準仕様を指すものであるのでMPIの実装は複数存在します。このレッスンでは主な実装の1つであるMPICHを使用します。あなたが望むなら他の実装を使用しても良いですが、このレッスンではMPICHインストール手順を紹介します。また、チュートリアル全体で提供されるスクリプトとコードは、最新バージョンのMPICHでの実行だけを確認しています。 + +MPICHは米国のアルゴンヌ国立研究所が主に開発したメジャーなMPI実装です。MPICHを選択した理由は、私がこのインターフェイスに精通しておりアルゴンヌ国立研究所と縁が深いためです。広く使用されている実装である[OpenMPI](https://www.open-mpi.org/)もぜひ調べてみてください。 + +## MPICHのインストール - Installing MPICH +[ここ](https://www.mpich.org/)からMPICHの最新バージョンを入手できます。このチュートリアルでは3.3-2(2019年11月13日リリース)を利用します。tar.gzファイルをダウンロードし以下のように伸長します。 + +``` +>>> tar -xzf mpich-3-3.2.tar.gz +>>> cd mpich-3-3.2 +``` + +`./configure`でmakeの準備をします。この際にマシンの特権がなくユーザディレクトリにインストールしたい場合は`./configure --prefix=/installation/directory/path`としてインストールディレクトリを指定できます。Fortranへの対応が不要である場合は`./configure --disable-fortran`とします。利用可能なオプションを全て表示するには`./configure --help`とします。 + +``` +>>> ./configure +Configuring MPICH version 3.3.2 +Running on system: Linux localhost.localdomain 5.8.18-100.fc31.x86_64 #1 SMP Mon Nov 2 20:32:55 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux +checking build system type... x86_64-unknown-linux-gnu +``` + +configureが終了して*"Configuration completed."*と表示さたら`make; sudo make install`を使用して MPICH2 をビルド・インストールします。 +``` +>>> make; sudo make install +make +make all-recursive + +``` + +成功したなら`mpiexec --version`でインストールした情報を出力できます。 + +``` +>>> mpiexec --version +HYDRA build details: + Version: 3.3.2 + Release Date: Tue Nov 12 21:23:16 CST 2019 + CC: gcc + CXX: g++ + F77: gfortran + F90: gfortran +``` + +皆さんの環境でもビルドが無事に完了することを祈りますが、依存関係不足などで問題が起こる可能性があるでしょう。このような場合はエラーメッセージをGoogleで検索してみてください。 + +## 次は? +単一の環境にMPICHを構築できたのでこのサイトで次に進むための選択肢がいくつかあります。ローカルクラスタをセットアップするためのハードウェアとリソースがすでにある場合は、[running an MPI cluster in LAN]({{ site.baseurl }}/tutorials/running-an-mpi-cluster-within-a-lan)に進むことを推奨します。そのようなクラスタにアクセスできない場合や仮想 MPIクラスターの構築について詳しく知りたい場合は、[building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/)に進んでください。いずれかの方法でクラスターを構築し終わっていたり、残りのレッスンをスタンドアロンで実行する場合は[MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/)に進んでください。Hello Worldではプログラミングの基礎と最初のMPIプログラムの実行の概要が説明されています。 \ No newline at end of file diff --git a/tutorials/introduction-to-groups-and-communicators/index.md b/tutorials/introduction-to-groups-and-communicators/index.md index 5290f7a..5fd6456 100644 --- a/tutorials/introduction-to-groups-and-communicators/index.md +++ b/tutorials/introduction-to-groups-and-communicators/index.md @@ -3,7 +3,7 @@ layout: post title: Introduction to Groups and Communicators author: Wesley Bland categories: Advanced MPI -translations: zh_cn +translations: zh_cn,ja_jp tags: MPI_Group, MPI_Comm redirect_from: '/introduction-to-groups-and-communicators/' --- diff --git a/tutorials/introduction-to-groups-and-communicators/ja_jp.md b/tutorials/introduction-to-groups-and-communicators/ja_jp.md new file mode 100644 index 0000000..e777b3b --- /dev/null +++ b/tutorials/introduction-to-groups-and-communicators/ja_jp.md @@ -0,0 +1,217 @@ +--- +layout: post +title: グループとコミュニケータ - Introduction to Groups and Communicators +author: Wesley Bland +categories: Advanced MPI +tags: MPI_Group, MPI_Comm +redirect_from: '/introduction-to-groups-and-communicators/' +--- + +これまでのレッスンでは`MPI_COMM_WORLD`を使用してきました。単純なプログラムの場合はプロセスの数は多くないので、一度に1つのプロセスと話すか、一度に全てのプロセスと話すかでしょうから問題はありませんでした。しかし、プログラムの規模が大きくなり始めると、限定的なプロセスとしか通信をしたくないケースが出てきます。このレッスンでは、元となるプロセスグループの集合のプロセスとだけ集団通信するために、新しいコミュニケータを作成する方法を紹介します。 + +> **Note** - チュートリアルのコードは[GitHub]({{ site.github.repo }})にあります。. このレッスンのコードは[tutorials/introduction-to-groups-and-communicators/code]({{ site.github.code }}/tutorials/introduction-to-groups-and-communicators/code)を参照してください。 + +## コミュニケータとは? - Overview of communicators +集団通信のレッスンで見てきたように、MPIの集団通信はコミュニケータ内の全プロセスと一度に通信できます。`MPI_Scatter`は他のプロセスにデータを分配したり、`MPI_Reduce`ではreduceを実行できます。しかし、これまではデフォルトの `MPI_COMM_WORLD` しか使ってきませんでした。 + +単純なアプリケーションでは`MPI_COMM_WORLD`を使うことも珍しくないのですが、複雑なユースケースでは多くのコミュニケータがあった方が便利でしょう。例えば、グリッド内だけのプロセスのサブセットに対して計算を行いたい場合です。例として、各行の全プロセスの合計値を求めるような場合です。新しいコミュニケータを作成するための関数宣言を見てみましょう。 + + +```cpp +MPI_Comm_split( + MPI_Comm comm, + int color, + int key, + MPI_Comm* newcomm) +``` + +`MPI_Comm_split`の名のとおり`color`と`key`に基づいて、あるコミュニケータをサブコミュニケータ群に"分割"して新しいコミュニケータを生成します。元のコミュニケータはなくならず、各プロセスに新しいコミュニケータが作成されることに注意してください。最初の引数`comm`は分割元のコミュニケータです。`MPI_COMM_WORLD`でもよいですし、他のコミュニケータでもかまいません。2番目の引数`color`は各プロセスがどの新しいコミュニケータに属するかを決定します。`color`に同じ値を渡したプロセスはすべて同じコミュニケータに割り当てられます。もし`color`が`MPI_UNDEFINED`であれば、そのプロセスは新しいコミュニケータには含まれません。3番目の引数`key`は、新しいコミュニケータ内の順序(ランク)を決定します。`key`の値が最も小さいプロセスがランク0になり、次に小さいプロセスがランク1になります。同順位の場合は、元のコミュニケーター内の順位が低いプロセスが最初になります。最後の引数`newcomm`は新しいコミュニケータです。 + +## 複数のコミュニケータを使用する例 - Example of using multiple communicators + +単純な例として、1つのグローバルコミュニケータを複数のコミュニケータに分割してみます。元のコミュニケータには16個のプロセス存在しますが、これを4x4のグリッドに論理的にレイアウトし、グリッドを行ごとに分割したいというシナリオを考えます。それぞれの行にcolorをつけます。下の画像では左側の同じ色のプロセスグループが右側のそれぞれのコミュニケータに入る様子を示します。 + +![MPI_Comm_split example](../comm_split.png) + +これを実現するコードです。 + +```cpp +// 元のコミュニケータのランクとサイズを得る +int world_rank, world_size; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +int color = world_rank / 4; // 行をcolorとして使います + +// colorと元のランクを利用して新しいコミュニケータを作成します +MPI_Comm row_comm; +MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm); + +int row_rank, row_size; +MPI_Comm_rank(row_comm, &row_rank); +MPI_Comm_size(row_comm, &row_size); + +printf("WORLD RANK/SIZE: %d/%d \t ROW RANK/SIZE: %d/%d\n", + world_rank, world_size, row_rank, row_size); + +MPI_Comm_free(&row_comm); +``` + +まず、オリジナルのコミュニケータ`MPI_COMM_WORLD`の中での自分のランクとこのコミュニケータのサイズを得ます。次はローカルプロセスの "色(color) "を決定する大切な操作です。色によって、分割後のプロセスがどのコミュニケータに属するかが決定します。そして分割を実施します。ここで注目して欲しいのは分割操作のキーとして元のランク(`world_rank`)を使っていることです。新しいコミュニケーター内のすべてのプロセスは元のコミュニケーターと同じ順序としたいので、元のランクの値を使用します。分割後に新しいコミュニケータのサイズと自分のランクを表示します。 + +``` +WORLD RANK/SIZE: 0/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 1/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 2/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 3/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 4/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 5/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 6/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 7/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 8/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 9/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 10/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 11/16 ROW RANK/SIZE: 3/4 +WORLD RANK/SIZE: 12/16 ROW RANK/SIZE: 0/4 +WORLD RANK/SIZE: 13/16 ROW RANK/SIZE: 1/4 +WORLD RANK/SIZE: 14/16 ROW RANK/SIZE: 2/4 +WORLD RANK/SIZE: 15/16 ROW RANK/SIZE: 3/4 +``` + +出力順序が違っても心配しないでください。MPIプログラムで出力する場合、各プロセスはMPIジョブを起動した場所に出力を送り返さないと画面に出力されないからです。この例では見栄え良くするために並び替えています。 + +最後に`MPI_Comm_free`でコミュニケータを解放することを忘れないでください。これは重要なステップではないように思うかもしれませんが、メモリを使い終わったら解放するのと同じくらい重要です。MPIオブジェクトが使われなくなったら、後で再利用できるように解放しなければなりません。MPIが一度に生成できるオブジェクトの数には限りがあるので、オブジェクトを解放しておかないとMPIが割り当て可能なオブジェクトを使い果たしたときに実行時エラーになる可能性があります。 + +## その他のコミュニケータ作成機能 - Other communicator creation functions + +`MPI_Comm_split`は最も基本的なコミュニケータ作成関数ですが、他にも多くの関数があります。`MPI_Comm_dup`はコミュニケータを複製します。複製だけを行う関数が必要か?と思われるかもしれませんがライブラリを実現するために非常に便利です。なぜなら、自分のコードとライブラリーのコードが互いに干渉しないようにしなければならないからです。ですから、アプリケーションが最初に行うべきことは`MPI_COMM_WORLD`の複製を作成することです。ライブラリ自身も`MPI_COMM_WORLD`を複製して使うべきです。 + +もう一つの関数は`MPI_Comm_create`です。この関数は (後述する)`MPI_Comm_create_group` とよく似ています。 + +```cpp +MPI_Comm_create( + MPI_Comm comm, + MPI_Group group, + MPI_Comm* newcomm) +``` + +最も大きな違いは`MPI_Comm_create`が`comm`に含まれる全てのプロセスを集団として扱うのに対して、 (後述する)`MPI_Comm_create_group` は `group` に含まれるプロセス群だけを対象とします。これはコミュニケータのサイズが非常に大きい時に大切になります。`MPI_COMM_WORLD` のサブセットを1,000,000プロセスで実行する場合、サイズが大きくなると集団通信は非常に高価なコストとなるため、少ないプロセスで処理を実行することが重要になってくるのです。 + +インターコミュニケータとイントラコミュニケータの違い、その他の高度なコミュニケータ作成関数などは今回のチュートリアルでは取り上げません。しかし、コミュニケータには他にも高度な機能があります。これらは特殊なアプリケーションでのみ使用されるものです。将来のチュートリアルで取り上げるかもしれません。 + +## グループの概要 - Overview of groups + +`MPI_Comm_split` は新しいコミュニケータを作成する最も簡単な方法ですが他にもコミュニケータを作る方法はあります。それは`MPI_Group`という新しい種類のMPIオブジェクトを使う方法です。グループについて詳しく説明する前に、コミュニケータとは何かもう少し説明します。MPI内部的にはコミュニケータを構成する2つの主要な情報、コミュニケータと他のコミュニケータを区別するコンテキスト(context)またはIDと、コミュニケータに含まれるプロセスのグループを管理しています。コンテキストは、あるコミュニケータ上の操作が他のコミュニケータの操作に影響しないようにするためのものです。このためにMPIは内部で各コミュニケータのIDを保持しています。グループとはそのコミュニケータに含まれるすべてのプロセスの集合のことです。これまで使ってきた`MPI_COMM_WORLD`とは`mpiexec`で起動されたすべてのプロセスです。他のコミュニケータはグループが異なります。上のコード例では`MPI_Comm_split`に同じ`color`にしたすべてのプロセスは同じグループになっています。 + +MPIは集合論(set theory)で扱われる操作をグループに適応することができます。集合論をすべて理解する必要はありませんが2つの操作の意味を知っておいてください。ここでは"集合(set)"と呼ぶ代わりに、MPIに適用される "グループ(group)"という用語を使用します。まず、和集合(union)演算は2つの集合から新しい(潜在的に)大きな集合を作ります。この新しい集合には2つの集合のすべてのメンバが含まれます(重複はありません)。次に、積集合(intersection)は、他の二つの集合から新しい(潜在的に)小さい集合を作ります。この新しい集合には、元の集合の両方に存在するメンバがすべて含まれます。これら両方の操作の例を以下に図解で示します。 + +![Group Operation Examples](../groups.png) + +上段の例は`{0, 1, 2, 3}` と `{2, 3, 4, 5}` の和集合は `{0, 1, 2, 3, 4, 5}` となります。2つ目の例では、`{0, 1, 2, 3}` と `{2, 3, 4, 5}` の積集合は `{2, 3}` となります。 + +## グループの使用 - Using MPI groups + +グループの仕組みの基本がわかったので実際のMPI操作でどう使うのかをみていきます。MPIでは`MPI_Comm_group`ルーチンでコミュニケータ内のプロセスのグループを簡単に取得することができます。 + +```cpp +MPI_Comm_group( + MPI_Comm comm, + MPI_Group* group) +``` + +コミュニケータにはコンテキスト(ID)とグループが含まれます。`MPI_Comm_group` はそのグループオブジェクトへの参照を得ます。グループオブジェクトはコミュニケータオブジェクトと同じように動作しますが、集団通信ルーチンの引数としで他のランクと通信するためには使用できません(コンテキストが付加されていないためです)。ただし、グループのランクとサイズを取得することはできます (`MPI_Group_rank` と `MPI_Group_size`)。コミュニケーターではできずにグループだけができることとは、ローカルで新しいグループを作成することです。ここで注目するのはローカル操作とリモート操作の違いに注意してください。リモート操作では他のランクと通信が発生しますが、ローカル操作では通信は発生しません。新しいコミュニケーターを作成する場合はそのアプリケーション内のすべてのプロセスで同じコンテキストとグループを決定する必要があるためリモート操作となります。しかし、グループを作成する場合は各プロセスで同じコンテキストを持つ必要がないため通信する必要はなくローカル操作となります。このため通信を気にする必要はなくなります。 + +グループに対する操作はとても簡単です。 + +```cpp +MPI_Group_union( + MPI_Group group1, + MPI_Group group2, + MPI_Group* newgroup) +``` + +積集合もみてみましょう。 + +```cpp +MPI_Group_intersection( + MPI_Group group1, + MPI_Group group2, + MPI_Group* newgroup) +``` + +どちらの演算も、操作は`group1`と`group2`に対して行われて、結果は`newgroup`に格納されます。 + +MPI におけるグループの使い方はたくさんあります。グループが同じかどうかを比較する、あるグループから別のグループを引く、あるグループから特定のランクを除外する、あるグループのランクを別のグループに変換する、といったようにグループを使用することができます。最近MPIに追加された関数の中で最も役に立つのは`MPI_Comm_create_group`でしょう。これは新しいコミュニケータを作成する関数ですが `MPI_Comm_split` のようにその場で計算をして構成を決めるのではなく、 `MPI_Group`を受け取り、グループと同じプロセスをすべて持つ新しいコミュニケータを作成します。 + +```cpp +MPI_Comm_create_group( + MPI_Comm comm, + MPI_Group group, + int tag, + MPI_Comm* newcomm) +``` + +## グループの使用例 - Example of using groups + +グループの使い方の簡単な例です。`MPI_Group_incl`という関数を使ってグループ内の特定のランクを選択し、そのランクのみを含む新しいグループを作成します。 + +```cpp +MPI_Group_incl( + MPI_Group group, + int n, + const int ranks[], + MPI_Group* newgroup) +``` + +この関数は`group`に含まれるプロセスのうち、`ranks`に含まれるランクを持つプロセスのだけが`newgroup`に入ります。どのように機能するかを確かめるため、`MPI_COMM_WORLD`の素数のランクを含むコミュニケータを作成してみます。(訳注:素数は静的に与えています) + +```cpp +// 元のコミュニケータのサイズとその中でのランクを取得 +int world_rank, world_size; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +// このプロセスのMPI_COMM_WORLD内でのグループを得る +MPI_Group world_group; +MPI_Comm_group(MPI_COMM_WORLD, &world_group); + +int n = 7; +const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; + +// world_groupで素数ランクを持つプロセスだけのグループを作成する +MPI_Group prime_group; +MPI_Group_incl(world_group, 7, ranks, &prime_group); + +// このグループを元にしたコミュニケータを作成する +MPI_Comm prime_comm; +MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); + +int prime_rank = -1, prime_size = -1; +// このプロセスが新しいコミュニケータに所属しない場合、MPI_COMM_NULL になります。 +// MPI_Comm_rankまたはMPI_Comm_sizeを使う際に第一引数にMPI_COMM_NULL のコミュニケータを指定してはいけません +if (MPI_COMM_NULL != prime_comm) { + MPI_Comm_rank(prime_comm, &prime_rank); + MPI_Comm_size(prime_comm, &prime_size); +} + +printf("WORLD RANK/SIZE: %d/%d \t PRIME RANK/SIZE: %d/%d\n", + world_rank, world_size, prime_rank, prime_size); + +MPI_Group_free(&world_group); +MPI_Group_free(&prime_group); +MPI_Comm_free(&prime_comm); +``` + +この例では、`MPI_COMM_WORLD`の素数のランクのみを選択してコミュニケータを作成します。まずは `MPI_Group_incl`でグループ`prime_group`を生成します。次に、このグループを `MPI_Comm_create_group`に渡して コミュニケータ`prime_comm`を作成します。そして`ranks` に含まれていないランクの`MPI_Comm_create_group`から返されるコミュニケータが`MPI_COMM_NULL`でないことを確認してランクやグループを確認します。 + +(以下は訳者の環境でn=8で実行した例です) +``` +WORLD RANK/SIZE: 6/8 --- PRIME RANK/SIZE: -1/-1 +WORLD RANK/SIZE: 0/8 --- PRIME RANK/SIZE: -1/-1 +WORLD RANK/SIZE: 4/8 --- PRIME RANK/SIZE: -1/-1 +WORLD RANK/SIZE: 3/8 --- PRIME RANK/SIZE: 2/5 +WORLD RANK/SIZE: 1/8 --- PRIME RANK/SIZE: 0/5 +WORLD RANK/SIZE: 5/8 --- PRIME RANK/SIZE: 3/5 +WORLD RANK/SIZE: 2/8 --- PRIME RANK/SIZE: 1/5 +WORLD RANK/SIZE: 7/8 --- PRIME RANK/SIZE: 4/5 +``` \ No newline at end of file diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md index b529e44..db94d17 100644 --- a/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/index.md @@ -3,6 +3,7 @@ layout: post title: Launching an Amazon EC2 MPI Cluster author: Wes Kendall categories: Beginner MPI +translations: ja_jp tags: redirect_from: '/launching-an-amazon-ec2-mpi-cluster/' --- diff --git a/tutorials/launching-an-amazon-ec2-mpi-cluster/ja_jp.md b/tutorials/launching-an-amazon-ec2-mpi-cluster/ja_jp.md new file mode 100644 index 0000000..e4b621e --- /dev/null +++ b/tutorials/launching-an-amazon-ec2-mpi-cluster/ja_jp.md @@ -0,0 +1,162 @@ +--- +layout: post +title: Amazon EC2 MPIクラスタを起動する - Launching an Amazon EC2 MPI Cluster +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/launching-an-amazon-ec2-mpi-cluster/' +--- + +[前回のレッスン]({{ site.baseurl }}/tutorials/installing-mpich2/)ではMPICH2を1台のマシンにインストールしする方法を説明しました。ただし、MPIを学習しプログラムを実行するために十分なリソースが1台のマシンで提供できるとは限りません。クラスタに簡単にアクセスできる初心者はそういないでしょう。最高のMPIチュートリアルのためには、このサイトのチュートリアルコードはもちろん、自分の並列コードを実行できる環境が必要なので、仮想MPIクラスタをセットアップする方法を説明します。 + +## Amazon EC2で始めよう +このレッスンではAmazonのElastic Compute Cloud (EC2)を使ったクラスタの説明をします。Amazon EC2を始めるには、[Amazon Web Services (AWS)](http://aws.amazon.com/)にアクセスし、"Sign Up "ボタンを押します。サービスを利用するには支払い情報を入力する必要があり、利用したサービスに応じて課金されます。 + +> **Note** - AWSにサインアップする前に、必ず[EC2の価格設定](http://aws.amazon.com/ec2/pricing/)を読んでなにをしようとしているのかを理解してください。この記事を書いている時点では、AWSは一部のマシンサイズに無料時間枠を提供しており、1時間あたり2アメリカセントという低価格のマシンも提供されています。 + +AWSにサインアップしたら、[EC2スタートガイド](http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html?r=1874)を読んでください。さまざまなインスタンスの起動、アクセス方法、終了の方法などを知っておかなければなりません。 + +一方で、MPIクラスタを作成しアクセスするためにAmazonのEC2インフラストラクチャを完全に理解する必要はありません。EC2の基本がわかったら次のステップに進んでください。 + +## StarCluster のインストール +仮想クラスタを作成するために使うツールは[MITのStarCluster toolkit](http://star.mit.edu/cluster/)です。StarClusterは、EC2上にクラスタを構築してアクセス可能とする一連のプロセスを自動化したツールセットです。StarClusterはクラスタの作成・起動だけでなく、OpenMPIや並列アプリケーションのためのソフトウェアも一括でインストールしてくれます。 + +StarClusterツールキットをローカルマシンにインストールするには(Linux/MacOSXでは)、次のように入力します: + +``` +$ sudo easy_install StarCluster +``` + +Windowsを使っている場合は[Windows installation instructions](http://star.mit.edu/cluster/docs/latest/installation.html#installing-on-windows)を参照してください。 + +## StarClusterの設定 - Configuring StarCluster +インストールが終わったら次のように実行してみてください。 + +``` +$ starcluster help +``` + +この時点ではStarClusterは設定されていないため、以下のように出力されるでしょう(ディレクトリが私のとは異なることに注意してください)。 + +``` +StarCluster - (http://web.mit.edu/starcluster) (v. 0.93.3) +Software Tools for Academics and Researchers (STAR) +Please submit bug reports to starcluster@mit.edu + +!!! ERROR - config file /Users/wesleykendall/.starcluster/config does not exist + +Options: +-------- +[1] Show the StarCluster config template +[2] Write config template to /Users/wesleykendall/.starcluster/config +[q] Quit + +Please enter your selection: +``` + +2を入力しましょう。StarClusterはホームディレクトリ内の `~/.starcluster/config`にデフォルトの構成ファイルを生成します。 + +次はAWSアカウントからAWSアクセスキー、シークレットアクセスキー、12桁のユーザーIDを取得しましょう。この情報は、[Amazon Web Services](http://aws.amazon.com/)にアクセスし、右上にある "My Account/Console "をクリックし、"My Security Credentials "をクリックすることで確認できます。 + +![Amazon EC2 Security Credentials Access](../security_creds.png) + +"Access Credentials"セクションの中に"Access Key ID "フィールドと"Secret Access Key"フィールドがあります。ページの下部には"Account Identifiers"セクションがあり、"AWS Account ID"フィールがあります。 + +デフォルトの設定ファイル(`~/.starcluster/config`)をテキストエディタで開き`[aws info]`の行を探し、適切なフィールドにAWSの情報を入力してください。 + +``` +[aws info] +AWS_ACCESS_KEY_ID = # Your Access Key ID here +AWS_SECRET_ACCESS_KEY = # Your Secret Access Key here +AWS_USER_ID = # Your 12-digit AWS Account ID here (no hyphens) +``` + +これらの情報を入力したら設定ファイルを保存してsshの公開/秘密鍵ペアを作成します。この鍵はAmazonにアップロードされ、クラスタにログインする際の認証に使用します。StarClusterで公開/秘密鍵ペアを生成しましょう。 + +``` +$ starcluster createkey mykey -o ~/.ssh/mykey.rsa +``` +これにより、`~/.ssh/mykey.rsa`に「mykey」キーが作成され、AWSアカウントにもキーが作成されます。Amazonの認証情報を正しく入力した場合は、次のような出力になるでしょう。 + +``` +>>> Successfully created keypair: mykey +>>> fingerprint: ... +>>> contents: +-----BEGIN RSA PRIVATE KEY----- +... +-----END RSA PRIVATE KEY----- +``` + +設定ファイルを再度開き、`[key mykey]`エントリがあることを確認してください。このエントリがない場合は、設定に次の内容を追加します。 + +``` +[key mykey] +KEY_LOCATION = ~/.ssh/mykey.rsa +``` + +そしてクラスタパラメータを設定します。デフォルトの設定では、`[cluster smallcluster]`に "smallcluster "というクラスタの設定が書かれています。デフォルトで以下のパラメータが設定されているはずでしょう。 + +``` +[cluster smallcluster] +KEYNAME = mykey +CLUSTER_SIZE = 2 +CLUSTER_USER = sgeadmin +CLUSTER_SHELL = bash +NODE_IMAGE_ID = ami-899d49e0 +NODE_INSTANCE_TYPE = m1.small +``` + +このフィールドをみていきます。2つ以外のノードでクラスタを開始したい場合は、`CLUSTER_SIZE`オプションを変更してください。別のキー(例の"mykey"以外) を定義している場合は、`KEYNAME` フィールドに適切なキーを追加します。クラスタを実行すると、ネットワークファイルシステム (NFS) にマウントされたホームディレクトリを持つ `CLUSTER_USER` ユーザ名が自動的に生成されます。`NODE_IMAGE_ID` はクラスタソフトウェアのイメージIDです。最後のパラメータ `NODE_INSTANCE_TYPE` は各ノードのサイズを決定します。利用可能なインスタンスタイプとその属性のリストについては、[ここ](http://aws.amazon.com/ec2/instance-types/)を参照してください。 + +クラスタの実行コストを決定するには、ノード数にインスタンス・タイプの時間単価を掛ければよいです。この記事を書いている時点ではm1.smallインスタンスは1時間あたり6.5アメリカセントです。費用は時間に対して課金されます。クラスタを30分間稼働させた場合、1時間分の料金が請求されます。 + +> **Note** - t1.microインスタンスは最も安価ですが、私の場合StarClusterでクラスタを起動すると、うまく起動できません。 + +### Starclusterのmpich2プラグインを有効にする。 +最後に、Starclusterを起動する前に、[以下の手順](http://star.mit.edu/cluster/docs/0.93.3/plugins/mpich2.html)に従って、Starcluster用の`mpich2`プラグインを有効にしてください。 + +## クラスタの起動、アクセス、停止 +設定が終わったら次のように入力して"mpicluster"クラスタを起動します。デフォルトの構成では、デフォルトのクラスタタイプとして"smallcluster"が使用されます: + +``` +starcluster start mpicluster +``` + +このプロセスは構成によっては少し時間がかかります。コマンドの完了後StarClusterはクラスタへのアクセス、停止、および再起動に使用できるコマンドを出力します。 + +次のコマンドでクラスタのマネージャノードにSSHでログインできます。 + +``` +starcluster ssh manager mpicluster +``` + +クラスタにログインすると、カレントディレクトリは`/root`となります。コードのコンパイルは`/home/ubuntu`または`/home/sgeadmin`に移動してから行ってください。このディレクトリはNFSマウントされており、クラスタ内のすべてのノードから共有されています。 + +次にGitHubレポジトリからこのMPIチュートリアルのコードをチェックアウトしてください。このサイトのすべてのレッスンで使用されているコードにアクセスできます。 + +``` +git clone git://github.com/mpitutorial/mpitutorial.git +``` + +クラスタへのアクセスに慣れてきたらログアウトしてクラスタを停止ましょう。 + +``` +starcluster stop mpicluster +``` + +クラスターは次のように入力して再度起動できます。 + +``` +starcluster start -x mpicluster +``` + +クラスターを完全に終了するには、次のように入力します。 + +``` +starcluster terminate mpicluster +``` + +"stop"と"terminate"の違いはなんでしょう?stopしたクラスタはまだAmazonのElastic Block Store(EBS)上にイメージが残っています。Amazon EBSの料金は保存されている量に対して課金されるため、当面クラスタを使用しない場合はクラスタのterminateをお勧めします。しっかりと[Amazon EC2 Pricing](http://aws.amazon.com/ec2/pricing/)について理解してください。 + +## MPI クラスタの準備はできましたか? - Ready to run MPI programs on your cluster? +ついに自分のMPIクラスタを手に入れたので、プログラムを実行しましょう。最初に[MPI hello world アプリケーション]({{ site.baseurl }}/tutorialss/mpi-hello-world/)のコンパイルと実行方法をチェックしてください。ローカルクラスタを構築して同じことを試したい場合は、[running an MPI cluster within a LAN]({{ site.baseurl }}/tutorialss/running-an-mpi cluster-within-a-lan)チュートリアルを参照してください。全てのレッスンは、[MPIチュートリアル]({{ site.baseurl }}/tutorials/)をチェックしてください。もしレッスンで何か問題があれば、以下にコメントを残してください。 \ No newline at end of file diff --git a/tutorials/mpi-broadcast-and-collective-communication/index.md b/tutorials/mpi-broadcast-and-collective-communication/index.md index b009013..0223a56 100644 --- a/tutorials/mpi-broadcast-and-collective-communication/index.md +++ b/tutorials/mpi-broadcast-and-collective-communication/index.md @@ -3,7 +3,7 @@ layout: post title: MPI Broadcast and Collective Communication author: Wes Kendall categories: Beginner MPI -translations: zh_cn +translations: zh_cn,ja_jp tags: MPI_Barrier, MPI_Bcast, MPI_Wtime redirect_from: '/mpi-broadcast-and-collective-communication/' --- diff --git a/tutorials/mpi-broadcast-and-collective-communication/ja_jp.md b/tutorials/mpi-broadcast-and-collective-communication/ja_jp.md new file mode 100644 index 0000000..ab3222e --- /dev/null +++ b/tutorials/mpi-broadcast-and-collective-communication/ja_jp.md @@ -0,0 +1,158 @@ +--- +layout: post +title: MPIブロードキャストと集団通信 - MPI Broadcast and Collective Communication +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Barrier, MPI_Bcast, MPI_Wtime +redirect_from: '/mpi-broadcast-and-collective-communication/' +--- + +ここまでの[チュートリアル]({{ site.baseurl }}/tutorials/)では、2プロセス間のポイントツーポイント通信を説明してきました。このレッスンから集団通信(Collective Communication)について学びます。集団通信はコミュニケータ内の*すべての*プロセスが関係する通信です。このレッスンでは、最初に集団通信の意味を確認し、標準的な集団通信のルーチンであるブロードキャスト(Broadcast)について説明します。 + +> **Note** - このサイトのコードはすべて[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは[tutorials/mpi-broadcast-and-collective-communication/code]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code)にあります。 + +## 集団通信と同期 - Collective communication and synchronization points +集団通信を学んでいくために、最初に覚えておくべきことの1つは、プロセス間の同期が必要になるということです。つまり、すべての関連するプロセスがコード内の特定の集団通信を完了しなければ、すべてのプロセスが再び実行を開始できません。 + +同期についてさらに詳しく説明します。MPIにはプロセスの同期専用の特別な関数があります。 + + +```cpp +MPI_Barrier(MPI_Comm communicator) +``` + +バリアという非常にわかりやすい名前がついています。この関数は、コミュニケータ内のすべてのプロセスがこの関数を呼ぶまで全てのプロセスはこの関数でブロック(訳注:つまり、あるプロセスだけが先に進むことをバリア)します。下図の横軸がプログラム実行の時間を示し、各円はプロセスを示します。 +![MPI_Barrier example](../barrier.png) + +それぞれの図を見ていきましょう。T1では、プロセス0が`MPI_Barrier`に達しました。T2ではプロセス0はバリア関数でブロックされ、この間にプロセス1と3がバリア関数に到達しました。T3でプロセス2がようやくバリアに到達します。この結果、T4のようにすべてのプロセスが再び実行を進められます。 + +`MPI_Barrier`の利用用途はいくつかあります。最も主な使途は並列プログラムで正確な時間測定(timed accurately)をするためです。 + +`MPI_Barrier` はどのように実装されているのでしょうか?[sending and receiving tutorial]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)のレッスンで学んだリングプログラムを思い出してください。トークンをリングのようにすべてのプロセスに渡すプログラムでした。この実装は全てのプロセスが処理を終えなければこの処理は終わらないのでバリアを実装するの1つの方式です。 + +繰り返しになりますが、すべての集団通信は同期されている。言い換えると、そのルーチンを`MPI_Barrier`とした時にバリアが完了しないような状態ができてしまうと集団通信は正常に完了できません。`MPI_Barrier`や集団通信の関数をコミュニケータ内の全てのプロセスが呼び出すことを保証せずに呼び出そうとするとプログラムはブロック状態のまま先に進めません。これは初学者にとって非常に分かりにくいので覚えておいてください! + +## MPI_Bcast によるブロードキャスト - Broadcasting with MPI_Bcast +ブロードキャスト(broadcast)は最も基本的な集団通信の1つです。ブロードキャストはある1つのプロセスがコミュニケータ内のすべてのプロセスに同じデータを送信します。ユーザ入力や構成パラメータをすべてのプロセスに送信するために使うことができます。 + +ブロードキャストの例を次に示します。 + +![MPI_Bcast pattern](../broadcast_pattern.png) + +この例はプロセス0がルートプロセスでとなり、オリジナルのデータを保持しています。他のすべてのプロセスはデータのコピーを受け取ります。 + +MPIにはブロードキャストを実現する`MPI_Bcast`関数があります。 + +```cpp +MPI_Bcast( + void* data, + int count, + MPI_Datatype datatype, + int root, + MPI_Comm communicator) +``` + +ルートプロセスは送信をし、他のプロセスは受信を行うのですが共通して`MPI_Bcast`関数を呼びます。ルートプロセス(この例ではプロセス0)が`MPI_Bcast`を呼ぶと`data`が他のすべてのプロセスに送信されます。すべての受信プロセスは`MPI_Bcast`でルート・プロセスからの`data`を受け取ります。 + +## MPI_Send と MPI_Recv によるブロードキャスト - Broadcasting with MPI_Send and MPI_Recv +`MPI_Bcast`は`MPI_Send`と`MPI_Recv`のラッパーなのでしょうか?実際、このラッパーはsendとrecvを使って簡単に実装することもできます。[my_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/my_bcast.c)に示す`my_bcast`という関数は、`MPI_Bcast`と同じ引数をとる自作のブロードキャスト関数です。 + +```cpp +void my_bcast(void* data, int count, MPI_Datatype datatype, int root, + MPI_Comm communicator) { + int world_rank; + MPI_Comm_rank(communicator, &world_rank); + int world_size; + MPI_Comm_size(communicator, &world_size); + + if (world_rank == root) { + // ルートプロセスはforで各プロセスにデータを送る + int i; + for (i = 0; i < world_size; i++) { + if (i != world_rank) { + MPI_Send(data, count, datatype, i, 0, communicator); + } + } + } else { + // ルートでないプロセスはルートプロセスからのデータを受け取る + MPI_Recv(data, count, datatype, root, 0, communicator, + MPI_STATUS_IGNORE); + } +} +``` + +コメントの通りで、ルートプロセスが他のプロセスにデータを送り、他のプロセスはルートプロセスからデータを受け取る。とても簡単ですね。[レポジトリ]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/)のチュートリアルディレクトリからmy_bcastプログラムを実行してみましょう。 + +``` +>>> cd tutorials +>>> ./run.py my_bcast +mpirun -n 4 ./my_bcast +Process 0 broadcasting data 100 +Process 2 received data 100 from root process +Process 3 received data 100 from root process +Process 1 received data 100 from root process +``` + +動作はしますが、この自作関数は非常に非効率的です。各プロセスには送信/受信ネットワークのリンクが1つしかないのです。つまりプロセス0から常に1つのネットワーク リンクのみを使用することを繰り返してすべてのデータを送信します。ネットワークリンクを一度に多く使用できる賢い方法を考えましょう。ツリー(木)ベースの通信アルゴリズムです。 + +![MPI_Bcast tree](../broadcast_tree.png) + +この図を説明します。最初のステップでプロセス0はデータをプロセス1に送信します。次のステップでプロセス0もデータをプロセス2に送信します。さらにプロセス1はプロセス3にデータを送信します。他のプロセスがルートプロセスを助けて2つのネットワーク接続がブロードキャストに使用されています。このようにすべてのプロセスがデータを受信するまで各ステップごとにネットワークの使用率は2倍になります。 + +この実装コードを書くことはレッスンの目的から少し外れます。詳細が気になる場合は[Parallel Programming with MPI](http://www.amazon.com/gp/product/1558603395/ref=as_li_qf_sp_asin_tl?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=1558603395)を参照してください。コードの問題の完全な例が掲載されている優れた本です。 + +## MPI_Bcast と MPI_Send および MPI_Recv との比較 - Comparison of MPI_Bcast with MPI_Send and MPI_Recv +`MPI_Bcast`はネットワーク利用効率の改善のために、今紹介したようなツリー型のブロードキャストアルゴリズムを利用しています。自作ブロードキャストを`MPI_Bcast`と比較してみましょう。このための`compare_bcast`を実行します。`compare_bcast`は、レッスンコードに含まれているサンプルプログラムです([compare_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c))。コードの説明の前にまずはMPIのタイミング(timing)関数の1つである`MPI_Wtime`の説明をします。`MPI_Wtime`は引数を取らず、過去の実行の秒数を浮動小数点数で返します。うまく使用することでCの`time`関数と同じようにプログラム中で複数の`MPI_Wtime`関数を呼び出して、差分を引くことでセグメントごとの時間を取得することができる関数です。 + +`my_bcast` と `MPI_Bcast` を比較するコードを書きます。 + +```cpp +for (i = 0; i < num_trials; i++) { + // Time my_bcast + // バリアをして事前時間を同期する + MPI_Barrier(MPI_COMM_WORLD); + total_my_bcast_time -= MPI_Wtime(); + my_bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD); + // Synchronize again before obtaining final time + MPI_Barrier(MPI_COMM_WORLD); + total_my_bcast_time += MPI_Wtime(); + + // Time MPI_Bcast + MPI_Barrier(MPI_COMM_WORLD); + total_mpi_bcast_time -= MPI_Wtime(); + MPI_Bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); + total_mpi_bcast_time += MPI_Wtime(); +} +``` + +`num_trials`は実行する回数を示す変数です。 2つの関数ごとに実行時間を計算します。そして平均時間をプログラムの最後で出力します。 コード全体は、[compare_bcast.c]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code/compare_bcast.c)を見てください。[レッスンコード]({{ site.github.code }}/tutorials/mpi-broadcast-and-collective-communication/code)で確認できます。 + +[レポジトリ]({{ site.github.code }})の compare_bcast プログラムを実行すると出力は次のようになります。 + +``` +>>> cd tutorials +>>> ./run.py compare_bcast +/home/kendall/bin/mpirun -n 16 -machinefile hosts ./compare_bcast 100000 10 +Data size = 400000, Trials = 10 +Avg my_bcast time = 0.510873 +Avg MPI_Bcast time = 0.126835 +``` + +スクリプトは、16個のプロセッサにおいて1ブロードキャスト呼び出しあたり100,000 個の整数を送ることを10回試行します。Ethernet経由で接続された16プロセッサを使用した私の環境ではmy_bcastとMPI実装の間に大きな実行時間の差が生まれました。以下は、さまざまなプロセッサ数での結果です。 + +| Processors | my_bcast | MPI_Bcast | +| --- | --- | --- | +| 2 | 0.0344 | 0.0344 | +| 4 | 0.1025 | 0.0817 | +| 8 | 0.2385 | 0.1084 | +| 16 | 0.5109 | 0.1296 | + +2つのプロセッサでは2つの実装の時間差はありません。これは`MPI_Bcast`がツリー実装を使ったとしても、2つのプロセッサの場合はネットワーク使用率には違いがないためです。ただし16プロセッサまで増やすと違いがはっきりとわかります。 + +試してみてください! + +## Conclusions / up next +集団通信に慣れてきましたか?次は[ScatterとGather]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/)を学びましょう! + +その他のレッスンは[MPIチュートリアル]({{ site.baseurl }}/tutorials/)をみてください。 diff --git a/tutorials/mpi-hello-world/index.md b/tutorials/mpi-hello-world/index.md index 41ba9ed..b854bee 100644 --- a/tutorials/mpi-hello-world/index.md +++ b/tutorials/mpi-hello-world/index.md @@ -3,7 +3,7 @@ layout: post title: MPI Hello World author: Wes Kendall categories: Beginner MPI -translations: zh_cn +translations: zh_cn,ja_jp tags: MPI_Comm_rank, MPI_Comm_size, MPI_Finalize, MPI_Get_processor_name, MPI_Init redirect_from: '/mpi-hello-world/' --- diff --git a/tutorials/mpi-hello-world/ja_jp.md b/tutorials/mpi-hello-world/ja_jp.md new file mode 100644 index 0000000..f8643a2 --- /dev/null +++ b/tutorials/mpi-hello-world/ja_jp.md @@ -0,0 +1,186 @@ +--- +layout: post +title: 初めてのMPIプログラム - MPI Hello World +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/mpi-hello-world/' +--- + +このレッスンでは基本的なMPI Hello Worldアプリケーションの作成方法とMPIプログラムの実行方法を説明します。MPIの初期化と複数のプロセスにわたるMPIジョブの実行の基本について説明します。このレッスンは、MPICH2(1.4)のインストールで動作することを確認しています。MPICH2をインストールしていない場合は[installing MPICH2 lesson]({{ site.baseurl }}/tutorials/installing-mpich2/)を参照してください。 + + +> **Note** : このサイトのコードはすべて [GitHub]({{ site.github.repo }})にあります。このチュートリアルのコードは[tutorials/mpi-hello-world/code]({{ site.github.code }}/tutorials/mpi-hello-world/code)にあります。 + +## Hello, World!: Hello world code examples +それでは[mpi_hello_world.c]({{ site.github.code }}/tutorials/mpi-hello-world/code/mpi_hello_world.c)にあるコードを読んでいきます。 + + +```cpp +#include +#include + +int main(int argc, char** argv) { + // Initialize the MPI environment + // MPI環境の初期化 + MPI_Init(NULL, NULL); + + // Get the number of processes + // プロセスの数を得る + int world_size; + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + + // Get the rank of the process + // このコミュニケータ内の自分のランクを得る + int world_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + // Get the name of the processor + // このプロセッサーの名前を得る + char processor_name[MPI_MAX_PROCESSOR_NAME]; + int name_len; + MPI_Get_processor_name(processor_name, &name_len); + + // Print off a hello world message + // Hello, World!を表示する。 + printf("Hello world from processor %s, rank %d out of %d processors\n", + processor_name, world_rank, world_size); + + // Finalize the MPI environment. + // MPI環境をクローズする + MPI_Finalize(); +} +``` + +MPIプログラムではMPIヘッダのインクルードが必要です(`#include `)。次にMPI環境を初期化する必要があります。 + + + +```cpp +MPI_Init( + int* argc, + char*** argv) +``` + +`MPI_Init`: MPIのグローバル変数と内部変数が初期化・設定されます。このプログラムでは、全てのプロセスのそれぞれにランクを割り当て、それら全てを含むコミュニケータを作成します。`MPI_Init`は特に設定する引数がありません。追加のパラメータは将来の実装で必要になった場合に備えて予約されています。 + +`MPI_Init`の後には2つの関数を呼び出します。これらはほとんど全てのMPIプログラムで呼び出されるコードです。 + +```cpp +MPI_Comm_size( + MPI_Comm communicator, + int* size) +``` + +`MPI_Comm_size`はコミュニケータのサイズを返します。サンプルで引数に与えている`MPI_COMM_WORLD`(MPIにより初期化される変数)はジョブ内のすべてのプロセスを含むのでこの呼び出しはジョブに要求したプロセスの数を返します。 + +```cpp +MPI_Comm_rank( + MPI_Comm communicator, + int* rank) +``` + +`MPI_Comm_rank`:コミュニケータ内におけるそのプロセスのランクを返します。コミュニケータ内の各プロセスには0から順にランクが割り当てられます。ランクは主にメッセージの送受信のために使用されます。 + +次の関数は実際のコードではあまり使われることはないでしょう。 + +```cpp +MPI_Get_processor_name( + char* name, + int* name_length) +``` + +`MPI_Get_processor_name`はプロセッサの名前を取得します。最後に呼ばれる関数も見ていきましょう。 + +```cpp +MPI_Finalize() +``` + +`MPI_Finalize`はMPI環境のクリーンアップです。この関数の後はMPI関数を使うことはできません。 + +## アプリケーションの実行: Running the MPI hello world application +gitからコードをcloneしてコードのフォルダを見てみましょう。その中にはMakefileがあります。 + +``` +>>> git clone {{ site.github.repo }} +>>> cd mpitutorial/tutorials/mpi-hello-world/code +>>> cat makefile +EXECS=mpi_hello_world +MPICC?=mpicc + +all: ${EXECS} + +mpi_hello_world: mpi_hello_world.c + ${MPICC} -o mpi_hello_world mpi_hello_world.c + +clean: + rm ${EXECS} +``` + +このmakefileはMPICC環境変数が設定されているならばそれを用います。MPICH2をローカルディレクトリにインストールした場合は、MPICC環境変数を適切なmpiccバイナリパスを指すように設定してください。mpiccは必要なライブラリやインクルードを行ってくれるgccのラッパーです。 + +``` +>>> export MPICC=/home/kendall/bin/mpicc +>>> make +/home/kendall/bin/mpicc -o mpi_hello_world mpi_hello_world.c +``` + +プログラムのコンパイルが終わり実行の準備が整いました!複数のノードのクラスターでMPIプログラムを実行する場合はホストファイルをセットアップする必要があることに注意してください。単一のマシンでMPIを実行するだけの場合は次の情報は無視してください。 + +host_fileには、MPIジョブが実行されるすべてのコンピューターのhostnameが含まれています。実行を容易にするために、これらのホストにSSHアクセスできることを確認する必要があります。また、SSHのパスワードプロンプトを回避するために[setup an authorized keys file](http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html)を設定する必要があります。たとえばhost_fileの例を示します。 + +``` +>>> cat host_file +cetus1 +cetus2 +cetus3 +cetus4 +``` +gitレポジトリに含まれるrun.pyで複数のホストを用いるのにはMPI_HOSTSという環境変数を設定する必要があります。これを設定してMPIジョブが起動されると、実行コマンドラインにホストファイルが自動的に含められます。hostファイルが必要ない場合は環境変数は設定不要です。また、MPIのローカルインストールで特定のmpirunバイナリを指したい場合はMPIRUN環境変数を設定する必要があります。 + +これが完了したら、レポジトリに含まれているrun.pyを使用できます。このスクリプトは*tutorials*ディレクトリに保存されており、すべてのチュートリアルの任意のプログラムを実行できます(実行前に実行可能ファイルのビルドも試行します)。mpitutorialフォルダから次の操作を試してください。 + + +``` +>>> export MPIRUN=/home/kendall/bin/mpirun +>>> export MPI_HOSTS=host_file +>>> cd tutorials +>>> ./run.py mpi_hello_world +/home/kendall/bin/mpirun -n 4 -f host_file ./mpi_hello_world +Hello world from processor cetus2, rank 1 out of 4 processors +Hello world from processor cetus1, rank 0 out of 4 processors +Hello world from processor cetus4, rank 3 out of 4 processors +Hello world from processor cetus3, rank 2 out of 4 processors +``` + +想定通りMPIプログラムはホストファイル内のすべてのホストで動作しました。各プロセスは一意の(ユニークな)ランクを持ち、プロセス名とともに出力されました。出力例からわかるように、実行順序は同期がしていないためプロセスの出力はランダムになっています。 + +スクリプトはmpirunを呼び出していることに注目してください。これは、MPIがジョブを起動するために使用するプログラムです。このプログラムはプロセスをホストファイル内のホストで生成し、実際のプログラムは各プロセスで実行されます。このスクリプトではMPIプロセスの数を4に設定するために`-n`フラグを自動的に提供します。実行スクリプトを変更して、より多くのプロセスを起動してみてください。ただし、誤ってシステムをクラッシュさせないようにしてくださいね。:-) + +さて「私のコンピュータはマルチコアなので他のノードよりも先にあるノードのコアを使いたいのだが」と思っていますか?これは簡単に制御できます。ホストファイルを変更し、ホスト名の後にコロンとプロセッサあたりのコア数を入力すれば良いです。たとえば、各ホストの2つのコアを使いたいとしましょう。 + +``` +>>> cat host_file +cetus1:2 +cetus2:2 +cetus3:2 +cetus4:2 +``` + +実行スクリプトを再度実行するとMPIジョブによって2つのホストのみで4つのプロセスが生成されました!(訳注:hostsは8個のプロセスを処理できることを示しますが、要求されたのは4個のプロセスのみなので2つのホストだけが使われています) + +``` +>>> ./run.py mpi_hello_world +/home/kendall/bin/mpirun -n 4 -f host_file ./mpi_hello_world +Hello world from processor cetus1, rank 0 out of 4 processors +Hello world from processor cetus2, rank 2 out of 4 processors +Hello world from processor cetus2, rank 3 out of 4 processors +Hello world from processor cetus1, rank 1 out of 4 processors +``` + +## 次に: Up next +MPIプログラムの実行方法について基本的な理解ができたので、次は基本的なポイントツーポイント通信ルーチンを学習します。次のレッスンは[MPI の基本的な送信ルーチンと受信ルーチン: basic sending and receiving routines in MPI]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)です。 +[MPI tutorials]({{ site.baseurl }}/tutorials/)をMPIレッスンの完全なリファレンスとして活用してください。 + +困っていますか?混乱していますか?お気軽に下記にコメントを残してください。私や他の読者がお役に立てるかもしれません。 + diff --git a/tutorials/mpi-introduction/index.md b/tutorials/mpi-introduction/index.md index a7648d5..3424219 100644 --- a/tutorials/mpi-introduction/index.md +++ b/tutorials/mpi-introduction/index.md @@ -4,7 +4,7 @@ title: MPI Tutorial Introduction author: Wes Kendall categories: Beginner MPI tags: -translations: zh_cn +translations: zh_cn,ja_jp redirect_from: '/mpi-introduction/' --- diff --git a/tutorials/mpi-introduction/ja_jp.md b/tutorials/mpi-introduction/ja_jp.md new file mode 100644 index 0000000..e6f4e8e --- /dev/null +++ b/tutorials/mpi-introduction/ja_jp.md @@ -0,0 +1,37 @@ +--- +layout: post +title: MPI チュートリアル イントロダクション +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/mpi-introduction/' +--- + +もはや並列計算はパソコン、スマートフォン、その他の技術と同じように人々の生活の一部となっています。これはこのWebサイトにアクセスするような方はご存じのことでしょう。並列プログラミングを学ぶというのは、学校でで学習している方・仕事のために学びたい方・趣味として学びたい方、どんな方にも今後にも活用できる非常に価値のある選択といえます。私の意見ですが、メッセージ パッシング インターフェイス(MPI)の学習は、並列プログラミングの知識を広げる正しい道です。MPI は他の多くの並列プログラミングライブラリ(Hadoopなど)よりも低レベルですが、並列プログラミングに関する知識を構築するためのとてもよい基礎となります。 + +どうして私が、このMPIに関するリソースを作成したかを説明します。私は、大学院時代に MPIをよく使用していました。幸いにもアルゴンヌ国立研究所([Argonne National Laboratory](http://www.anl.gov))でのインターンシップ中にMPIコミュニティの重要人物と出会うことができ、博士時代には大規模なスーパーコンピューティング資源とMPIを用いたクレイジーな研究に取り組めました。しかし、このような人脈とリソースの中にあってもMPIの学習は依然として難しいと未だに思っています。 + +MPI学習が難しいと感じたのには3つの理由があります。まず、MPI学習のオンラインリソースは時代遅れか不十分な内容でした。次に、自分でクラスタを簡単に利用・構築する方法が記載されたリソースを見つけるのは困難でした。最後に、大学院時代の最も安価なMPIの本は60ドルもしました。これは大学院生にとっては高額です。現代おける並列プログラミングの重要性を考えると、並列アプリケーションのための基本的なインターフェイスの1つに関する情報に人々がアクセスがとても重要だと考えています。 + +私はMPIの専門家ではありません。ですが、大学院時代に学んだMPIに関するすべての情報を、*皆さん自身の*クラスタで実行できるサンプルコードを含む簡単なチュートリアル形式で広めることは有益だと考えています。このWebサイトの情報が皆さんのキャリア、研究、または人生にとって貴重なツールとなることを願っています。並列プログラミングは現在だけでなく*未来でもある*からです。 + +## MPIの歴史(概略): A brief history of MPI +1990年代以前、現在のMPIのようなスタイルで並列計算プログラムを書くことはできませんでした。異なるコンピュータアーキテクチャに対するプログラミングと言うのは困難で退屈を極めました。いくつかのライブラリが生まれましたがそれらが標準となることはありませんでした。 + +その時代の並列アプリケーションはほとんどが科学や研究領域のためのものでした。この中で、最も一般的に採用されたライブラリのモデルがメッセージ・パッシング・モデルです。このモデルを利用するアプリケーションは、あるタスクを実行するためにプロセス間でメッセージを受け渡しを行います。このモデルは並列アプリケーションで非常にうまく機能します。マネージャー・プロセスはワーカー・プロセスに操作命令を含んだメッセージを渡して、ワーカー・プロセスに操作を割り当てることができます。例えばマージソートを並列処理するとします。各プロセス上はローカルのデータをソートし、そのローカルのソート済みのデータを全体でマージするために、隣接したプロセスに結果を渡します。このように多くの並列アプリケーションはメッセージパッシングモデルで表現できます。 + +この時代に登場したライブラリはメッセージパッシングモデルであり各ライブラリ間の機能の違い少なかったため、1992年のSupercomputingカンファレンスにおいて各ライブラリの作者が集ってメッセージパッシングの実行標準インターフェースであるMessage Passing Interfaceを定義しました。これを契機にプログラマはすべての主要な並列アーキテクチャに移植可能な並列アプリケーションを書くことができるようになりました。また、現在も一般的に使われているライブラリの使われている機能やモデルもこの時から出現しました。 + +そして1994年までに完全なインターフェースと標準が定義されこれはMPI-1と呼ばれています。とはいえ、MPIは特定の実装でなくインターフェイスの定義です。各々のアーキテクチャに対応したインタフェースを実装を作成するのは開発者に委ねられていました。しかし、幸いにもMPIの完全な実装が利用できるようになるまで、1年程度しかかかりませんでした。この最初の実装が作られた後、MPIは広く採用され今でもメッセージパッシング・アプリケーションを書くための*事実上の(デファクトの)*手法であり続けています。 + +![An accurate representation of the first MPI programmers.](../90s_nerd.jpg) +*最初のMPIプログラマ* + +## MPIメッセージパッシングモデルの設計: MPI's design for the message passing model +並列プログラミングのメッセージパッシングモデルであるMPIの設計における、いくつかの古典的な概念について説明します。まずは、`コミュニケータ`という概念です。コミュニケータは互いに通信可能なプロセスのグループです。このプロセスグループでは、各プロセスに固有の`ランク`が割り当てられており、そのランクで互いを区別して明示的に通信を行います。 + +通信の基本はプロセス間の送受信操作です。送信側のプロセスはランクとメッセージを識別するためのユニークな`タグ`を用いて別のプロセスにメッセージを送信します。受信側のプロセスは指定されたタグを持つメッセージの受信してデータを処理します。このような1つの送信者と受信者が関わる通信を`ポイント・ツー・ポイント通信`と呼びます。 + +プロセスが他の全プロセスと通信したいことがあります。例えば、マネージャー・プロセスがワーカー・プロセスすべてにデータをブロードキャストすることを考えましょう。1つ1つの送受信を行うコードを書くのは面倒ですし、最適な方法でネットワークを利用するのも難しいです。MPIはこのような全プロセスを含む様々な種類の`集団通信(collective communication)`を扱うことができます。 + +ポイント・ツー・ポイント通信と集団通信を組み合わせることで、非常に複雑な並列プログラムが作成できます。これらの機能は非常にパワフルな高度なメカニズムを持ちます。この説明は後のレッスンまで取っておくことにして、今は[MPIをシングルマシンにインストールする]({{ site.baseurl }}/tutorials/installing-mpich2/)か、[Amazon EC2 MPIクラスタを起動する]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/)に取り組んでください。既にMPIがインストールされているなら、それは素晴らしい![MPI Hello World]({{ site.baseurl }}/tutorials/mpi-hello-world)に進んでください。 \ No newline at end of file diff --git a/tutorials/mpi-reduce-and-allreduce/index.md b/tutorials/mpi-reduce-and-allreduce/index.md index 209d263..9011084 100644 --- a/tutorials/mpi-reduce-and-allreduce/index.md +++ b/tutorials/mpi-reduce-and-allreduce/index.md @@ -3,7 +3,7 @@ layout: post title: MPI Reduce and Allreduce author: Wes Kendall categories: Beginner MPI -translations: zh_cn +translations: zh_cn,ja_jp tags: MPI_Allreduce, MPI_Reduce redirect_from: '/mpi-reduce-and-allreduce/' --- diff --git a/tutorials/mpi-reduce-and-allreduce/ja_jp.md b/tutorials/mpi-reduce-and-allreduce/ja_jp.md new file mode 100644 index 0000000..3cbef83 --- /dev/null +++ b/tutorials/mpi-reduce-and-allreduce/ja_jp.md @@ -0,0 +1,178 @@ +--- +layout: post +title: MPI Reduce と Allreduce - MPI Reduce and Allreduce +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Allreduce, MPI_Reduce +redirect_from: '/mpi-reduce-and-allreduce/' +--- + +前回のレッスンでは`MPI_Scatter`と`MPI_Gather`を使用してMPIで並列に順位計算を実行するアプリケーションを説明しました。このレッスンでは、`MPI_Reduce`と`MPI_Allreduce`を説明して集団通信への理解をさらに深めます。 + +> **Note** : このサイトのコードはすべて [GitHub]({{ site.github.repo }})にあります。このチュートリアルのコードは [tutorials/mpi-reduce-and-allreduce/code]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code)にあります。 + +## Reduce - An introduction to reduce +*reduce*は関数型プログラミングで使われる基本的な概念です。データのreduceはある関数を使用して数値のセットを小さな数値のセットにします。たとえば、`[1, 2, 3, 4, 5]`というリストがあるとしましょう。これをsum 関数でreduceすると`sum([1, 2, 3, 4, 5]) = 15`が計算されることになります。掛け算でreduceすると`multiply([1, 2, 3, 4, 5]) = 120`となります。 + +分散されている数値の集合にreduceするのは非常に面倒です。さらに集合の順序を考慮しながらのreduceを効率的にプログラムするのも面倒です。MPIには `MPI_Reduce` 関数があり、プログラマが並列アプリケーションで行う必要のある一般的なreduceのほとんどを扱うことができます。 + +## MPI_Reduce +`MPI_Reduce` は`MPI_Gather` と同様、各プロセスで入力要素の配列を受け取って出力要素の配列をルートプロセスに返します。出力要素にはreduceの結果が含まれます。`MPI_Reduce`の関数定義は次のとおりです。 + +```cpp +MPI_Reduce( + void* send_data, + void* recv_data, + int count, + MPI_Datatype datatype, + MPI_Op op, + int root, + MPI_Comm communicator) +``` + +`send_data`引数は、各プロセスがreduceしたい`datatype`型の要素の配列のポインタです。`recv_data`はルートプロセスだけの引数でreduceの結果が格納されて`sizeof(datatype) * count`のサイズを持もちます。`op` パラメータには、データに適用したい処理を指定します。MPIには一般的なreduce演算が用意されています。自作のreduceの関数を作成することもできますがこのレッスンでは扱いません。以下にMPIでサポートされている操作を紹介します。 + +* `MPI_MAX` - 最大値 +* `MPI_MIN` - 最小値 +* `MPI_SUM` - 合計 +* `MPI_PROD` - 乗算 +* `MPI_LAND` - 各要素の論理的なAND演算 +* `MPI_LOR` - 各要素の論理的なOR演算 +* `MPI_BAND` - 各要素のビットAND演算 +* `MPI_BOR` - 各要素のビットOR演算 +* `MPI_MAXLOC` - 最大値とそれを持つプロセスのランク +* `MPI_MINLOC` - 最小値とそれを持つプロセスのランク + +`MPI_Reduce`のイメージを示します。 + +![MPI_Reduce](../mpi_reduce_1.png) + +この例では各プロセスは整数を1つ持ちます。`MPI_Reduce`はプロセス0で呼び出され`MPI_SUM`をreduce演算として使用します。合計された結果がルートプロセスに格納されます。 + +次は各プロセスが整数を複数持った時のことを考えます。 + +![MPI_Reduce](../mpi_reduce_2.png) + +この例では各プロセスは2つの整数を持ちます。ルートのプロセスではこの2つの数値を一緒にして合計を求めるのではなく、結果を入れる配列のi番目に対して、各プロセスのi番目の数の合計を集約することに注意してください。 +つまり、すべての配列の要素を合計して1つの要素にするのではなく、各配列の要素を合計してプロセス0の結果配列のi番目の要素に格納します + +`MPI_Reduce` がどのように見えるか理解できたので次のトピックに進みましょう。 + +## MPI_Reduceを使った平均の計算 - Computing average of numbers with MPI_Reduce +一つ前のレッスンでは`MPI_Scatter`と`MPI_Gather`で数値の平均を求めましたが、`MPI_Reduce`を使うことでより簡単に実装することができます。次に[reduce_avg.c]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code/reduce_avg.c)を示します。 + +```cpp +float *rand_nums = NULL; +rand_nums = create_rand_nums(num_elements_per_proc); + +// 各のプロセスのsumを求める +float local_sum = 0; +int i; +for (i = 0; i < num_elements_per_proc; i++) { + local_sum += rand_nums[i]; +} + +// 各のローカル変数の平均を合計と平均を表示する +printf("Local sum for process %d - %f, avg = %f\n", + world_rank, local_sum, local_sum / num_elements_per_proc); + +// 各プロセスで求めたsumをグローバルsumとしてreduceする +float global_sum; +MPI_Reduce(&local_sum, &global_sum, 1, MPI_FLOAT, MPI_SUM, 0, + MPI_COMM_WORLD); + +// 結果の表示 +if (world_rank == 0) { + printf("Total sum = %f, avg = %f\n", global_sum, + global_sum / (world_size * num_elements_per_proc)); +} +``` + +このコードでは各プロセスが(floatの)乱数を作成し、`local_sum`を計算します。次に、`local_sum`を`MPI_SUM`によってルートプロセスにreduceします。そして全部のプロセスの平均を`global_sum / (world_size * num_elements_per_proc)`で求めます。reduce_avgプログラムを[レポジトリ]({{ site.github.code }})の*tutorials*ディレクトリから実行しましょう。 + +``` +>>> cd tutorials +>>> ./run.py reduce_avg +mpirun -n 4 ./reduce_avg 100 +Local sum for process 0 - 51.385098, avg = 0.513851 +Local sum for process 1 - 51.842468, avg = 0.518425 +Local sum for process 2 - 49.684948, avg = 0.496849 +Local sum for process 3 - 47.527420, avg = 0.475274 +Total sum = 200.439941, avg = 0.501100 +``` + +`MPI_Reduce` について学んだので次は`MPI_Allreduce`です! + +## MPI_Allreduce +ほとんどの並列アプリケーションでは、ルートプロセスだけでなく全プロセスがreduceの結果にアクセスする必要があるでしょう。`MPI_Allgather`と`MPI_Gather`の関係のように`MPI_Allreduce`は値をreduceした結果を全プロセスに配布します。関数定義は以下の通りです。 + +```cpp +MPI_Allreduce( + void* send_data, + void* recv_data, + int count, + MPI_Datatype datatype, + MPI_Op op, + MPI_Comm communicator) +``` + +`MPI_Allreduce` は `MPI_Reduce` 同じ引数に見えますがルートプロセス IDは不要です (結果が全プロセスに配布されるため)。以下に `MPI_Allreduce` の通信パターンを図示します。 + +![MPI_Allreduce](../mpi_allreduce_1.png) + +`MPI_Allreduce`は`MPI_Reduce`した後に`MPI_Bcast`しているのと同じです。 + +## MPI_Allreduce による標準偏差の計算 - Computing standard deviation with MPI_Allreduce +計算問題の多くは、問題を解くためにreduceを何度も呼び出します。ここで例に示す例は分散している数の標準偏差を求める計算です。標準偏差とは平均値からの数値のばらつきを表す尺度で、標準偏差が低ければ低いほど数値がより近くに集まっていることを意味し、標準偏差が高ければその逆です。 + +標準偏差を求めるには、まず全ての数値の平均が必要です。次に平均からの差の2乗和を計算します。この和の平均の平方根が最終結果となります。ということは2つの和が必要ということで、2つのreduceが必要になるわけです。レッスンコードの[reduce_stddev.c]({{ site.github.code }}/tutorials/mpi-reduce-and-allreduce/code/reduce_stddev.c)でこれを示します。 + +```cpp +rand_nums = create_rand_nums(num_elements_per_proc); + +// プロセス内の合計を求める +float local_sum = 0; +int i; +for (i = 0; i < num_elements_per_proc; i++) { + local_sum += rand_nums[i]; +} + +// 平均を求めるためのグローバル和を計算する +float global_sum; +MPI_Allreduce(&local_sum, &global_sum, 1, MPI_FLOAT, MPI_SUM, + MPI_COMM_WORLD); +float mean = global_sum / (num_elements_per_proc * world_size); + +// 平均からの差の2乗和をローカルで合計する。 +float local_sq_diff = 0; +for (i = 0; i < num_elements_per_proc; i++) { + local_sq_diff += (rand_nums[i] - mean) * (rand_nums[i] - mean); +} + +// 2乗和をルートプロセスに集めて合計を取る +float global_sq_diff; +MPI_Reduce(&local_sq_diff, &global_sq_diff, 1, MPI_FLOAT, MPI_SUM, 0, + MPI_COMM_WORLD); + +// 標準偏差stddevは二乗差の平均の平方根。表示する。 +if (world_rank == 0) { + float stddev = sqrt(global_sq_diff / + (num_elements_per_proc * world_size)); + printf("Mean - %f, Standard deviation = %f\n", mean, stddev); +} +``` + +まず、各プロセスは要素の`local_sum`を計算します。そして`MPI_Allreduce` を使用してそれらを合計します。各プロセスは全ての平均がわかるようになったので、`local_sq_diff`を計算するための`mean` を計算します。そしてローカルで平均からの差の2乗和を計算すると、ルートプロセスは`MPI_Reduce`を使用して`global_sq_diff`を計算します。最後にルートプロセスはグローバル平方差の平均の平方根を取ることによって標準偏差を計算します。 + +サンプルプログラムの動作結果を示します。 + +``` +>>> ./run.py reduce_stddev +mpirun -n 4 ./reduce_stddev 100 +Mean - 0.501100, Standard deviation = 0.301126 +``` + +## 次は? +`MPI_Bcast`, `MPI_Scatter`, `MPI_Gather`, `MPI_Reduce` といった一般的な集団計算の使い方に慣れたので、これらを利用した洗練された並列アプリケーションを構築してみましょう。次回のレッスンは[MPI groups and communicators]({{ site.baseurl }}/tutorials/introduction-to-groups-and-communicators/)です。 + +全てのレッスンは、[MPIチュートリアルセクション]({{ site.baseurl }}/tutorials/)を参照してください。 diff --git a/tutorials/mpi-scatter-gather-and-allgather/index.md b/tutorials/mpi-scatter-gather-and-allgather/index.md index 1e3c92e..787e391 100644 --- a/tutorials/mpi-scatter-gather-and-allgather/index.md +++ b/tutorials/mpi-scatter-gather-and-allgather/index.md @@ -4,7 +4,7 @@ title: MPI Scatter, Gather, and Allgather author: Wes Kendall categories: Beginner MPI tags: MPI_Gather, MPI_Allgather, MPI_Scatter -translations: zh_cn +translations: zh_cn,ja_jp redirect_from: '/mpi-scatter-gather-and-allgather/' --- diff --git a/tutorials/mpi-scatter-gather-and-allgather/ja_jp.md b/tutorials/mpi-scatter-gather-and-allgather/ja_jp.md new file mode 100644 index 0000000..344bd45 --- /dev/null +++ b/tutorials/mpi-scatter-gather-and-allgather/ja_jp.md @@ -0,0 +1,154 @@ +--- +layout: post +title: MPI Scatter, Gather, Allgather +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Gather, MPI_Allgather, MPI_Scatter +redirect_from: '/mpi-scatter-gather-and-allgather/' +--- + +[前のレッスン]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/)では集団通信の基本である集団コミュニケーションルーチン`MPI_Bcast`を説明しました。今回のレッスンではさらに集団通信を学んでいきましょう。非常に重要なルーチン`MPI_Scatter`と`MPI_Gather`そして`MPI_Allgather`をみていきましょう。 + +> **Note** - 全てのコードは[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは[tutorials/mpi-scatter-gather-and-allgather/code]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code)をみてください。 + +## MPI_Scatterとは - An introduction to MPI_Scatter +`MPI_Scatter`は`MPI_Bcast`に似た集団通信ルーチンです。ルートプロセスはコミュニケータ内のすべてのプロセスにデータを送信します。ただし、`MPI_Bcast`はルートの持つ同じデータと全く同じデータをすべてのプロセスに送信していたのに対し、`MPI_Scatter`はルートの持つ配列のチャンクをそれぞれ異なるプロセスに送信します。 + +![MPI_Bcast vs MPI_Scatter](../broadcastvsscatter.png) + +`MPI_Bcast`はルートプロセス(赤)のデータを全てのプロセスにコピーしました。一方、`MPI_Scatter`は配布したい配列をプロセスランクの順に要素を分けて配布します。最初の要素 (赤) はプロセス0に配る, 2番目の要素 (緑) はプロセス1に配る、といったようにです。ルートプロセス(プロセス0)はデータの配列全体を持っており、`MPI_Scatter`は適切な要素をプロセスの受信バッファにコピーします。`MPI_Scatter`の関数定義は以下の通りです。 + +```cpp +MPI_Scatter( + void* send_data, + int send_count, + MPI_Datatype send_datatype, + void* recv_data, + int recv_count, + MPI_Datatype recv_datatype, + int root, + MPI_Comm communicator) +``` + +最初の引数`send_data`はルートプロセスにおける配布したい配列のポインタです。2番目と3番目の引数`send_count`と`send_datatype`は、各プロセスに対してどんなMPI Datatypeの要素を何個送信するかを指定します。`send_count` が1で`send_datatype`が MPI_INTならば、プロセス0は配列の最初の整数を受け取り、プロセス 1は2番目の整数を受け取ります。`send_count`が2なら、プロセス0は1,2番目の整数を担当し、プロセス1は3,4番目の整数を担当します。実際には`send_count`は配列の要素数をプロセス数で割ったものに等しいでしょう。要素数がプロセス数で割り切れない?ご心配なく。それは後で見ていきましょう。 + +後続の引数はほぼ同様です。`recv_data`は`recv_datatype`のデータ型を持つ`recv_count`個の要素を保持できるデータのバッファです。`root`と`communicator`はルートプロセスのランクと、コミュニケータです。 + +## MPI_Gatherとは - An introduction to MPI_Gather +`MPI_Gather`は`MPI_Scatter`の逆の動きをする関数です。要素を1つのプロセスから多数のプロセスに分散させるのではなく、`MPI_Gather`多数のプロセスから要素を取得して1つのプロセスに集めます。このルーチンは並列ソートや並列検索などの多くの並列アルゴリズムで使われます。 + +![MPI_Gather](../gather.png) + +`MPI_Scatter` の逆と考えれば良いです。 `MPI_Gather` は各プロセスから要素を受け取ってルートプロセスに集めます。そして要素を受け取ったプロセスの順位で並べます。`MPI_Gather` の関数宣言は `MPI_Scatter` と同じです。 + +```cpp +MPI_Gather( + void* send_data, + int send_count, + MPI_Datatype send_datatype, + void* recv_data, + int recv_count, + MPI_Datatype recv_datatype, + int root, + MPI_Comm communicator) +``` + +`MPI_Gather` では、ルートプロセスだけが有効な受信バッファを持てば良いので、ルートプロセス以外は`recv_data` に `NULL` を渡して良いです。また、*recv_count* パラメータは、全プロセスからのカウントの合計ではなく、*プロセスごとに*受信した要素のカウントであることを忘れないでください。これはMPIを触ったばかりのプログラマを混乱させます。 + +## 数値の平均 - Computing average of numbers with MPI_Scatter and MPI_Gather +レッスンの[レポジトリ]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code)では、配列内の数値の平均を計算するサンプルプログラム([avg.c]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code/avg.c))を提供しています。MPIを使用してプロセスを分割し、プロセスごとに計算を実行し、それらの小さな結果を集約して最終的な答えを出すという簡単なプログラムです。まずは動作を確認しましょう。 + +1. ルートプロセス(プロセス0) でランダムな内容のの配列を生成します。 +2. 配列をすべてのプロセスを分散します。各プロセスに同じ数のデータを割り当てます。 +3. 各プロセスは割り当てられた数値の平均を計算します。 +4. 各プロセスは結果をルートプロセスに収集します。ルートプロセスはこれらの数値の平均を計算して最終的な平均を取得します。 + +```cpp +if (world_rank == 0) { + rand_nums = create_rand_nums(elements_per_proc * world_size); +} + +// 乱数の配列を作ります。長さは固定 +float *sub_rand_nums = malloc(sizeof(float) * elements_per_proc); + +// 配列を全てのプロセスにScatterする +MPI_Scatter(rand_nums, elements_per_proc, MPI_FLOAT, sub_rand_nums, + elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD); + +// 各プロセスは自分に割り当てられた配列の平均を計算する +float sub_avg = compute_avg(sub_rand_nums, elements_per_proc); +// ルートプロセスは各プロセスの値を集める +float *sub_avgs = NULL; +if (world_rank == 0) { + sub_avgs = malloc(sizeof(float) * world_size); +} +MPI_Gather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 0, + MPI_COMM_WORLD); + +// ルートプロセスは集めた平均を計算する +if (world_rank == 0) { + float avg = compute_avg(sub_avgs, world_size); +} +``` + +最初にルートプロセスは乱数の配列を作成します。 `MPI_Scatter`によって各プロセスには`elements_per_proc`のデータが配布されます。各プロセスは自分に割り当てられた配列の平均を計算し、ルートプロセスはそれぞれの平均を収集します。ルートプロセスでの全体の平均計算処理は、非常に小さい配列に基づいて計算すれば良いです。 + +[レポジトリ]({{ site.github.code }})のチュートリアルディレクトリから avg プログラムを実行すると、出力は次のようになります。数字はランダムなので、この出力結果と異なるでしょう。 + +``` +>>> cd tutorials +>>> ./run.py avg +/home/kendall/bin/mpirun -n 4 ./avg 100 +Avg of all elements is 0.478699 +Avg computed across original data is 0.478699 +``` + +## MPI_Allgatherと平均プログラムの修正 - MPI_Allgather and modification of average program +さて、多くのプロセスが1つのプロセスに対してある送受信を行う、つまり多対1または1対多の通信パターンを実行する2つのMPIルーチンをみてきました。ところで、複数のプロセルから多くのプロセスに要素を送信できることは便利です。そう、多対多の集団通信パターンです。`MPI_Allgather`というルーチンを説明します。 + +`MPI_Allgather`は全プロセスに分散している要素を全プロセスに配布するルーチンです。つまり、`MPI_Allgather`は`MPI_Gather`を行った後に`MPI_Bcast`しているような動作をします。下図は`MPI_Allgather`を呼び出したデータの動きです。 + +![MPI_Allgather](../allgather.png) + +`MPI_Gather`と同じように、各プロセスに対して各プロセスが持っていた要素をランク順に集める。それだけです。`MPI_Allgather`の引数は`MPI_Gather`とほぼ同じですが、`MPI_Allgather`にはルートプロセスの引数は存在しません。 + +```cpp +MPI_Allgather( + void* send_data, + int send_count, + MPI_Datatype send_datatype, + void* recv_data, + int recv_count, + MPI_Datatype recv_datatype, + MPI_Comm communicator) +``` + +`MPI_Allgather`を使うように平均計算コードを修正しました。このレッスンのコードからall_avg.c]({{ site.github.code }}/tutorials/mpi-scatter-gather-and-allgather/code/all_avg.c)のソースを見ることができます。コードの主な違いは次のとおりです。 + +```cpp +// 全てのプロセスに対して各プロセスで計算した平均を集める +float *sub_avgs = (float *)malloc(sizeof(float) * world_size); +MPI_Allgather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, + MPI_COMM_WORLD); + +// 各プロセスは全ての平均を求める +float avg = compute_avg(sub_avgs, world_size); +``` + +各プロセスの平均を`MPI_Allgather`を使って全プロセスに集めます。そして、すべてのプロセスでその平均を計算して出力します。 + +``` +>>> ./run.py all_avg +/home/kendall/bin/mpirun -n 4 ./all_avg 100 +Avg of all elements from proc 1 is 0.479736 +Avg of all elements from proc 3 is 0.479736 +Avg of all elements from proc 0 is 0.479736 +Avg of all elements from proc 2 is 0.479736 +``` + +このようにall_avg.c では`MPI_Allgather`で全てのプロセスに各プロセスの平均を集めて表示します。 + +## Up next +次のレッスンでは `MPI_Gather`と`MPI_Scatter`を利用して[並列なランク計算]({{ site.baseurl }}/tutorials/performing-parallel-rank-with-mpi/)を説明します。 + +その他のレッスンは[MPI tutorials]({{ site.baseurl }}/tutorials/) にあります。 \ No newline at end of file diff --git a/tutorials/mpi-send-and-receive/index.md b/tutorials/mpi-send-and-receive/index.md index dcdce4b..c76f236 100644 --- a/tutorials/mpi-send-and-receive/index.md +++ b/tutorials/mpi-send-and-receive/index.md @@ -3,7 +3,7 @@ layout: post title: MPI Send and Receive author: Wes Kendall categories: Beginner MPI -translations: zh_cn +translations: zh_cn,ja_jp tags: MPI_Recv, MPI_Send redirect_from: '/mpi-send-and-receive/' --- diff --git a/tutorials/mpi-send-and-receive/ja_jp.md b/tutorials/mpi-send-and-receive/ja_jp.md new file mode 100644 index 0000000..fcaf21d --- /dev/null +++ b/tutorials/mpi-send-and-receive/ja_jp.md @@ -0,0 +1,200 @@ +--- +layout: post +title: MPIのsendとreceive - MPI Send and Receive +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Recv, MPI_Send +redirect_from: '/mpi-send-and-receive/' +--- + +送信と受信(send,recv)は、MPIもっとも基本的な概念です。MPIのほぼすべての機能はsend,recvをによって実装できます。このレッスンではブロッキング送受信について説明し、MPIのデータ送信の基本的な概念を説明します。 + +> **Note** - このサイトのコードはすべて[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは[tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code)にあります。 + +## MPI による送受信の概要: Overview of sending and receiving with MPI +MPIの基本的な送受信を見ていきましょう。まず、プロセス*A*は、プロセス*B*にメッセージを送信したいとします。プロセス*A*はプロセス*B*に送信したいデータをすべて1つにまとめて(パックして)バッファに格納します。このバッファは、データを1つのメッセージにまとめているのでエンベロープ(*envelopes*)と呼ばれることがあります(郵便の手紙が封筒にパックされるのと同じです)。データがバッファにパックされた後は通信デバイス(多くはネットワークでしょう)がメッセージを適切にルーティングします。メッセージにおける宛先はプロセスのランクによって定義されます。 + +メッセージは*B*にむけてルーティングされます。次にプロセス*B*は*A*からデータを受信する意思があることを明確に通知(acknowledge)する必要があります。通知が完了するとデータは送信されたことになり、プロセス*A*に対してデータが送信されたことが通知され、Aのブロッキングは完了し、次の処理に移れます。 + +次はAがBにいくつかのタイプ種類のメッセージを送信することを考えます。Bがこれらのメッセージを区別するために特別な方法を取らずとも、MPIはメッセージにID (タグ - tagsと呼ばれる)をつけた送信と受信ができます。プロセスBは特定のタグのメッセージのみを要求でき、その他の異なるタグのメッセージはBがそれを受け取る要求をするまでネットワークレイヤによってバッファリングされています。 + +MPI send関数とrecv関数の定義を見てみましょう。 + +```cpp +MPI_Send( + void* data, + int count, + MPI_Datatype datatype, + int destination, + int tag, + MPI_Comm communicator) +``` + +```cpp +MPI_Recv( + void* data, + int count, + MPI_Datatype datatype, + int source, + int tag, + MPI_Comm communicator, + MPI_Status* status) +``` + +複雑で長い引数に見えるかもしれませんが、多くのMPI関数では同様の構文が使用されるためご安心ください。最初の引数はデータバッファのアドレスです。2番目と3番目の引数は、バッファー内にある要素の数とタイプです。`MPI_Send`は正確な数の要素を送信し、`MPI_Recv`は"最低でも"count個の要素を受信します(これについては次のレッスンで詳しく説明します)。4番目と5番目の引数は、sendあるいはrecvするプロセスのランクとタグを指定します。6番目の引数はコミュニケータを指定します。recvのみに含まれる最後の引数`status`は、受信したメッセージに関する情報のポインタです。 + +## 基本的な MPI データ型 - Elementary MPI datatypes +`MPI_Send`と`MPI_Recv`関数は、メッセージのデータ構造をC言語のデータ型ではなくて、より高いレベルのデータ型で指定できます。たとえば、プロセスが1つの整数の送信する場合、カウント1と`MPI_INT`データ型を使用します。基本的なMPIデータ型と、それに相当するC言語のデータ型を以下に示します。 + +| MPIデータ型 | C言語のデータ型 | +| ---------------------- | ---------------------- | +| MPI_SHORT | short int | +| MPI_INT | int | +| MPI_LONG | long int | +| MPI_LONG_LONG | long long int | +| MPI_UNSIGNED_CHAR | unsigned char | +| MPI_UNSIGNED_SHORT | unsigned short int | +| MPI_UNSIGNED | unsigned int | +| MPI_UNSIGNED_LONG | unsigned long int | +| MPI_UNSIGNED_LONG_LONG | unsigned long long int | +| MPI_FLOAT | float | +| MPI_DOUBLE | double | +| MPI_LONG_DOUBLE | long double | +| MPI_BYTE | char | + +これらのデータ型は初心者向けの次のMPIチュートリアルでのみ使用します。基礎を学習したら複雑なメッセージを扱うための独自のMPIデータ型を作成する方法も学習します。 + +## MPI send / recv program +それではコードを見ていきます。冒頭にあるように、このサイトのコードはすべて[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは[tutorials/mpi-send-and-receive/code]({{ site.github.code }}/tutorials/mpi-send-and-receive/code)にあります。 + +最初に見るのは[send_recv.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/send_recv.c). です。プログラムのメインとなる一部は以下の通りです。 + +```cpp +// Find out rank, size +int world_rank; +MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); +int world_size; +MPI_Comm_size(MPI_COMM_WORLD, &world_size); + +int number; +if (world_rank == 0) { + number = -1; + MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); +} else if (world_rank == 1) { + MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, + MPI_STATUS_IGNORE); + printf("Process 1 received number %d from process 0\n", + number); +} +``` + +`MPI_Comm_rank`と`MPI_Comm_size`はワールドサイズとプロセスのランクを得るための関数です。プロセス0は整数データを-1に初期化し、この値をプロセス1に送信します。ステートメントでわかるように、プロセス1は数値を受信するために`else if`で分岐して、受信した値も出力します。送受信したいのは1つのINTだけなので、各プロセスは1つの`MPI_INT`の送信と受信を行います。また、メッセージを識別するためにタグ番号0を指定しました。送信されるメッセージの種類は1種類なのでプロセスはタグ番号に定義済みの定数`MPI_ANY_TAG`を使用してもよいです。 + +サンプルコードの全文は[GitHub]({{ site.github.repo }}) で確認できますし、`run.py` を使って実行することもできます。 + +``` +>>> git clone {{ site.github.repo }} +>>> cd mpitutorial/tutorials +>>> ./run.py send_recv +mpirun -n 2 ./send_recv +Process 1 received number -1 from process 0 +``` + +プロセス1はプロセス0から-1を受け取りましたことがわかります。 + +## MPI ping - MPI ping pong program +次の例はpingプログラムです。この例では、プロセスは`MPI_Send`と`MPI_Recv`を利用して停止するまでメッセージを送受信します。[ping_pong.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/ping_pong.c)を参照してください。コードのメイン部分は次の通りです。 + +```cpp +int ping_pong_count = 0; +int partner_rank = (world_rank + 1) % 2; +while (ping_pong_count < PING_PONG_LIMIT) { + if (world_rank == ping_pong_count % 2) { + // Increment the ping pong count before you send it + ping_pong_count++; + MPI_Send(&ping_pong_count, 1, MPI_INT, partner_rank, 0, + MPI_COMM_WORLD); + printf("%d sent and incremented ping_pong_count " + "%d to %d\n", world_rank, ping_pong_count, + partner_rank); + } else { + MPI_Recv(&ping_pong_count, 1, MPI_INT, partner_rank, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("%d received ping_pong_count %d from %d\n", + world_rank, ping_pong_count, partner_rank); + } +} +``` + +このコードは2つのプロセスのみで実行されることを想定します。プロセスは最初に簡単な演算で相手のランクを決定します。`ping_pong_count`は0で初期化し、プロセスの各送信ステップで+1します。そして、送信側と受信側を交互に担当します(訳註:一般的なpingと違い、互いに自発的にフレームを送ることに注意)。最後に、limitの回数に達すると(私のコードでは10)プロセスは動作を停止します。出力は次のようになります。 + +``` +>>> ./run.py ping_pong +0 sent and incremented ping_pong_count 1 to 1 +0 received ping_pong_count 2 from 1 +0 sent and incremented ping_pong_count 3 to 1 +0 received ping_pong_count 4 from 1 +0 sent and incremented ping_pong_count 5 to 1 +0 received ping_pong_count 6 from 1 +0 sent and incremented ping_pong_count 7 to 1 +0 received ping_pong_count 8 from 1 +0 sent and incremented ping_pong_count 9 to 1 +0 received ping_pong_count 10 from 1 +1 received ping_pong_count 1 from 0 +1 sent and incremented ping_pong_count 2 to 0 +1 received ping_pong_count 3 from 0 +1 sent and incremented ping_pong_count 4 to 0 +1 received ping_pong_count 5 from 0 +1 sent and incremented ping_pong_count 6 to 0 +1 received ping_pong_count 7 from 0 +1 sent and incremented ping_pong_count 8 to 0 +1 received ping_pong_count 9 from 0 +1 sent and incremented ping_pong_count 10 to 0 +``` + +出力はプロセススケジューリングのため異なる可能性があります。ただし、出力が例と違ってもプロセス0とプロセス1は、交互に`ping_pong_count`ことが読み取れるでしょう。 + +## Ring Program +`MPI_Send`と`MPI_Recv`を使って2つ以上のプロセスで通信することを考えましょう。この例では、値をすべてのプロセス上をリング状に流れていきます。[ring.c]({{ site.github.code }}/tutorials/mpi-send-and-receive/code/ring.c)を見てください。コードのメイン部分は次のようになります。 + +```cpp +int token; +if (world_rank != 0) { + MPI_Recv(&token, 1, MPI_INT, world_rank - 1, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("Process %d received token %d from process %d\n", + world_rank, token, world_rank - 1); +} else { + // ランク0はトークンを-1で初期化する + token = -1; +} +MPI_Send(&token, 1, MPI_INT, (world_rank + 1) % world_size, + 0, MPI_COMM_WORLD); + +// ここでプロセス0はリンク上の最後の受信処理を行います +if (world_rank == 0) { + MPI_Recv(&token, 1, MPI_INT, world_size - 1, 0, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + printf("Process %d received token %d from process %d\n", + world_rank, token, world_size - 1); +} +``` + +リングプログラムはプロセス0で値を初期化し、その値を次のプロセスに渡します。プロセス0が最後のプロセスから値を受信するとプログラムは終了します。デッドロックが発生しないように特別なロジックになっています。プロセス0は(最後のプロセスから)値をブロッキング受信する前に、最初の送信を完了していることが保証されます。他のすべてのプロセスはリングに沿って値を渡します。`MPI_Recv`(隣接するランクの低いプロセスから受信)で値を受け取り、次に`MPI_Send`(隣接するランクの高いプロセスに値を送信) を呼び出します。メッセージが送信されるまでブロックします。このため、printfは値が渡される順序で実行されます。5つのプロセスを使用する場合、出力は次のようになりました。 + +``` +>>> ./run.py ring +Process 1 received token -1 from process 0 +Process 2 received token -1 from process 1 +Process 3 received token -1 from process 2 +Process 4 received token -1 from process 3 +Process 0 received token -1 from process 4 +``` + +プロセス0は最初にプロセス1に-1を送信します。この値(トークン)はプロセス0に戻るまでリング状に渡されています。 + +## Up next + +`MPI_Send`と`MPI_Recv`の基本を理解したのでこれらの関数についてもう少し詳しく見ていきます。次のレッスンは、[how to probe and dynamically receive messages]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/)です。[MPI tutorials]({{ site.baseurl }}/tutorials/)をMPIレッスンの完全なリファレンスとして活用してください。 + +困っていますか?混乱していますか?お気軽に下記にコメントを残してください。私や他の読者がお役に立てるかもしれません。 diff --git a/tutorials/performing-parallel-rank-with-mpi/index.md b/tutorials/performing-parallel-rank-with-mpi/index.md index caad352..607a71e 100644 --- a/tutorials/performing-parallel-rank-with-mpi/index.md +++ b/tutorials/performing-parallel-rank-with-mpi/index.md @@ -4,12 +4,13 @@ title: Performing Parallel Rank with MPI author: Wes Kendall categories: Beginner MPI tags: MPI_Type_size -translations: zh_cn +translations: zh_cn,ja_jp redirect_from: '/performing-parallel-rank-with-mpi/' --- In the [previous lesson]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/), we went over `MPI_Scatter`, `MPI_Gather`, and `MPI_Allgather`. We are going to expand on basic collectives in this lesson by coding a useful function for your MPI toolkit - parallel rank. + > **Note** - All of the code for this site is on [GitHub]({{ site.github.repo }}). This tutorial's code is under [tutorials/performing-parallel-rank-with-mpi/code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code). ## Parallel rank - problem overview diff --git a/tutorials/performing-parallel-rank-with-mpi/ja_jp.md b/tutorials/performing-parallel-rank-with-mpi/ja_jp.md new file mode 100644 index 0000000..5ed944d --- /dev/null +++ b/tutorials/performing-parallel-rank-with-mpi/ja_jp.md @@ -0,0 +1,199 @@ +--- +layout: post +title: 並列ランク問題 - Performing Parallel Rank with MPI +author: Wes Kendall +categories: Beginner MPI +tags: MPI_Type_size +translations: zh_cn +redirect_from: '/performing-parallel-rank-with-mpi/' +--- + +[前のレッスン]({{ site.baseurl }}/tutorials/mpi-scatter-gather-and-allgather/)では + `MPI_Scatter`, `MPI_Gather`, `MPI_Allgather`を紹介しました。このレッスンでは、MPIの便利なルーチンである並列ランク(parallel rank)を実装して集団通信への理解を深めていきましょう。 + +> **Note** - 全てのコードは[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは [tutorials/performing-parallel-rank-with-mpi/code]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)にあります。 + +## 問題概要 - Parallel rank - problem overview +すべてのプロセスがローカル メモリにただ1つの数値を持っています。各プロセスは自分の持っている数値が全てのプロセスの中で何番目に小さい値を持っているのか知りたいです。このシナリオは、ユーザーがMPIクラスター内のプロセッサのベンチマークを行っており自分のプロセッサが他のプロセッサと比較してどのくらい高速であるかを知りたいケースなどに利用されます。他にもタスクのスケジュール設定などに使用できるでしょう。数値がプロセス全体に分散していると全ての数値の中での順序を見つけるのは難しいように思えます。この問題を並列ランク問題と呼び、このレッスンで解決しましょう。 + +具体例を図で示します。 + +![Parallel Rank](../parallel_rank_1.png) + +4つのプロセスがあり、0から3のラベルでそれぞれを区別します。順番に5、2、7、4の4つの数字を持っているとしましょう。並列ランクアルゴリズムを実行すると全体での順番がわかるのでそれぞれは2,0,3,1の4つの数字を持つことになります。(訳注:0-indexedです) + +## 並列ランクAPI定義 +これを実現するためにがなにが必要かを考えましょう。すべての数値を集めること、その数値の順番を返す必要があります。さらに使用されているコミュニケータやランク付けされる数値のデータ型なども必要になります。ランク関数のプロトタイプを次のようにしましょう。 + +```cpp +TMPI_Rank( + void *send_data, + void *recv_data, + MPI_Datatype datatype, + MPI_Comm comm) +``` + +`TMPI_Rank`は、データ型の数値を1つ含む`send_data`バッファを受け取ります。`recv_data`は、`send_data`の各プロセスの順位を受け取る変数です。`comm`変数はプロセスのコミュニケータです。 + +> **Note** - +> MPI標準では、ユーザー関数と MPI関数が混同しないように、MPI関数には`MPI_`という名前づけがされています。したがって、このレッスンではさらに`T`を追加しています。 + +## 並列ランク問題の解き方 - Solving the parallel rank problem +API定義ができたので、どのように解くかを考えましょう。並列ランク問題を解決するためには全てのプロセスから集めた数値のソートが必要です。このソートは各数字の順番を知るために必要で、いくつかのアプローチで実現できます。最も簡単な方法は各プロセスの数字を1つのプロセスに集め、そのプロセスでソートすれば良いでしょう。サンプル コード ([tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c)) では`gather_numbers_to_root`関数はすべての数字をルート プロセスに集める役割を担います。 + +```cpp +// ルートプロセスに数値を集めます。 +// ルートプロセスは結果の(ランクの)配列を返します。他のプロセスにはNULLを返します。 +void *gather_numbers_to_root(void *number, MPI_Datatype datatype, + MPI_Comm comm) { + int comm_rank, comm_size; + MPI_Comm_rank(comm, &comm_rank); + MPI_Comm_size(comm, &comm_size); + + // ルートプロセスでは必要なバッファを用意します。データ型のサイズを配慮します + int datatype_size; + MPI_Type_size(datatype, &datatype_size); + void *gathered_numbers; + if (comm_rank == 0) { + gathered_numbers = malloc(datatype_size * comm_size); + } + + // 全ての数値をルートプロセスに集めます + MPI_Gather(number, 1, datatype, gathered_numbers, 1, + datatype, 0, comm); + + return gathered_numbers; +} +``` + +`gather_numbers_to_root`関数はルートに送りたい数値(`send_data`変数)と数値の`datatype`および`comm`コミュニケータを引数で受け取ります。ルート・プロセスは`comm_size`の数値を受け取ればいいとわかるので`datatype_size * comm_size`の長さの配列をメモリ確保します。`datatype_size`変数は、このチュートリアルで初めて使う`MPI_Type_size`を使用して収集されます。私たちの今回のプログラムは`MPI_INT`と`MPI_FLOAT`のみを使用しますが、この関数を使うと様々なサイズのデータ型をサポートするように拡張することができます。これで数値が集まったので`MPI_Gather`でルートプロセスに数を集めます。次はルートプロセスで数をソートし、ランクを決定します。 + +## ソートとその所有権の維持 - Sorting numbers and maintaining ownership +ソートの処理自身は難しくありません。C標準ライブラリには`qsort` などの一般的なソートアルゴリズムが用意されています。ただし、並列ランク問題ソートでは数字を送信したプロセスのランクをルートプロセスのソートの間で維持する必要あることに注意します。ルートプロセス対して数字だけでは数字の順位をどのプロセスに返せばいいかわからないのです。 + +数字とそれに対応する送信元のプロセスのランク(つまり所有権)を保持する構造体を定義しましょう。 + +```cpp +// 値とコミュニケータランクを保持する +// この構造体はソートをされてもランクの情報を失わない +typedef struct { + int comm_rank; + union { + float f; + int i; + } number; +} CommRankNumber; +``` + +構造体`CommRankNumber`はソートする数値を保持し、対応するプロセスのコミュニケータランクを保持します。ここで数値はfloatまたはintの可能性があるので、unionで両方を保持できるようにしていることに注意してください。次にこの構造体をソートする`get_ranks`関数を考えていきましょう。 + +```cpp +// この関数はルートプロセスに値を集めて、その順位を元のプロセスに返します +// この関数はルートでのみ実行されます。 +int *get_ranks(void *gathered_numbers, int gathered_number_count, + MPI_Datatype datatype) { + int datatype_size; + MPI_Type_size(datatype, &datatype_size); + + // 集めた値をCommRankNumbersに保持します。 + // これによりソートしてもコミュニケータランクを失いません。 + CommRankNumber *comm_rank_numbers = malloc( + gathered_number_count * sizeof(CommRankNumber)); + int i; + for (i = 0; i < gathered_number_count; i++) { + comm_rank_numbers[i].comm_rank = i; + memcpy(&(comm_rank_numbers[i].number), + gathered_numbers + (i * datatype_size), + datatype_size); + } + + // ランクの情報を持ったまま値をソートする + if (datatype == MPI_FLOAT) { + qsort(comm_rank_numbers, gathered_number_count, + sizeof(CommRankNumber), &compare_float_comm_rank_number); + } else { + qsort(comm_rank_numbers, gathered_number_count, + sizeof(CommRankNumber), &compare_int_comm_rank_number); + } + + // ソートが完了したので値を戻すための結果の配列を用意する。iにはプロセスiの順位が含まれる。 + int *ranks = (int *)malloc(sizeof(int) * gathered_number_count); + for (i = 0; i < gathered_number_count; i++) { + ranks[comm_rank_numbers[i].comm_rank] = i; + } + + // comm_rank_numbersを解放する + free(comm_rank_numbers); + return ranks; +} +``` +`get_ranks`は`CommRankNumber`構造体の配列を作成して、各プロセスのランクを設定します。`MPI_FLOAT`と`MPI_INT`である場合で違ったsort関数の呼び出しを行います。 ([tmpi_rank.c]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/tmpi_rank.c)を参照してください)。 + +ソートしたら順番を格納した配列を作成して各々のプロセスに正しく戻せるようにする必要があります。ソートされた`comm_rank_numbers`を順に見ていき、戻すための配列`ranks`を作ります。 + +## 全てを一緒にする - Putting it all together +さて、2つの重要なルーチンが実装できたのでこれらをまとめて `TMPI_Rank` を作りましょう。ルートプロセスに各プロセスの数字を集めてから、計算した順位を各プロセスに戻します。このコードを以下に示します。 +```cpp +// datatype型のsend_dataの順位を取得する。 +// ランクはrecv_dataで戻ってくるdatatype型である。 +int TMPI_Rank(void *send_data, void *recv_data, MPI_Datatype datatype, + MPI_Comm comm) { + // datatypeがMPI_INTかMPI_FLOATであるかを確認します + if (datatype != MPI_INT && datatype != MPI_FLOAT) { + return MPI_ERR_TYPE; + } + + int comm_size, comm_rank; + MPI_Comm_size(comm, &comm_size); + MPI_Comm_rank(comm, &comm_rank); + + // 順位を計算するために値をルートプロセスに集めます。 + // そして、ソートして結果を求め、Scatterで順位情報を戻します。 + // ルートプロセスにはプロセス0を使います + void *gathered_numbers = gather_numbers_to_root(send_data, datatype, + comm); + + // 各プロセスの順位を計算する + int *ranks = NULL; + if (comm_rank == 0) { + ranks = get_ranks(gathered_numbers, comm_size, datatype); + } + + // Scatterする + MPI_Scatter(ranks, 1, MPI_INT, recv_data, 1, MPI_INT, 0, comm); + + // clean up + if (comm_rank == 0) { + free(gathered_numbers); + free(ranks); + } +} +``` + +TMPI_Rank関数は`gather_numbers_to_root`と`get_ranks`の2つの関数を使用して各の順位を計算します。この関数は`MPI_Scatter`によって各プロセスに順位を戻します。 + +全体のデータフローを図解します。 + +![Parallel Rank](../parallel_rank_2.png) + +もし、これに関する質問があれば以下を参照して質問してください。 + +## 実行 - Running our parallel rank algorithm +このアルゴリズムのサンプルプログラムがあります。[レッスンコード]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code)の[random_rank.c file]({{ site.github.code }}/tutorials/performing-parallel-rank-with-mpi/code/random_rank.c)で確認できます。 + +このサンプルプログラムは各プロセスで乱数を生成した後、各順位を取得するために`TMPI_Rank`の呼び出しします。[レポジトリ]({{ site.github.code }})のチュートリアルディレクトリから random_rank プログラムを実行すると、出力は次のようになります。 + +``` +>>> cd tutorials +>>> ./run.py random_rank +mpirun -n 4 ./random_rank 100 +Rank for 0.242578 on process 0 - 0 +Rank for 0.894732 on process 1 - 3 +Rank for 0.789463 on process 2 - 2 +Rank for 0.684195 on process 3 - 1 +``` + +## Up next +次はさらに高度な集団通信について説明します。次のレッスンは、[using MPI_Reduce and MPI_Allreduce to perform number reduction]({{ site.baseurl }}/tutorials/mpi-reduce-and-allreduce/)です。 + +[MPI tutorials]({{ site.baseurl }}/tutorials/) に全てのレッスンの目次があります。 \ No newline at end of file diff --git a/tutorials/point-to-point-communication-application-random-walk/index.md b/tutorials/point-to-point-communication-application-random-walk/index.md index db510f3..371da4f 100644 --- a/tutorials/point-to-point-communication-application-random-walk/index.md +++ b/tutorials/point-to-point-communication-application-random-walk/index.md @@ -4,7 +4,7 @@ title: Point-to-Point Communication Application - Random Walk author: Wes Kendall categories: Beginner MPI tags: -translations: zh_cn +translations: zh_cn,ja_jp redirect_from: '/point-to-point-communication-application-random-walk/' --- diff --git a/tutorials/point-to-point-communication-application-random-walk/ja_jp.md b/tutorials/point-to-point-communication-application-random-walk/ja_jp.md new file mode 100644 index 0000000..61bd01e --- /dev/null +++ b/tutorials/point-to-point-communication-application-random-walk/ja_jp.md @@ -0,0 +1,302 @@ +--- +layout: post +title: ポイントツーポイント通信アプリケーション ランダムウォーク - Point-to-Point Communication Application - Random Walk +author: Wes Kendall +categories: Beginner MPI +tags: +redirect_from: '/point-to-point-communication-application-random-walk/' +--- + +[sending and receiving tutorial]({{ site.baseurl }}/tutorials/mpi-send-and-receive/)と[MPI_Probe and MPI_Status lesson]({{ site.baseurl }}/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/) の レッスンで紹介された概念のいくつかを使用して実際のアプリケーションを作成しましょう。これは「ランダムウォーク」と呼ばれるシミュレートションです。 + + +> **Note** - このサイトのコードはすべて[GitHub]({{ site.github.repo }})にあります。このレッスンのコードは[tutorials/point-to-point-communication-application-random-walk/code]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code)にあります。 + +ランダムウォークの問題設定を説明します。この問題ではある数直線の*Min*、*Max*とおよびランダムウォーカー*W*が与えられます。ウォーカー*W*は適当なの長さのランダムウォークを右に*S*回実行します。右端に到達したら、プロセスは左端に戻ります(訳注: If the process goes out of bounds, it wraps back around. で折り返すとあるが、スタートに戻る実装です)。*W*は一度に右か1ユニットしか移動できません(訳注: to the right or left at a timeとありますが、右にだけ動く実装です)。 + +![Random walk illustration](../random_walk.png) + +この動作はとても基本的ですが、ランダムウォークの並列化というのはさまざまな並列アプリケーションのシミュレートで用いられる手法です。このことは最後に詳しく説明します。まずは、ランダムウォークの問題を並列化する方法を考えます。 + +## ランダムウォーキング問題の並列化 - Parallelization of the random walking problem +多くの並列プログラミングにとって最初に考えなければいけないのは、各プロセスがが持つ領域の分割です。ランダムウォークは*Max - Min + 1* の大きさの1次元の領域を考えます(*Max*と*Min*は含まれて良い値です)。ウォーカーのステップを整数とて考えると、各領域をほぼ等しいサイズに分割することができるでしょう。例えば*Min*が0、*Max*が20で、分割するプロセスが4つの場合はドメインを次のように分割できます。 + +![Domain decomposition example](../domain_decomp.png) + +最初の3プロセス(プロセス0,1,2)は5つのユニットを管理します。最後のプロセス3は合計6つのユニットを管理します。これは、同じように分割された5つのユニットに加えて残りの1つのユニットです。ドメインを分割したらアプリケーションはウォーカーを初期化します。ウォーカーはランダムなウォークサイズでS回のウォークを実行します。今説明した分割においてウォーカーがプロセス0からサイズ6のウォークを実行すると次のようになります。(訳注:サイズ6のウォークとは、6ユニット移動する動作です) + +1. プロセス0からウォーカーは6のステップします。値が4になった時プロセス0の境界に達しています。プロセス0はプロセス1にウォーカーを渡します。 + +2. プロセス1はウォーカーを受け取ったあと、合計が6に達するまでウォークを続けます。このサイクルを1つとしてウォーカーは新しいランダムウォークを試行します。 + +![Random walk, step one](../walk_step_one.png) + +*W*はプロセス0からプロセス1に1回だけ移動しましたが*W*がさらに長い距離を移動する時はドメイン内のより多くのプロセスを通過する必要がある可能性があります。 + +## CMPI_Send と MPI_Recv を使用したコーディング - oding the application using MPI_Send and MPI_Recv +この動作を`MPI_Send` と`MPI_Recv`を使用して書いていきましょう。まず、前にプログラムの動きを整理します。 + +* プロセスはドメイン内の自分の領域を識別します +* 各プロセスは*N*個のウォーカーを初期化します。これらはすべてそのプロセスの最初の値から開始されます。(訳注: 5-9を管理するプロセスであれば、このプロセスに割り当てられた全てのウォーカーは5にいることにします) +* 各ウォーカーはオブジェクトです。ウォーカーの現在位置と残歩数という 2 つのintを持ちます。 +* ウォーカーたちはドメイン内でウォークを開始し、ウォークを完了するまで他のプロセスへの移動を行います。 +* すべてのウォーカーが終了するとそのターンは終了します。 + +まずはプロセスが領域を分割するコードを書きます。この関数はドメインの合計サイズを受け取りMPIプロセスが担当する適切なサイズの分割された領域を決定します。そして残ってしまった領域を最後のプロセスに担当させます。簡単のためエラーが見つかった場合は`MPI_Abort`を呼び出すことにします。この関数`decompose_domain`を示します。 + +```cpp +void decompose_domain(int domain_size, int world_rank, + int world_size, int* subdomain_start, + int* subdomain_size) { + if (world_size > domain_size) { + // 領域の数が用意できるプロセスの数より大きいならエラーとします + MPI_Abort(MPI_COMM_WORLD, 1); + } + *subdomain_start = domain_size / world_size * world_rank; + *subdomain_size = domain_size / world_size; + if (world_rank == world_size - 1) { + // 残りを最後のプロセスに割り当てます + *subdomain_size += domain_size % world_size; + } + } +``` + +関数は余りがある場合を配慮しながらドメインを均等な領域に分割します。そして関数はその領域の開始位置とサブドメインのサイズを返します。 + +ウォーカーは次の構造体で定義します。 + +```cpp +typedef struct { + int location; + int num_steps_left_in_walk; +} Walker; +``` + +次に`initialize_walkers`という初期化関数を考えます。この関数はそのプロセスの領域を取得し、そのプロセスが担当するウォーカーを配列`incoming_walkers`に追加します (このアプリケーションは C++ で書かれています)。 + +```cpp +void initialize_walkers(int num_walkers_per_proc, int max_walk_size, + int subdomain_start, int subdomain_size, + vector* incoming_walkers) { + Walker walker; + for (int i = 0; i < num_walkers_per_proc; i++) { + // Initialize walkers in the middle of the subdomain + // 訳注: "in the mid"とあるが、ウォーカーは領域の最初から開始する + walker.location = subdomain_start; + walker.num_steps_left_in_walk = + (rand() / (float)RAND_MAX) * max_walk_size; + incoming_walkers->push_back(walker); + } +} +``` + +初期化の次はウォーカーを前進させる関数です。この関数はウォーカーが歩行を完了するまで前進させます。ウォーカーが自分の管理する領域の端より進もうとしたら、そのプロセスの配列`outgoing_walkers`に追加します。 + +```cpp +void walk(Walker* walker, int subdomain_start, int subdomain_size, + int domain_size, vector* outgoing_walkers) { + while (walker->num_steps_left_in_walk > 0) { + if (walker->location == subdomain_start + subdomain_size) { + // Take care of the case when the walker is at the end + // of the domain by wrapping it around to the beginning + if (walker->location == domain_size) { + walker->location = 0; + } + outgoing_walkers->push_back(*walker); + break; + } else { + walker->num_steps_left_in_walk--; + walker->location++; + } + } +} +``` + +初期化関数 (`incoming_walkers`にデータを追加する) とウォーキング関数 (`outgoing_walkers`にデータを追加する)ができたので、あとは`outgoing_walkers`を次のプロセスに送る関数と受け取る関数の2つがあれば良いです。まずは`outgoing_walkers`を次に送る関数を見ていきます。 + +```cpp +void send_outgoing_walkers(vector* outgoing_walkers, + int world_rank, int world_size) { + // 配列のデータをMPI_BYTEsのバイトデータとして次のプロセスに送ります + // 右端のプロセスはプロセス0にデータを送ることに注意します + MPI_Send((void*)outgoing_walkers->data(), + outgoing_walkers->size() * sizeof(Walker), MPI_BYTE, + (world_rank + 1) % world_size, 0, MPI_COMM_WORLD); + + // 次のプロセスにデータを送ったので配列はクリアします + outgoing_walkers->clear(); +} +``` + +次は受け取る関数です。受け取るウォーカーの数が事前にわからないため`MPI_Probe`を使用する必要があります。 + +```cpp +void receive_incoming_walkers(vector* incoming_walkers, + int world_rank, int world_size) { + MPI_Status status; + + // 前のプロセスからのデータを受け取ります + // プロセス0は右端のプロセスからのデータを受け取ります + int incoming_rank = + (world_rank == 0) ? world_size - 1 : world_rank - 1; + MPI_Probe(incoming_rank, 0, MPI_COMM_WORLD, &status); + + // そして受け取るべきデータのサイズ分のメモリを確保します + int incoming_walkers_size; + MPI_Get_count(&status, MPI_BYTE, &incoming_walkers_size); + incoming_walkers->resize( + incoming_walkers_size / sizeof(Walker)); + MPI_Recv((void*)incoming_walkers->data(), incoming_walkers_size, + MPI_BYTE, incoming_rank, 0, MPI_COMM_WORLD, + MPI_STATUS_IGNORE); +} +``` + +これでプログラムの主な機能を実装しました。次のように処理を作っていきましょう。 + +1. ウォーカーを初期化する。 +2. `walk` 関数でウォーカーを進める。 +3. `outgoing_walkers`にあるウォーカーを次に送る +4. 新しいウォーカーは`incoming_walkers`に入れる。 +5. すべてのウォーカーが終了するまで、ステップ2から4を繰り返す。 + +以下の通りとなるが、まずは5で行いたいすべてのウォーカーの終了判定は気にしないものとします。このコードには誤りがあるのでそれに留意してご覧ください。 + +```cpp +// このプロセスの領域を決める +decompose_domain(domain_size, world_rank, world_size, + &subdomain_start, &subdomain_size); + +// このプロセスのウォーカーを配置する(incoming_walksに入れる) +initialize_walkers(num_walkers_per_proc, max_walk_size, + subdomain_start, subdomain_size, + &incoming_walkers); + +while (!all_walkers_finished) { // 全てのウォーカーが終了するまで + // このプロセス内全てのウォーカーの動きを実施 + for (int i = 0; i < incoming_walkers.size(); i++) { + walk(&incoming_walkers[i], subdomain_start, subdomain_size, + domain_size, &outgoing_walkers); + } + + // 外に出ていくウォーカーの処理 + send_outgoing_walkers(&outgoing_walkers, world_rank, + world_size); + + // 新しく入ってきたウォーカーの処理 + receive_incoming_walkers(&incoming_walkers, world_rank, + world_size); +} +``` + +良さそうに見えますか?しかし、これはデッドロックが起こりやすいコードとなっています。 + +## デッドロックとその予防方法 - Deadlock and prevention +Wikipediaによれば、デッドロックとは「2つ以上のプロセスがそれぞれ他のプロセスのリソース解放を待つ。あるいは2つ以上のプロセスが循環的にリソースを待っている。こういった特定の状態のこと」です。上記のコードは`MPI_Send`の循環的なチェーンが発生します。 + +![Deadlock](../deadlock-1.png) + +とはいえ、実施には上記コードはデッドロックはほぼ発生*しません*。`MPI_Send`はブロッキング関数ですが、[MPI specification](http://www.amazon.com/gp/product/0262692163/ref=as_li_tf_tl?ie=UTF8&tag=softengiintet-20&linkCode=as2&camp=217145&creative=399377&creativeASIN=0262692163)では、`MPI_Send` は*送信バッファが確保できるまで*ブロックすると記載されています。MPI_Sendはネットワークがメッセージをバッファできるようになったときにブロッキングが終わります。つまりネットワークがバッファできなければそれに対応するreceiveが呼ばれるまでsendはブロックされるということです。今回のケースでは非常に小さな送信に対して非常に頻繁に受信を呼び出すコードであるためデッドロックはほぼないでしょう。しかし、全てのケースでネットワークバッファが十分に大きいと想定して並列プログラミングを書いてはいけません。 + +このレッスンでは `MPI_Send` と `MPI_Recv` だけに焦点をあてています。送受信のデッドロックを回避するベストの方法は送信と受信が一致するようにメッセージングを順序付けることです。いくつかの方法が考えられますが、1つとしては偶数番目のプロセスが受信の前に送信を送り、奇数番目のプロセスがその逆を行うようにすることです。もし、2つの実行ステージで考えると次のようなイメージとなります。 + +![Deadlock prevention](../deadlock-2.png) + +> **Note** - これを1プロセスの環境下で実行するとデッドロックが発生する例外があります。 + +奇数個のプロセスでもこれは機能するのでしょうか?3つのプロセスで同様の図をもう一度見てみましょう。 + +![Deadlock solution](../deadlock-3.png) + +3つのパターン全てにおいて、少なくとも1つの`MPI_Send`と`MPI_Recv`が存在するパスがあるので、デッドロックの発生を心配する必要はないとわかりました。 + +## 終了の判断 - Determining completion of all walkers +それでは、すべてのウォーカーが終了したかを判断するステップを考えます。ウォーカーはランダムな距離をいどうするため、あるウォーカーが移動を終了することは全てのプロセスで起こり得ることに注意します。そのため、何らかの追加通信を行わずに全プロセスがすべての歩行者が終了を知ることは困難です。考えられる解決策の1つはプロセス0がすべての歩行者を追跡し、他のすべてのプロセスに終了を伝えることが考えられます。ただし、この解決策は各移動においてプロセス0以外のプロセスはプロセス0に完了した歩行者を報告し、さらにさまざまな種類の受信メッセージを処理する必要があるため非常に面倒ですね。 + +このレッスンではもっとシンプルに考えます。どのウォーカーも移動できる最大距離と、ある送受信のプロセスのペアで移動できる最小の合計サイズ(サブドメインのサイズ)がわかっています。このため、各プロセスが終了までに行うべき送受信の量が定まります(訳注:全てのプロセスが最大の距離を行うとき、というのがこれに当てはまります)。この特徴とデッドロックを回避する戦略を用いると以下のように考えられます。 + +```cpp +// このプロセスの領域を決める +decompose_domain(domain_size, world_rank, world_size, + &subdomain_start, &subdomain_size); + +// このプロセスのウォーカーを配置する(incoming_walksに入れる) +initialize_walkers(num_walkers_per_proc, max_walk_size, + subdomain_start, subdomain_size, + &incoming_walkers); + +// 全てのウォーカーが終了するのに必要なsend/recv数を計算 +int maximum_sends_recvs = + max_walk_size / (domain_size / world_size) + 1; +for (int m = 0; m < maximum_sends_recvs; m++) { + // このプロセス内全てのウォーカーの動きを実施 + for (int i = 0; i < incoming_walkers.size(); i++) { + walk(&incoming_walkers[i], subdomain_start, subdomain_size, + domain_size, &outgoing_walkers); + } + + // 偶数・奇数に基づいた順序で送受信を行う + if (world_rank % 2 == 0) { + send_outgoing_walkers(&outgoing_walkers, world_rank, + world_size); + receive_incoming_walkers(&incoming_walkers, world_rank, + world_size); + } else { + receive_incoming_walkers(&incoming_walkers, world_rank, + world_size); + send_outgoing_walkers(&outgoing_walkers, world_rank, + world_size); + } +} +``` + +## Running the application + +レッスンのコードは[ここ]({{ site.github.code }}/tutorials/point-to-point-communication-application-random-walk/code)で見ることができます. 他のレッスンとは異なり、このコードはC++を使用しています。[installing MPICH2]({{ site.baseurl }}/tutorials/installing-mpich2/)の際に、C++ MPIコンパイラもインストールしました(明示的に設定した場合を除く)。MPICH2をローカル・ディレクトリにインストールした場合はMPICXX環境変数が正しいmpicxxコンパイラーを指すように設定されていることを確認してください。 + +私のコードでは、アプリケーションの実行スクリプトにプログラムのデフォルト値を設定しています。ドメインサイズは 100、最大ウォークサイズは 500、プロセスあたりのウォーカー数は 20 です。random_walkプログラムを[レポジトリ]({{ site.github.code }})の*tutorials*ディレクトリから実行すると、5つのプロセスが生成され、このような出力が得られます。 + +``` +>>> cd tutorials +>>> ./run.py random_walk +mpirun -n 5 ./random_walk 100 500 20 +Process 2 initiated 20 walkers in subdomain 40 - 59 +Process 2 sending 18 outgoing walkers to process 3 +Process 3 initiated 20 walkers in subdomain 60 - 79 +Process 3 sending 20 outgoing walkers to process 4 +Process 3 received 18 incoming walkers +Process 3 sending 18 outgoing walkers to process 4 +Process 4 initiated 20 walkers in subdomain 80 - 99 +Process 4 sending 18 outgoing walkers to process 0 +Process 0 initiated 20 walkers in subdomain 0 - 19 +Process 0 sending 17 outgoing walkers to process 1 +Process 0 received 18 incoming walkers +Process 0 sending 16 outgoing walkers to process 1 +Process 0 received 20 incoming walkers +``` + +プロセスはすべてのウォーカーの送受信を終える(と想定される回数)まで出力を続けます。 + +## So what's next? +いかがでしょうか。もしこのレッスンを心地よいと感じたなら良いことです。このアプリケーションは、初めての実際のアプリケーションとしてはかなり発展的なものです。 + +次回のレッスンからはMPIでの*集団通信*について学習します。まず、[MPI Broadcast]({{ site.baseurl }}/tutorials/mpi-broadcast-and-collective-communication/)を学習します。その他のレッスンは[MPI tutorials]({{ site.baseurl }}/tutorials/)をみてください。 + +冒頭で、このプログラムのコンセプト(ランダムウォーク)は多くの並列プログラムにも応用できることをお伝えしました。もっと学びたい人のために、以下に追加資料を掲載したのでお楽しみください :-) + +## 追加資料 - ランダムウォーキングと並列粒子追跡の類似性 Additional reading - Random walking and its similarity to parallel particle tracing +ランダムウォーク問題は、一見単純なものに見えますが実は多くの種類の並列アプリケーションのシミュレーションの基礎となります。科学分野の一部の並列アプリケーションでは、多くの種類のランダムな送受信が必要です。1つのアプリケーション例は並列粒子追跡(parallel particle tracing)です。 + +![Flow visualization of tornado](../tornado.png) + +並列粒子追跡は流れ場を可視化するための主要な手法の1つです。粒子を流れ場に仮定して数値積分技術(Runge-Kutta法など)を用いて流れに沿って追跡します。この経路は、可視化のために描画することができます。描画の一例として上のトルネード画像があります。 + +効率的な並列粒子追跡というのは非常に困難しいです。主な理由は粒子の移動方向が積分の各増分ステップの後にしか決定できないためです。したがってプロセスがすべての通信と計算を調整してバランスをとるのは困難です。より理解するために、粒子追跡の一般的な並列化を見てみましょう。 + +![Parallel particle tracing illustration](../parallel_particle_tracing.png) + +この図はドメインを6つのプロセスに分割していることがわかります。粒子(時にはシードと呼ばれる)が各サブドメインに配置され(ウォーカーをそれぞれの領域に配置した方法に似ています)、その後トレースを開始します。粒子が境界を越えると、適切なサブドメインを持つプロセスと情報を交換します。このプロセスは粒子が領域から離れるか最大トレースの回数に達するまで繰り返されます。 + +並列粒子追跡の問題は、先ほどコーディングしたアプリケーションと同様に`MPI_Send`、`MPI_Recv`、`MPI_Probe`を使用して解決できます。より効率的に作業を行うために、もっと洗練されたMPIルーチンも存在するのでそれは次のレッスンでお話しします :-) + +ランダムウォークの問題が他の並列アプリケーションとどのように似ているかを示す例を少なくとも1つは確認できたと思います。 \ No newline at end of file diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/index.md b/tutorials/running-an-mpi-cluster-within-a-lan/index.md index 30a0fad..79e9175 100644 --- a/tutorials/running-an-mpi-cluster-within-a-lan/index.md +++ b/tutorials/running-an-mpi-cluster-within-a-lan/index.md @@ -3,6 +3,7 @@ layout: post title: Running an MPI Cluster within a LAN author: Dwaraka Nath categories: Beginner MPI +translations: ja_jp tags: MPI, Cluster, LAN redirect_from: '/running-an-mpi-cluster-within-a-lan' --- diff --git a/tutorials/running-an-mpi-cluster-within-a-lan/ja_jp.md b/tutorials/running-an-mpi-cluster-within-a-lan/ja_jp.md new file mode 100644 index 0000000..5c6978a --- /dev/null +++ b/tutorials/running-an-mpi-cluster-within-a-lan/ja_jp.md @@ -0,0 +1,262 @@ +--- +layout: post +title: LAN上でのMPIクラスタ構築 - Running an MPI Cluster within a LAN +author: Dwaraka Nath +categories: Beginner MPI +tags: MPI, Cluster, LAN +redirect_from: '/running-an-mpi-cluster-within-a-lan' +--- + +先のレッスンではMPIプログラムを[1台のマシン]({{ site.baseurl }}/tutorialss/mpi-hello-world/)で実行し、CPUに1つ以上のコアがある利点を生かしてコードを並列処理することを見てきました。それでは同じことを1台のコンピュータではなく、LANに接続されたノードで実行できるようにしましょう。物事を単純にするために、このレッスンでは2台のコンピュータを考えます。ノードをもっと増やすのは同じようにできます。 + +他のチュートリアルと同様にLinuxマシンを使用することを前提としています。以下のチュートリアルはUbuntuでテストしましたが、他のディストリビューションでも同じはずです。また、あなたの2台のマシンを**管理者(manager)**とし、もう1台を**作業者(worker)**と呼ぶとしましょう。 + +## 前提 + +すべてのマシンにMPICH2をインストールしていない場合は、[この手順]({{ site.baseurl }}/tutorials/installing-mpich2/)を実行してください。 + +## Step 1: `hosts`の準備 - Configure your ```hosts``` file + +`hosts`を用意しましょう。これはマシンのオペレーティングシステムがホスト名をIPアドレスにマッピングするために使用します。以下に例を示します。 + +```bash + +$ cat /etc/hosts + +127.0.0.1 localhost +172.50.88.34 worker +``` +これは`Manager`の`hosts`で、`worker`は、あなたが計算を行いたい他のマシン名です。同様に、Workerでは`manager`も同じようにします。 + +## Step 2: ユーザの作成 - Create a new user + +既存のユーザーアカウントでクラスタを操作することもできます。しかし、設定をシンプルにするために新しいユーザーアカウントを作成することをお勧めします。全てのホストでユーザー`mpiuser`を作成しましょう。 + +```bash +$ sudo adduser mpiuser +``` +プロンプトに従ってください。`adduser`ではなく`useradd`コマンドを使ってしまうとホームディレクトリが作成されないので使用しないでください。 + +## Step 3: SSHの設定 - Setting up SSH + +マシン間が通信できるようにSSHの設定をします。[NFS](#step-4-setting-up-nfs)を使ってデータを共有します。 +```bash +$ sudo apt­-get install openssh-server +``` + +まず、このホストでユーザをmpiuserに切り替えます。 + +```bash +$ su - mpiuser +``` +すでに `ssh` サーバーがインストールされているので、他のマシンに `ssh username@hostname` でログインできるはずです。パスワードを尋ねられないようにキーを生成して他のマシンの ``authorized_keys`` のリストにコピーします。(訳注:この処理は公開鍵認証を可能にする、という処理です。パスワード認証を禁止してはいないことに注意してください) + +```bash +$ ssh-keygen -t dsa +``` + +この例ではDSA鍵を作成しましたがRSA鍵を生成することもできます。より高いセキュリティを求めるのであれば、RSAを使っても良いですがDSAでも十分です。そして、生成した鍵を他のコンピューターに追加すしましょう。wokerノードに対してコピーします。 + +```bash +$ ssh-copy-id worker #ip-address may also be used +``` + +それぞれのWorkerマシンと自分のユーザ (localhost) に対してここまでの手順を実行してください。 + +これで `openssh-server` がセットアップされ、Workerと安全に通信できるようになります。すべてのマシンに一度 `ssh` を実行してください。そして`known_hosts` のリストに他のホストのフィンガープリントを追加します。このステップは`ssh`ログインのトラブルになりやすいので重要なステップです。 + +パスワードなしの sshができるようにしましょう。 + +```bash +$ eval `ssh-agent` +$ ssh-add ~/.ssh/id_dsa +``` +さてパスワードのプロンプトなしで他のマシンにログインできるはずです。 + +```bash +$ ssh worker +``` + +> **Note** - すべてのワーカーマシンで共通のユーザアカウントとして `mpiuser` を作成したと仮定しています。ManagerとWorkerで異なる名前のユーザーアカウントを作成した場合は適切なユーザ名を指定してください。 + +## Step 4: NFSの設定 - Setting up NFS + +**manager**はNFS経由でディレクトリを共有し、それを**worker**がマウントしてデータをやり取りします。 + +### NFS-Server + +パッケージをインストールします。 + +```bash +$ sudo apt-get install nfs-kernel-server +``` + +まだ `mpiuser` にログインしていると仮定して `cloud` という名前の共有フォルダを作成します。 + +```bash +$ mkdir cloud +``` + +`cloud`を共有するために`/etc/exports`を以下のようにします。 + +```bash +$ cat /etc/exports +/home/mpiuser/cloud *(rw,sync,no_root_squash,no_subtree_check) +``` +`*`の部分にはこのフォルダを共有したいIPアドレスを指定することができますが。今回は簡単のため`*`にしています。 + +* **rw**: read/writeを許可します。readのみを割り当てたいなら **ro**を設定します。 +* **sync**: 変更をコミットした後にのみ、共有ディレクトリに変更を適用されます +* **no_subtree_check**: サブツリーをチェックしません。共有ディレクトリが大きなファイルシステムのサブディレクトリである場合、 nfsはその上のすべてのディレクトリのパーミッションと詳細を確認するために スキャンを実行します。サブツリー・チェックを無効にするとNFSの信頼性は向上しますがセキュリティが低下することがあります。 +* **no_root_squash**: rootアカウントによるフォルダへの接続を許可します。 + +> この説明を作るために[Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-12-04)を参考にしました. このライセンスはCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International Licenseに従います。このライセンスの詳細は [ここ](https://creativecommons.org/licenses/by-nc-sa/4.0/)です。 + +NFSを実行します。 + +```bash +$ exportfs -a +``` + +`/etc/exports` に変更を加えた場合はこのコマンドが必要です。 + +必要に応じて`nfs` サーバを再起動してください。 + +```bash +$ sudo service nfs-kernel-server restart +``` + +### NFS-worker + +以下を実行します。 + +```bash +$ sudo apt-get install nfs-common +``` + +workerで同じ名前のディレクトリを作成します。 + +```bash +$ mkdir cloud +``` + +そして次のように共有ディレクトリをマウントしてください。 + +```bash +$ sudo mount -t nfs manager:/home/mpiuser/cloud ~/cloud +``` + +正常にマウントできたか確認しましょう。 + +```bash +$ df -h +Filesystem Size Used Avail Use% Mounted on +manager:/home/mpiuser/cloud 49G 15G 32G 32% /home/mpiuser/cloud +``` + +再起動のために手動で共有ディレクトリをマウントする必要がないようにするには ``/etc/fstab`` ファイルに次のようなエントリを作成してください。 + +```bash +$ cat /etc/fstab +#MPI CLUSTER SETUP +manager:/home/mpiuser/cloud /home/mpiuser/cloud nfs +``` + +## Step 5: MPIプログラムの実行 - Running MPI programs + +それでは正常性の確認のため、MPICH2のインストールパッケージ `mpich2/examples/cpi` に付属しているサンプルプログラムを並列実行してみましょう。 + +自分のコードをコンパイルしたい場合は、コードを`mpi_sample.c` とすると、以下に示す方法でコンパイルして ``mpi_sample`` を生成できます。 + + +```bash +$ mpicc -o mpi_sample mpi_sample.c +``` + +そして実行ファイルを共有ディレクトリ `cloud` にコピーしてください。もちろん、NFS 共有ディレクトリ内でコードをコンパイルしても良いです。 + +```bash +$ cd cloud/ +$ pwd +/home/mpiuser/cloud +``` + +自分のマシン(manager)だけで実行するときは以下のようにします。 + +```bash +$ mpirun -np 2 ./cpi # No. of processes = 2 +``` + +クラスタで実行してみましょう。 + +```bash +$ mpirun -np 5 -hosts worker,localhost ./cpi +#ホスト名の代わりにIPアドレスでも良いです。 +``` + +予め用意したホストファイルを使うこともできます。 + +```bash +$ mpirun -np 5 --hostfile mpi_file ./cpi +``` + +これでmanagerが接続しているマシンでMPIプログラムが動くはずです! + +## 一般的なエラーやTIPS - Common errors and tips + +* 実行ファイルを実行しようとしているすべてのマシンで、MPIのバージョンが同じであることを確認してください。これを読んでいる時の推奨バージョンは [MPICH2](http://www.mpich.org/downloads/)を参照してください。 +* manager の `hosts` ファイルには、 `manager` とワーカーノードのローカルネットワーク IP アドレスを記述します。ワーカには`manager`と自分自身のエントリが含まれている必要があります。 + +例を示します。managerには以下のようなhostsが必要になります。 + +```bash +$ cat /etc/hosts +127.0.0.1 localhost +#127.0.1.1 1944 + +#MPI CLUSTER SETUP +172.50.88.22 manager +172.50.88.56 worker1 +172.50.88.34 worker2 +172.50.88.54 worker3 +172.50.88.60 worker4 +172.50.88.46 worker5 +``` +このとき、worker3に必要な最低限のhostsは以下の通りです。 + +```bash +$ cat /etc/hosts +127.0.0.1 localhost +#127.0.1.1 1947 + +#MPI CLUSTER SETUP +172.50.88.22 manager +172.50.88.54 worker3 +``` +* MPIを使用してプロセスを並列実行しようとする場合、ローカルだけ、ローカルノードとリモートノードの組み合わせでプロセスを実行することができます。リモートのみでプロセスを起動することは**できません**。 + +以下の呼び出しは正常です。 +```bash +$ mpirun -np 10 --hosts manager ./cpi +# To run the program only on the same manager node +``` + +以下の呼び出しは正常です。 + +```bash +$ mpirun -np 10 --hosts manager,worker1,worker2 ./cpi +# To run the program on manager and worker nodes. +``` + +ですが次の呼び出しをmanagerから行うことはできません(worker1からなら良いのですが)。 + +```bash +$ mpirun -np 10 --hosts worker1 ./cpi +# Trying to run the program only on remote worker +``` + +## 次は? - So, what's next? + +クラスタが構築できました!わくわくしますか?ついに並列実行できるプログラムを書くための詳細を知る時が来ました。[MPI hello world lesson]({{ site.baseurl }}/tutorials/mpi-hello-world/)から始めるのが良いです。もしも、Amazon EC2インスタンスを使って同じことを再現したいのであれば、[building and running your own cluster on Amazon EC2]({{ site.baseurl }}/tutorials/launching-an-amazon-ec2-mpi-cluster/)を見てください。その他のレッスンについては、[MPIチュートリアル]({{ site.baseurl }}/tutorials/)のページを参照してください。 + +ローカルクラスタのセットアップで何か問題があれば、遠慮なく以下にコメントしてください。 \ No newline at end of file From 26ec3a03539c33be10d8e4aefad65215675df113 Mon Sep 17 00:00:00 2001 From: Wes Bland Date: Tue, 15 Jul 2025 10:36:06 -0500 Subject: [PATCH 105/108] Update Gemfile.lock --- Gemfile.lock | 107 +++++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2ad0def..3d026e7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,85 +1,100 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + base64 (0.3.0) + bigdecimal (3.2.2) colorator (1.1.0) - concurrent-ruby (1.1.8) - em-websocket (0.5.2) + concurrent-ruby (1.3.5) + csv (3.3.5) + em-websocket (0.5.3) eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) + http_parser.rb (~> 0) eventmachine (1.2.7) - faraday (1.3.0) - faraday-net_http (~> 1.0) - multipart-post (>= 1.2, < 3) - ruby2_keywords - faraday-net_http (1.0.1) - ffi (1.15.0) + faraday (2.13.2) + faraday-net_http (>= 2.0, < 3.5) + json + logger + faraday-net_http (3.4.1) + net-http (>= 0.5.0) + ffi (1.17.2) forwardable-extended (2.6.0) - http_parser.rb (0.6.0) - i18n (1.8.10) + google-protobuf (4.31.1) + bigdecimal + rake (>= 13) + http_parser.rb (0.8.0) + i18n (1.14.7) concurrent-ruby (~> 1.0) - jekyll (4.2.0) + jekyll (4.4.1) addressable (~> 2.4) + base64 (~> 0.2) colorator (~> 1.0) + csv (~> 3.0) em-websocket (~> 0.5) i18n (~> 1.0) - jekyll-sass-converter (~> 2.0) + jekyll-sass-converter (>= 2.0, < 4.0) jekyll-watch (~> 2.0) - kramdown (~> 2.3) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (~> 0.4.0) + mercenary (~> 0.3, >= 0.3.6) pathutil (~> 0.9) - rouge (~> 3.0) + rouge (>= 3.0, < 5.0) safe_yaml (~> 1.0) - terminal-table (~> 2.0) - jekyll-feed (0.15.1) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) jekyll-gist (1.5.0) octokit (~> 4.2) jekyll-paginate (1.1.0) jekyll-redirect-from (0.16.0) jekyll (>= 3.3, < 5.0) - jekyll-sass-converter (2.1.0) - sassc (> 2.0.1, < 3.0) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - kramdown (2.3.1) - rexml + json (2.12.2) + kramdown (2.5.1) + rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.5.1) + liquid (4.0.4) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) mercenary (0.4.0) - multipart-post (2.1.1) - octokit (4.20.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) + net-http (0.6.0) + uri + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (4.0.6) - rb-fsevent (0.10.4) - rb-inotify (0.10.1) + public_suffix (6.0.2) + rake (13.3.0) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.8) - strscan (>= 3.0.9) - rouge (3.26.0) - ruby2_keywords (0.0.4) + rexml (3.4.1) + rouge (4.5.2) safe_yaml (1.0.5) - sassc (2.4.0) - ffi (~> 1.9) - sawyer (0.8.2) + sass-embedded (1.89.2) + google-protobuf (~> 4.31) + rake (>= 13) + sawyer (0.9.2) addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - strscan (3.1.0) - terminal-table (2.0.0) - unicode-display_width (~> 1.1, >= 1.1.1) - unicode-display_width (1.7.0) + faraday (>= 0.17.3, < 3) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.6.0) + uri (1.0.3) + webrick (1.9.1) PLATFORMS ruby @@ -93,4 +108,4 @@ DEPENDENCIES jekyll-sitemap BUNDLED WITH - 1.17.2 + 2.6.9 From 2e5bbd94e78f7b68d5901fa47e5f81964a5395a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:31:48 +0000 Subject: [PATCH 106/108] Bump rexml from 3.4.1 to 3.4.2 Bumps [rexml](https://github.com/ruby/rexml) from 3.4.1 to 3.4.2. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.4.1...v3.4.2) --- updated-dependencies: - dependency-name: rexml dependency-version: 3.4.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3d026e7..dc65bf6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,7 +81,7 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.4.1) + rexml (3.4.2) rouge (4.5.2) safe_yaml (1.0.5) sass-embedded (1.89.2) From f2dd7c5d1d6d4a12223ec3766859deded22ae770 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Dec 2025 21:14:51 +0000 Subject: [PATCH 107/108] Bump uri from 1.0.3 to 1.0.4 Bumps [uri](https://github.com/ruby/uri) from 1.0.3 to 1.0.4. - [Release notes](https://github.com/ruby/uri/releases) - [Commits](https://github.com/ruby/uri/compare/v1.0.3...v1.0.4) --- updated-dependencies: - dependency-name: uri dependency-version: 1.0.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index dc65bf6..4c3bd3f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -93,7 +93,7 @@ GEM terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) unicode-display_width (2.6.0) - uri (1.0.3) + uri (1.0.4) webrick (1.9.1) PLATFORMS From 047eb0ce7379acd971f59ad3348187a76264662c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:17:34 +0000 Subject: [PATCH 108/108] Bump faraday from 2.13.2 to 2.14.1 Bumps [faraday](https://github.com/lostisland/faraday) from 2.13.2 to 2.14.1. - [Release notes](https://github.com/lostisland/faraday/releases) - [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md) - [Commits](https://github.com/lostisland/faraday/compare/v2.13.2...v2.14.1) --- updated-dependencies: - dependency-name: faraday dependency-version: 2.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4c3bd3f..2778723 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -12,12 +12,12 @@ GEM eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - faraday (2.13.2) + faraday (2.14.1) faraday-net_http (>= 2.0, < 3.5) json logger - faraday-net_http (3.4.1) - net-http (>= 0.5.0) + faraday-net_http (3.4.2) + net-http (~> 0.5) ffi (1.17.2) forwardable-extended (2.6.0) google-protobuf (4.31.1) @@ -58,7 +58,7 @@ GEM jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.12.2) + json (2.18.1) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) @@ -69,8 +69,8 @@ GEM rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) mercenary (0.4.0) - net-http (0.6.0) - uri + net-http (0.9.1) + uri (>= 0.11.1) octokit (4.25.1) faraday (>= 1, < 3) sawyer (~> 0.9) @@ -93,7 +93,7 @@ GEM terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) unicode-display_width (2.6.0) - uri (1.0.4) + uri (1.1.1) webrick (1.9.1) PLATFORMS

BnysRlVg;}fyZ4eMYZ1A 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