mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-13 01:05:36 +00:00
Checking for integer divisions in cartesian full
This commit is contained in:
parent
06e6f8de00
commit
44051aecd1
@ -62,77 +62,81 @@ public:
|
|||||||
return shift;
|
return shift;
|
||||||
}
|
}
|
||||||
GridCartesian(const std::vector<int> &dimensions,
|
GridCartesian(const std::vector<int> &dimensions,
|
||||||
const std::vector<int> &simd_layout,
|
const std::vector<int> &simd_layout,
|
||||||
const std::vector<int> &processor_grid
|
const std::vector<int> &processor_grid) : GridBase(processor_grid)
|
||||||
) : GridBase(processor_grid)
|
|
||||||
{
|
{
|
||||||
///////////////////////
|
///////////////////////
|
||||||
// Grid information
|
// Grid information
|
||||||
///////////////////////
|
///////////////////////
|
||||||
_ndimension = dimensions.size();
|
_ndimension = dimensions.size();
|
||||||
|
|
||||||
_fdimensions.resize(_ndimension);
|
|
||||||
_gdimensions.resize(_ndimension);
|
|
||||||
_ldimensions.resize(_ndimension);
|
|
||||||
_rdimensions.resize(_ndimension);
|
|
||||||
_simd_layout.resize(_ndimension);
|
|
||||||
_lstart.resize(_ndimension);
|
|
||||||
_lend.resize(_ndimension);
|
|
||||||
|
|
||||||
_ostride.resize(_ndimension);
|
|
||||||
_istride.resize(_ndimension);
|
|
||||||
|
|
||||||
_fsites = _gsites = _osites = _isites = 1;
|
|
||||||
|
|
||||||
for(int d=0;d<_ndimension;d++){
|
_fdimensions.resize(_ndimension);
|
||||||
_fdimensions[d] = dimensions[d]; // Global dimensions
|
_gdimensions.resize(_ndimension);
|
||||||
_gdimensions[d] = _fdimensions[d]; // Global dimensions
|
_ldimensions.resize(_ndimension);
|
||||||
_simd_layout[d] = simd_layout[d];
|
_rdimensions.resize(_ndimension);
|
||||||
_fsites = _fsites * _fdimensions[d];
|
_simd_layout.resize(_ndimension);
|
||||||
_gsites = _gsites * _gdimensions[d];
|
_lstart.resize(_ndimension);
|
||||||
|
_lend.resize(_ndimension);
|
||||||
|
|
||||||
//FIXME check for exact division
|
_ostride.resize(_ndimension);
|
||||||
|
_istride.resize(_ndimension);
|
||||||
|
|
||||||
// Use a reduced simd grid
|
_fsites = _gsites = _osites = _isites = 1;
|
||||||
_ldimensions[d]= _gdimensions[d]/_processors[d]; //local dimensions
|
|
||||||
_rdimensions[d]= _ldimensions[d]/_simd_layout[d]; //overdecomposition
|
for (int d = 0; d < _ndimension; d++)
|
||||||
_lstart[d] = _processor_coor[d]*_ldimensions[d];
|
{
|
||||||
_lend[d] = _processor_coor[d]*_ldimensions[d]+_ldimensions[d]-1;
|
_fdimensions[d] = dimensions[d]; // Global dimensions
|
||||||
_osites *= _rdimensions[d];
|
_gdimensions[d] = _fdimensions[d]; // Global dimensions
|
||||||
_isites *= _simd_layout[d];
|
_simd_layout[d] = simd_layout[d];
|
||||||
|
_fsites = _fsites * _fdimensions[d];
|
||||||
// Addressing support
|
_gsites = _gsites * _gdimensions[d];
|
||||||
if ( d==0 ) {
|
|
||||||
_ostride[d] = 1;
|
// Use a reduced simd grid
|
||||||
_istride[d] = 1;
|
_ldimensions[d] = _gdimensions[d] / _processors[d]; //local dimensions
|
||||||
} else {
|
assert(_ldimensions[d] * _processors[d] == _gdimensions[d]);
|
||||||
_ostride[d] = _ostride[d-1]*_rdimensions[d-1];
|
|
||||||
_istride[d] = _istride[d-1]*_simd_layout[d-1];
|
_rdimensions[d] = _ldimensions[d] / _simd_layout[d]; //overdecomposition
|
||||||
}
|
assert(_rdimensions[d] * _simd_layout[d] == _ldimensions[d]);
|
||||||
|
|
||||||
|
_lstart[d] = _processor_coor[d] * _ldimensions[d];
|
||||||
|
_lend[d] = _processor_coor[d] * _ldimensions[d] + _ldimensions[d] - 1;
|
||||||
|
_osites *= _rdimensions[d];
|
||||||
|
_isites *= _simd_layout[d];
|
||||||
|
|
||||||
|
// Addressing support
|
||||||
|
if (d == 0)
|
||||||
|
{
|
||||||
|
_ostride[d] = 1;
|
||||||
|
_istride[d] = 1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
///////////////////////
|
{
|
||||||
// subplane information
|
_ostride[d] = _ostride[d - 1] * _rdimensions[d - 1];
|
||||||
///////////////////////
|
_istride[d] = _istride[d - 1] * _simd_layout[d - 1];
|
||||||
_slice_block.resize(_ndimension);
|
|
||||||
_slice_stride.resize(_ndimension);
|
|
||||||
_slice_nblock.resize(_ndimension);
|
|
||||||
|
|
||||||
int block =1;
|
|
||||||
int nblock=1;
|
|
||||||
for(int d=0;d<_ndimension;d++) nblock*=_rdimensions[d];
|
|
||||||
|
|
||||||
for(int d=0;d<_ndimension;d++){
|
|
||||||
nblock/=_rdimensions[d];
|
|
||||||
_slice_block[d] =block;
|
|
||||||
_slice_stride[d]=_ostride[d]*_rdimensions[d];
|
|
||||||
_slice_nblock[d]=nblock;
|
|
||||||
block = block*_rdimensions[d];
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////
|
||||||
|
// subplane information
|
||||||
|
///////////////////////
|
||||||
|
_slice_block.resize(_ndimension);
|
||||||
|
_slice_stride.resize(_ndimension);
|
||||||
|
_slice_nblock.resize(_ndimension);
|
||||||
|
|
||||||
|
int block = 1;
|
||||||
|
int nblock = 1;
|
||||||
|
for (int d = 0; d < _ndimension; d++)
|
||||||
|
nblock *= _rdimensions[d];
|
||||||
|
|
||||||
|
for (int d = 0; d < _ndimension; d++)
|
||||||
|
{
|
||||||
|
nblock /= _rdimensions[d];
|
||||||
|
_slice_block[d] = block;
|
||||||
|
_slice_stride[d] = _ostride[d] * _rdimensions[d];
|
||||||
|
_slice_nblock[d] = nblock;
|
||||||
|
block = block * _rdimensions[d];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user