Here is how the simplest but most famous C program, "Hello, World" is converted to an MPC++ program.
#include <stdio.h> main(int argc, char **argv) { printf("hello, world\n"); exit(0); }
Firstly, you have to add the include file,
mpcxx.h
.
Then the mpcxx_initialize()
function should be
called at the beginning of the main()
function.
Essentially this is all you have to do.
#include <stdio.h> #include <mpcxx.h> main(int argc, char **argv) { mpcxx_initialize(argc, argv); printf("hello, world\n"); exit(0); }
The compilation of an MPC++ program is as easy as a normal C/C++ compilation. Let us assume the MPC++ program converted above is saved as hello.cc. Because the MPC++ compiler only accepts source files suffixed with .cc, filename hello.c cannot be compiled.
$ mpc++ hello.cc compiling hello.cc $
Just as a normal C/C++ compiler, the MPC++ compiler produces an executable file, named a.out. The MPC++ compiler accepts most of the compiler options that the C/C++ compiler accepts.
At first, you may invoke msgb to find some free hosts in the cluster, as follows:
$ msgb -group pcc &
Then invoke the scout
program with the group
name which specifies cluster hosts on which to run your program.
The group name is defined in the scorehosts.db(5) database.
$ scout -g pcc SCOUT: Spawn done. SCOUT: session started $A new shell process is now created as a child of the
scout
program.
If msgb
is already running, some or all hosts is
msgb
window turn red, while scout
invoking remote processes.
Note that the host which the scout
program
is invoked doesn't have to be one of the hosts of your cluster.
Eventually you can invoke the program:
$ scrun ./a.out SCORE: connected (jid=100) <0:0> SCORE: Single host, single process ready. hello, world $You should get the same result as a normal C/C++ program output.
Again, if msgb
is already running, some or all
hosts is msgb
window turn red, while executing
the program on your cluster. The msgb
window let
you know who is executing a program on your cluster, and hosts
are locked not to execute multiple programs on the hosts
simultaneously (use SCore-D multi-user mode to run multiple
programs on same hosts).
In above example, the program is executed on one host (node).
To execute the program on multple nodes, please specify
-nodes=
N as an option of
scrun
, where N is the number of nodes
you want to run the program.
$ scrun -nodes=2 ./a.out SCORE: connected (jid=100) <0:0> SCORE: 2 hosts, single process/host ready. hello, world $The result is exactly the same as the run on one host. What is wrong ? In this case, the
mpcxx_initialize()
function of MPC++ runtime library only returns on the host
which is assigned as node number 0, and other nodes are
idle. To get parallel hello program execution, you have to
change the MPC++ initialization function from to
mpcxx_spmd_initialize()
.
#include <stdio.h> #include <mpcxx.h> main(int argc, char **argv) { mpcxx_spmd_initialize(argc, argv); printf("hello, world\n"); exit( 0 ); }
Do not forget to compile the modified file. Let's try again:
$ scrun -nodes=2 ./a.out SCORE: connected (jid=100) <0:0> SCORE: 2 hosts, single process/host ready. hello, world hello, world $
Now you get two answers, because the
mpcxx_spmd_initialize()
function retunrs on each host. If you specify four nodes,
you will get four answers. To make sure,
the hello program is now slightly modified:
#include <stdio.h> #include <mpcxx.h> main(int argc, char **argv) { mpcxx_spmd_initialize(argc, argv); printf("hello, world (from node %d)\n", myNode); exit( 0 ); }
The variable myNode
is defined in the MPC++ runtime
library to contain the node number. The integer variable
numNode
indicates the number of nodes allocated for
the parallel execution. Note that the value of
numNode
can be different from the number of nodes
specified on the command line. Therefore any MPC++ program should
not assume that numNode
is assigned to some
specific value. If your program can only run with some specific
number of nodes, check the value of numNode
at the
very beginning, but after calling
mpcxx_(spmd_)initialize
, of your program.
Now let us try to run the modified program with four nodes.
$ scrun -nodes=4 ./a.out SCORE: connected (jid=100) <0:0> SCORE: 4 hosts, single process/host ready. hello, world (from node 0) hello, world (from node 2) hello, world (from node 1) hello, world (from node 3) $
Now you get four answers, exact one answer from each node. Note the
sequence of the answers. Since the body of main()
function is executed on each node in parallel, there is no way
to predict which one is the first, and so on. This is the nature
of parallel computation.
To finish this scout
session, please exit the
shell.
$ exit SCOUT: session done $
/opt/score/example/mttl
directory:
ainvoke.cc | Measure the round trip time of remote thread invocation |
burst.cc | Measure network bandwidth between nodes |
See also
![]() |
PC Cluster Consotium |