The high-level strategy of our connected components algorithm uses the well-known divide and conquer technique. Divide and conquer algorithms typically use a recursive strategy to split problems into smaller subproblems and, given the solutions to these subproblems, merge the results into the final solution. It is common to have either an easy splitting algorithm and a more complicated merging, or vice versa, a hard splitting, following by easy merging. In our parallel connected components algorithm, the splitting phase is trivial and implicit, while the merging process requires more work.
Each processor holds a unique tile of the image, and hence can find
the initial connected components of its tile by using a standard
sequential algorithm based upon breadth-first search. Next, the
algorithm iterates times
, alternating between combining the tiles in
horizontal merges of vertical borders and vertical merges
of horizontal borders. Our algorithm uses novel techniques to perform
the merges and to update the labels. We will attempt to give an
overview of this algorithm; for a complete description, see
[4].
We merge the p subimages into larger and larger image sections with
consistent labelings. There will be iterations since we cut
the number of uncombined subimages in half during each iteration.
Unlike previous connected components algorithms, we use a technique
which identifies processors as group managers or clients
during each phase. The group managers have the task of organizing the
retrieval of boundary data, performing the merge, and creating the
list of label changes. Once the group managers broadcast these changes
to their respective clients, all processors must use the information
to update their tile hooks, data structures which point to
connected components on local tile borders. See
Figure 4 for an illustration of the tile hook data
structure in which three tile hooks contain the information needed to
update the border pixels. The clients assist the group managers by
participating in the coalescing of data during each merge phase.
Finally, the complete relabeling is performed at the very end using
information from the tile hooks.
Without loss of generality, we first perform a horizontal merge along
every other vertical border, then a vertical merge along every other
horizontal border, alternating orientation until we have merged all
the tiles into one consistent labeling. We merge vertical borders
exactly times, where w is the number of columns in the
logical processor grid. Similarly, we merge horizontal borders
exactly
times, where v is the number of rows in the logical
processor grid.
During each merge, a subset of the processors will act as group
managers. These designated processors will prefetch the necessary
border information along the column (or row) that they are located
upon in the logical processor grid, setting up an equivalent graph
problem, running a sequential connected components algorithm on the
graph, noting any changes in the labels, and storing these changes
( pairs) in a shared structure. The
clients decide who their current group manager is and wait until the
list of label changes is ready. They retrieve the list, and all
processors make the necessary updates to a proper subset of their
labels.
The merging problem is converted into finding the connected components
of a graph represented by the border pixels. We use an adjacency list
representation for the graph, and add vertices to the graph
representing colored pixels. Two types of edges are added to the
graph. First, pixels are scanned down the left (or upper) border, and
edges are strung linearly down the list between pixels containing the
same connected component label. The same is done for pixels on the
right (or lower) border. The second step adds edges between pixels of
the left (upper) and right (lower) border which are adjacent to each
other and differ by no greater than in grey level. We scan
down the left column (upper row) elements, and if we are at a colored
pixel, we check the pixels in the right column (lower row) adjacent to
it. In order to add the first type of edges, the pixels are sorted
according to their label for both the left (upper) and right (lower)
border by using radix sort
. A secondary processor is used to prefetch and sort the
border elements on the opposite side of the border from the group
manager, and the results are then sent to the group manager.
Figure 4: An example of Tile Hooks
At the conclusion of each of the merging steps, only the
labels of pixels on the border of each tile are updated. There is no
need to relabel interior pixels since they are not used in the merging
stage. Only boundary pixels need their labels updated. Taking
advantage of this, we do not need to propagate boundary labels inward
to recolor a tile's interior pixels after each iteration of the merge.
This is one of the attractive highlights of our newly proposed
algorithm; namely, the drastically limited updates needed during the
merging phase.
At the end of the last merging step, each processor must update its
interior pixel labels. Each hook described above is compared to the
current label at the hook's offset position index. If the hook's label
is different from the current label at position
i, the processor will run a breadth-first search relabeling
technique beginning at pixel i, relabeling all the connected pixels'
labels to the new label.