From f6bbaf436649b107b7f9976bf5dbb0b45886f7eb Mon Sep 17 00:00:00 2001 From: Wes Kendall Date: Thu, 19 Feb 2015 08:00:45 -0500 Subject: [PATCH 001/111] 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/111] "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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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 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 +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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] `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/111] 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 zcmeHOeQX@X6`#9{6DM&l=QMyJkZfs!9K@Y{CJ7Fda%cOTJ+Kqkv4PSi>-F8)zUIDq zw-=n0wy6RUSJ%{{sHC(~t%{h~G!&{ofOXZ7>A5|8>Ux{2#kUwS)V&JwS^L=ProhV=e*5=F9~fDB z@1-+eyZ74P48QF>|I$CjC;%Z-!V1ZRA^RQ3D=hGzl)-O-j#a0#+GwF4lTLEtYyw(`&K0Iz0Ov(dFZP=X`|unPTj zu^Kia^>COj8pp3@hiXglGa$h2ki4)nAmq(<`aymLTgqlCeNZZ{>$HKg_HJVUk)H-i2l#ZxcMA2I<^pJN6e3Q}! zpgxTLsYhRhu(S!B0e%SWQbGf}ls+{YW2tmBq4fcdGQvr5HJV^bB&=#GRP<&tIu1}G z%<2Y`@km`b(wj`HnTVz(6Ll@gP&OV(Xqme9NJdMm;bdJ)G!u%ZVCqpbbsf#yH{Npd zCU-|V*`HS9YDi7GJJhrqi^SBrWGa#XSGc_%Z@tG`*PD&T!Z>%aEp5T3W~IT?;MrIx z)1(TI-wv}A&Ouhm#$b>^*8l9x&BvTBnY|{u7-zP>32bFF3NyK#T|^Z~vuk=d#kqPB zFX@+2F^=)K4d*vX^qwG&b04J|A&)lbCkX2#18(eptpTUs43w`o;Ktw8MgwmAUGW)k zWB+9XPQQU@zr%ooV+!eB177&ah1wnizO*3C*nk1AGT|byz9yzfdU; zReXG<#N>y@wTh`-96V8ZTvyF+d)wOw@-;pvAwPhX)025f>)t{hpXT&w&cA^? zK7#3S&cBMh1NkGI{}b})^662|{{eY)_4EkmpGO{DJiU+e&mxbmolbH7m&l__r+Ya6 zbL7#L(;b}uDe~yTX&>jGKptH;UC;SPkw=$JOTc?C26Hd&lyh&$`_ImFbOk5ICt>E3 zCyu2!nK-w^$ELP`;Cp?`*R(J;_Bc4QTXy4oD(|0l%DFdpuNnhu+6ko}yDjhgf0DhzcV+G*V zkMsG7z|;7|CIY8%U`z!5jN@S-e-M0+YJPS$sAVfhioV@=#z*9&R6(hr3Td zht+a!V(J4h2o(sPl5;OU3oziKKNomwhvA-}(IZGe^pt!%&J)@Vygb}}SkAqImbU4Z zPJyK(0(u>wq3n^N_QONnhlT=A`g1d2dKMl&_uSOyQDqo<1?r=Ec^u1+ktw~UDv*KB zO-#iApL!fFy5oo1XT$Q%RouDoa{cw+`TXyX7e_e8(z1wT7tnb z>_)mhn7b6rz3hFhZ9P7#O8MBwj;VGqAU||bTTSDsE%#Pi?ota_$gg}|-hbRCZ$6)W zOWuE?^2ME+$yaL z*R2ani=~dvV0&Or1)rj9s~or0gAII~XFtm49{_p+I@kvES#ZIVKwIF6oB;YX&?*=V zG?&}ZN#PS*i@^Rk7GJvL~X*M$Kdgkc;3%9@<6@7bH2HIFy~ zPHA{Sle6}_6|%Gbz(U#CxPQ?$r!VDf^gHYQ&e|rY1actXyQya(nzFzN1-(YlDRG{P`xcm}{{74OB=QIC zJ|u-R-O(u&j@-_&{qUKC#b1ewxzlGR;jkTH=EG1(ndI)@wyutvYc&L zuLDv;y?3Lx-dkTPyuq{C)8O{j>%v~|dWj>9c`|$An%WCgOY3xiN^mw6NvD`6k<=m{ ze^bz{sr`cMPh>s(w8$L|GY@hDYG#0W!g~^6Pp4X1uh|_*XQIhO38O$=8cv{4L6lN4 zjd}QipGS)fLYW`sdD2OK66T2vz=59{k0=9S&?QdSP}Fo<-J@$z`Kuui1M6x$8iJ;i zU=S`I-imG!j@Fn54*}uu%B#sPb#U6#0mX_okc!h35p=76`D-q%um zA*1)Y6ko)w-UkQF67(LG$}eX0K9=H33h!+xKKDEr>m96$xh%$~gDoq>#gy8yI6vlg zma`f2xiZIHg}9DVJJqabna>FEvI9=2DNe;$>0qB>G=G-jD;XY(n3Dr$L96%O!LDR< zE@{+p;H)R+$5On8?X$$;T;CF>*}iB6=e-5&?R*i@OZdBDgWY9w|MB<44*r*x_;f*W z^$5Jjg!=_PYQpaU+=lT7wLMTO{{Hpx@?3uo1CH&Eo9tlRfX(8$i~(+SU*+!i7`Ic+ zI-EWz71Ik)wDJQ=SlNG#tFD+c9xiY@bD#VBLf$;CDxsq`i|4)?@D<<(JT1gTzn31s zt>Q460GGIA>18L!=Z>E!;8yV>gMeGbiwps76)*BAw=?&BJXps5Q)Tey%iyn+!QTfQ z`(u7D?BFOXKU4!=ZLeVuo8Fhzh_m9nu|T-b4LJHAk7+SQ_?5BSIW8CjX$9N`e>Vi7G8_S~{@QzKZm5aJO(`j0+D$Y|+3O#e&> zXXEibpkm+@{JJO+<>5OS-s#p(e|ta)Y;D0PC4LK3F3}1zrR7Uo{q4bKkTTTp04Jtw zY1`K1Z&S9lwr&q}DP8`iwg8&r;XR>DRu50IiZc477%Kc+5kWwONFzP)sMHdVWunL- zi$ExI_>s>?VLlr~BvKKBheIyU86C8L2Wcr zOG4VvP9Y$Sj{(!$_TRI({(~v9@Vi0ZnH2v^>p!xLvc~i|U~tU^uP0CRJxcMllE8`3 zyh*$l3PyeUZq9T=Jj*bgsBgt>m@E%T_2Zg-rVN9ejrL z1;uqO-aF~nKpE5BkR6aopT3uCDzKI@TKDRlZiC85cS6QBC+X97wM#5yF|GlVFjr`Y zfnO!~AwaEXQfB-9&|OE5$q1HPnvvA&oQ`tOiqOnPMV z36nnUvz*17g+%)eI;Z=Z%1B2cWBb$$txINv{${8%Ch{L)hoE58r+9RVQ{O;>f|~vJ zj7gu?IXz z^gB&B%3>mlv9r`RuMn3vB)x#^9%C}G+z!1vM!A{K>Rh9khj2K!A=B;9{EhFYRr|H; 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] "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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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/111] 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を䜿甚した基本的なポむントツヌポむント通信を孊びたした。前回はメッセヌゞ長が固定である堎合のみを説明したした。可倉長メッセヌゞを送る方法ずしお぀目のメッセヌゞ長を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`には受信した芁玠の合蚈数が入りたす。 + +なぜこの぀の情報が必芁になるのかを説明したす。`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の実装は耇数存圚したす。このレッスンでは䞻な実装の぀である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 +``` + +このフィヌルドをみおいきたす。぀以倖のノヌドでクラスタを開始したい堎合は、`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/)のレッスンで孊んだリングプログラムを思い出しおください。トヌクンをリングのようにすべおのプロセスに枡すプログラムでした。この実装は党おのプロセスが凊理を終えなければこの凊理は終わらないのでバリアを実装するの぀の方匏です。 + +繰り返しになりたすが、すべおの集団通信は同期されおいる。蚀い換えるず、そのルヌチンを`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`は実行する回数を瀺す倉数です。 ぀の関数ごずに実行時間を蚈算したす。そしお平均時間をプログラムの最埌で出力したす。 コヌド党䜓は、[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`の埌には぀の関数を呌び出したす。これらはほずんど党おの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぀の送信者ず受信者が関わる通信を`ポむント・ツヌ・ポむント通信`ず呌びたす。 + +プロセスが他の党プロセスず通信したいこずがありたす。䟋えば、マネヌゞャヌ・プロセスがワヌカヌ・プロセスすべおにデヌタをブロヌドキャストするこずを考えたしょう。぀぀の送受信を行うコヌドを曞くのは面倒ですし、最適な方法でネットワヌクを利甚するのも難しいです。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) + +この䟋では各プロセスは敎数を぀持ちたす。`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぀のメッセヌゞにたずめおいるので゚ンベロヌプ(*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 +さお、぀の重芁なルヌチンが実装できたのでこれらをたずめお `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`の぀の関数を䜿甚しお各の順䜍を蚈算したす。この関数は`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のりォヌクずは、ナニット移動する動䜜です + +1. プロセス0からりォヌカヌは6のステップしたす。倀が4になった時プロセス0の境界に達しおいたす。プロセス0はプロセス1にりォヌカヌを枡したす。 + +2. プロセス1はりォヌカヌを受け取ったあず、合蚈が6に達するたでりォヌクを続けたす。このサむクルを぀ずしおりォヌカヌは新しいランダムりォヌクを詊行したす。 + +![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` だけに焊点をあおおいたす。送受信のデッドロックを回避するベストの方法は送信ず受信が䞀臎するようにメッセヌゞングを順序付けるこずです。いく぀かの方法が考えられたすが、぀ずしおは偶数番目のプロセスが受信の前に送信を送り、奇数番目のプロセスがその逆を行うようにするこずです。もし、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でテストしたしたが、他のディストリビュヌションでも同じはずです。たた、あなたの台のマシンを**管理者(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/111] 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/111] 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/111] 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/111] 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 From 5aa567cc3d47d8edb14b4cdd5c12cc8c9e44384d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:54:16 +0000 Subject: [PATCH 109/111] Bump json from 2.18.1 to 2.19.2 Bumps [json](https://github.com/ruby/json) from 2.18.1 to 2.19.2. - [Release notes](https://github.com/ruby/json/releases) - [Changelog](https://github.com/ruby/json/blob/master/CHANGES.md) - [Commits](https://github.com/ruby/json/compare/v2.18.1...v2.19.2) --- updated-dependencies: - dependency-name: json dependency-version: 2.19.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 2778723..89c49ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -58,7 +58,7 @@ GEM jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.18.1) + json (2.19.2) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) From 00ec065c941f91cefec346e31855285e39b4d5ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 09:18:22 +0000 Subject: [PATCH 110/111] Bump addressable from 2.8.7 to 2.9.0 Bumps [addressable](https://github.com/sporkmonger/addressable) from 2.8.7 to 2.9.0. - [Changelog](https://github.com/sporkmonger/addressable/blob/main/CHANGELOG.md) - [Commits](https://github.com/sporkmonger/addressable/compare/addressable-2.8.7...addressable-2.9.0) --- updated-dependencies: - dependency-name: addressable dependency-version: 2.9.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 89c49ce..7d656a9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) base64 (0.3.0) bigdecimal (3.2.2) colorator (1.1.0) @@ -76,7 +76,7 @@ GEM sawyer (~> 0.9) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (6.0.2) + public_suffix (7.0.5) rake (13.3.0) rb-fsevent (0.11.2) rb-inotify (0.11.1) From 646ece79222361bf500a6306378c25fbbe486184 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 15:19:10 +0000 Subject: [PATCH 111/111] Bump faraday from 2.14.1 to 2.14.2 Bumps [faraday](https://github.com/lostisland/faraday) from 2.14.1 to 2.14.2. - [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.14.1...v2.14.2) --- updated-dependencies: - dependency-name: faraday dependency-version: 2.14.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7d656a9..c885908 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -12,7 +12,7 @@ GEM eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - faraday (2.14.1) + faraday (2.14.2) faraday-net_http (>= 2.0, < 3.5) json logger @@ -58,7 +58,7 @@ GEM jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.19.2) + json (2.19.5) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0)

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