def _split_work(load, workers, proc_id):
    """
    Uniformly distributes load over the dimension.
    Remaining load is assigned in reverse round robin manner

    Parameters
    ----------
    load : int
        load size to be assigned
    workers : int
        total processing elements work will be assigned to
    proc_id : int
        processing element for which the bound is calculated for

    Returns:
    --------
    bound : int
        low bound of the workload assigned to the worker
    """
    unifload = load // workers  # uniform distribution
    rem = load - unifload * workers

    # round-robin assignment of the remaining work
    if proc_id <= rem:
        bound = (unifload + 1) * proc_id
    else:
        bound = (unifload + 1) * rem + unifload * (proc_id - rem)

    return bound