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