align.c
上传用户:xmxjxm
上传日期:2022-08-01
资源大小:2k
文件大小:5k
源码类别:

并行计算

开发平台:

C/C++

  1. /*____________________________________________________________________________
  2. Example program for MPI implementation of multiple sequence alignment.
  3. To keep the code simple, the actual alignment routine is not included here.
  4. You may plug in the score of an external dynamic programming routine (DP_score)
  5. by replacing
  6.   locresult[l] = my_j[my_job]+my_k[my_job];
  7. with
  8.   locresult[l] = DP_score(my_j[my_job], my_k[my_job]);
  9. and the code works as parallelised alignment program.
  10. Please not that the <mpich-path> needs to match your MPICH installation.
  11. Compile: ($PATH is the path to the MPICH directory)
  12.     $PATH/mpicc -I$PATH/include -o mpitest mpitest.c -lm -L$PATH/lib -lmpich
  13. Run: ('np' is number of nodes, 'machinefile' is a list of node names)
  14.     mpirun -np 2 -machinefile machine_file mpitest
  15. (C) 2002 Jens Kleinjung
  16.   Division of Mathematical Biology
  17.   National Institute for Medical Research, NW6 1LL London
  18.   http://mathbio.nimr.mrc.ac.uk/wiki/MPI_code
  19.     This program is free software: you can redistribute it and/or modify
  20.     it under the terms of the GNU General Public License as published by
  21.     the Free Software Foundation, either version 3 of the License, or
  22.     (at your option) any later version.
  23.     This program is distributed in the hope that it will be useful,
  24.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  25.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26.     GNU General Public License for more details.
  27.     You should have received a copy of the GNU General Public License
  28.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  29. _______________________________________________________________________________*/
  30.  
  31. #include   <stdio.h>
  32. #include   <math.h>
  33. #include   <string.h>
  34. #define MPI "<mpich-path>/include/mpi.h"
  35. #include MPI
  36.  
  37. main(int argc, char *argv[])
  38. {
  39.   int my_rank;          /* rank of 'this' node */
  40.   int nodes;            /* number of nodes */
  41.   int jobid;            /* job identifier */
  42.   int njobs;            /* number of jobs */
  43.   int avjobs;           /* average number of jobs per node */
  44.   int locdata;          /* number of data to communicate */
  45.   int alldata;          /* number of data produced on all nodes */
  46.   int alljobs;          /* all jobs on nodes */
  47.   int firstjob;         /* the first job of array assigned to 'this' node */
  48.   int my_job;           /* job processed on 'this' node */
  49.   int j,k,l,m;          /* loop counters */
  50.   int *my_j, *my_k;     /* arrays of sequence identifiers */
  51.   int *locresult;       /* holds data produced on 'this' node */ 
  52.   int *globresult;      /* holds data produced on all nodes */
  53.   int nseq = 6;         /* example number of sequences */
  54.   int aliscore[6][6];   /* the assumed alignment score */
  55.  
  56.   /* initialize MPI routines */
  57.   MPI_Init(&argc, &argv);
  58.   MPI_Comm_size(MPI_COMM_WORLD, &nodes);
  59.   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  60.  
  61.   /* number of pairwise alignments */
  62.   njobs = (int)(nseq*(nseq-1)/2);    
  63.  
  64.   /* calculate smallest integer divisor of njobs and nodes */
  65.   if ((njobs % nodes) == 0) 
  66.     avjobs = (int)(njobs/nodes);
  67.   else 
  68.     avjobs = (int)((njobs/nodes)+1);
  69.  
  70.   /* number of data to communicate */
  71.   locdata = avjobs;
  72.   alldata = nodes*locdata;
  73.  
  74.   /* total number of jobs assigned to nodes /
  75.   alljobs = nodes*avjobs;
  76.  
  77.   /* map nested loop of 'j,k' onto linear array of 'jobid' */
  78.   my_j = (int*)malloc(sizeof(int)*njobs);
  79.   my_k = (int*)malloc(sizeof(int)*njobs);
  80.   jobid = -1;
  81.   for (j=0; j < nseq; j++) {
  82.       for (k = j+1; k < nseq; k++) {
  83.   jobid++;
  84.   my_j[jobid] = j;
  85.   my_k[jobid] = k;
  86.       }
  87.   } 
  88.   /* 'locresult' holds data produced on this node */
  89.   /* 'globresult' holds data produced on all nodes */
  90.   locresult = (int*)malloc(sizeof(int)*locdata);
  91.   globresult = (int*)malloc(sizeof(int)*alldata);
  92.  
  93.   /* each node calculates its result array slice of size 'avjobs' */
  94.   /* note that 'my_rank' defines the slice of data that is calculated by each node */
  95.   /*   because each node starts its calculation at a different 'firstjob' */
  96.   firstjob = my_rank*avjobs;
  97.   for (l=0; l<avjobs; l++) {
  98.       my_job = l+firstjob;
  99.       /* avoid calculating jobs of non-mapped j and k values, */
  100.       /*   because nodes*avjobs is probably larger than njobs */
  101.       if (my_job<=jobid) {
  102.   /* assign data to array for sending */
  103.   /* node specific results because of my_j[jobid] and my_k[jobid] */
  104.   /* assume that the alignment score of 'j''k' is sum of identifiers */
  105.   locresult[l] = my_j[my_job]+my_k[my_job];
  106.       } else {
  107.   locresult[l] = 0;
  108.       }
  109.   }
  110.  
  111.   for (l=0; l<nodes; l++) {
  112.       for (m=0; m<avjobs; m++) {
  113.   if (my_rank==l) printf("node%d: locresult[%d] = %dn", l,m,locresult[m]);
  114.       }
  115.       printf("n");
  116.   }
  117.  
  118.   /* communicate slices of data between all nodes */
  119.   MPI_Allgather(locresult, locdata, MPI_INT, globresult, locdata, MPI_INT, MPI_COMM_WORLD);
  120.  
  121.   /* assemble the matrix of 'aliscore' from the received 'globresult' array */
  122.   for (l=0; l<alljobs; l++) {
  123.       if (l<=jobid) {
  124.   j = my_j[l];
  125.   k = my_k[l];
  126.   aliscore[j][k] = globresult[l];
  127.   /* let node0 print out results */
  128.   if (my_rank==0) printf("node0: globresult[%d] = aliscore[%d][%d] = %dn", l,j,k,aliscore[j][k]);
  129.       }
  130.   }
  131.  
  132.   /* de-allocate memory */
  133.   free(locresult);
  134.   free(globresult);
  135.   free(my_j);
  136.   free(my_k);
  137.  
  138.   /* stop MPI processes */
  139.   MPI_Finalize();
  140. }