getBlocksOfEntitiesPartition.c
Aller à la documentation de ce fichier.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #include <med.h>
00020 #define MESGERR 1
00021 #include "med_utils.h"
00022 
00023 
00024 #include "getBlocksOfEntitiesPartition.h"
00025 
00026 
00027 void getContinuousBlocksOfEntities(const int myrank, const int nproc, const int nentities,
00028                                     med_size * const start, med_size * const stride, med_size * const count, med_size * blocksize,
00029                                     int * const lastusedrank, med_size * const lastblocksize ) {
00030 
00031     int      _nusedproc      = nproc;
00032     int      _lastusedrank   = 0;
00033     med_size _blocksize      = nentities/nproc;
00034     
00035     int      _nblocks_pproc  = 0;
00036 
00037 
00038     
00039 
00040 
00041     for (; (_blocksize < 1) && ( _nusedproc > 1 ) ; ) {
00042       SSCRUTE("NOT USING ALL PROCESS");
00043       --_nusedproc;
00044       _blocksize = nentities/_nusedproc;
00045     }
00046     _lastusedrank   = _nusedproc-1;
00047 
00048     if ( myrank < _nusedproc)
00049       _nblocks_pproc = 1;
00050     else
00051       _blocksize = 0;
00052 
00053 
00054 
00055 
00056 
00057  
00058 
00059 
00060 
00061 
00062     *start         = myrank*_nblocks_pproc*_blocksize;
00063     *stride        = _blocksize;
00064     *count         = _nblocks_pproc;
00065     *lastblocksize = 0;
00066 
00067     if ( myrank == _lastusedrank ) {
00068       *blocksize = nentities+_blocksize*(1-_nusedproc);
00069     } else {
00070       *blocksize =_blocksize;
00071     }
00072     ++(*start);
00073     *lastusedrank=_lastusedrank;
00074     printf("My rank %d , start %l , stride %l , blocksize %l , count %l , lastblocksize %l\n",
00075            myrank,*start,*stride,*blocksize,*count,*lastblocksize);
00076     return;
00077 }
00078 
00079 void getCyclicBlocksOfEntities(const int myrank, const int nproc, const int nentities,
00080                                med_size * const start, med_size * const stride,  med_size * const io_count, med_size * blocksize,
00081                                int * const lastusedrank, med_size * const lastblocksize ) {
00082 
00083     int      _nusedproc      = nproc;
00084     int      _lastusedrank   = nproc-1;
00085     int      _nblocks_pproc  = *io_count;
00086     int      _nblocks        = _nblocks_pproc*nproc;
00087     med_size _blocksize      = 0;
00088 
00089     if (_nblocks) _blocksize=nentities/_nblocks;
00090 
00091     
00092 
00093 
00094 
00095     for (; (_blocksize < 1) && ( _nblocks_pproc > 1 ) ; ) {
00096       --_nblocks_pproc;
00097       _nblocks   = _nblocks_pproc*nproc;
00098       _blocksize = nentities/_nblocks;
00099     }
00100 
00101 
00102 
00103 
00104     
00105 
00106 
00107 
00108 
00109     if ( _blocksize == 0 ) {
00110       MESSAGE("Downcasting getCyclicBlocksOfEntities to getContinuousBlocksOfEntities");
00111       getContinuousBlocksOfEntities(myrank, nproc, nentities,
00112                                     start, stride, io_count, blocksize, lastusedrank, lastblocksize );
00113       return;
00114     }
00115 
00116     
00117     *blocksize     = _blocksize;
00118     *stride        = _blocksize*nproc;
00119     *start         = _blocksize*myrank;
00120     *io_count      = _nblocks_pproc;
00121 
00122     if (myrank == _lastusedrank) {
00123       *lastblocksize = nentities + _blocksize*(1-nproc*_nblocks_pproc);
00124       
00125 
00126       if ( _nblocks_pproc == 1 ) {*blocksize=*lastblocksize;*lastblocksize=0;}
00127     } else
00128       *lastblocksize=0;
00129 
00130     ++(*start);
00131     *lastusedrank=_lastusedrank;
00132 
00133     return;
00134 }
00135 
00136 
00137 
00138 
00139 
00140