Using MPC to compile and run MPI programs is relatively simple. In most cases, you simply compile your code with the MPC compiler (mpc_cc, mpc_cxx, mpc_f77, etc.).
We consider the sample code at the bottom of this page .
Compile the Code
Use the MPC C compiler command, mpc_cc, to compile the MPI code:
mpc_cc mpi_demo.c -o mpi_demo
Run the Code
Use the mpcrun command to launch the executable:
# Run on four MPI processes sharing the same MPC process mpcrun -n=4 ./mpi_demo
You should get an output similar to:
Running MPC with HYDRA job manager
MPC version 3.3.0 C/C++ (4 tasks 1 processes 4 cpus (2.39GHz) ethread_mxn) MPC allocator none
Initialization time: 0.1s - Memory used: 21MB
MPC OpenMP version 3.1
Tasking on
OMP_SCHEDULE 1
Default #threads (OMP_NUM_THREADS)
OMP_DYNAMIC 1
OMP_NESTED 0
Default #microVPs (OMP_MICROVP_NUMBER)
OMP_TREE default
NUMA allocation for tree nodes
#[rank] [runtime] [sort_time] [host] [buffvalue] [nums_sorted]
0 57.5457 25.3636 paratools07.rrp.net 0.099487 50000000
1 60.1933 25.2468 paratools07.rrp.net 0.099487 50000000
3 60.5007 25.3489 paratools07.rrp.net 0.099487 50000000
2 60.537 25.3605 paratools07.rrp.net 0.099487 50000000
Sample Code
/* * mpi_demo.c * * Tyler Simon * John C. Linford * 26 June 2014 * * Do some CPU intensive work with quicksort * Print out usage per MPI rank */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/time.h> #include <sys/types.h> #include <time.h> #include <unistd.h> #include<mpi.h> int ascending(const void * a, const void * b) { int temp = *(int*)a - *(int*)b; if (temp > 0) return 1; else if (temp < 0) return -1; else return 0; } int descending(const void * a, const void * b) { int temp = *(int*)a - *(int*)b; if (temp < 0) return 1; else if (temp > 0) return -1; else return 0; } double cpu_test(char *host,long int size, int rank) { int i; double start, elapsed; int * nums; srand(time(NULL)+rank); nums = (int*)malloc(sizeof(int) * size); if(!nums){ printf("ERROR ALLOCING MEM\n"); exit(1); } for(i=0; i<size; i++){ nums[i] = rand(); } start = MPI_Wtime(); qsort(nums, size, sizeof(int), ascending); qsort(nums, size, sizeof(int), descending); elapsed = MPI_Wtime() - start; return elapsed; } int main(int argc, char **argv) { size_t const N=200000000; int rank, size; size_t sortnum; float sendbuf; char hostname[255]; double * elapsed; double * sort_time; srand48(time(NULL)); MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); elapsed = (double*)malloc(size*sizeof(double)); sort_time = (double*)malloc(size*sizeof(double)); sortnum = N/size; gethostname(hostname,255); sendbuf=drand48(); if(rank == 0) { printf("#[rank] [runtime] [sort_time] [host] [buffvalue] [nums_sorted]\n"); } elapsed[rank] = MPI_Wtime(); MPI_Bcast(&sendbuf, 1, MPI_FLOAT, 0, MPI_COMM_WORLD); sort_time[rank] = cpu_test(hostname,sortnum,rank); elapsed[rank] = MPI_Wtime() - elapsed[rank]; printf("%d %g %g %s %f %ld\n", rank, elapsed[rank], sort_time[rank], hostname, sendbuf, sortnum); MPI_Finalize(); return 0; }