Introduction¶
hypercube is a package for reasoning about Radio Interferometry problem sizes.
Radio Interferometry data, such as visibilities, is both large and dense. Computation on this data is therefore generally suited to distributed, data parallel computation. To achieve this parallelism it is necessary to subdivide this data into tiles, large enough to fit within the memory budgets of individual nodes and GPUs.
hypercube is an simple abstraction that uses labelled Dimensions and abstract numpy array shapes, defined in terms of these Dimensions, to:
- Reason about memory budgets
- Choose array subdivision strategies
- Iterate over a problem space
from hypercube import HyperCube
cube = HyperCube()
cube.register_dimension("ntime", 10000,
description="Timesteps")
cube.register_dimension("nbl", 2016,
description="Baselines")
cube.register_dimension("nchan", 16384,
description="Channels")
cube.register_array("uvw", ("ntime", "nbl", 3),
np.float64)
cube.register_array("frequency", ("nchan",),
np.float64)
cube.register_array("model_vis", ("ntime", "nbl", "nchan", 4),
np.complex128)
print cube
Registered Dimensions:
Dimension Name Description Global Size Extents
---------------- ------------- ------------- ----------
nbl Baselines 2016 (0, 2016)
nchan Channels 16384 (0, 16384)
ntime Timesteps 10000 (0, 10000)
Registered Arrays:
Array Name Size Type Shape
------------------ ------- ---------- -------------------
frequency 128.0KB float64 (nchan)
model_vis 19.2TB complex128 (ntime,nbl,nchan,4)
uvw 461.4MB float64 (ntime,nbl,3)
Local Memory Usage 19.2TB