• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1.. Copyright (C) 2004-2008 The Trustees of Indiana University.
2   Use, modification and distribution is subject to the Boost Software
3   License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
4   http://www.boost.org/LICENSE_1_0.txt)
5
6===============================
7|Logo| Distributed Property Map
8===============================
9
10A distributed property map adaptor is a property map whose stored
11values are distributed across multiple non-overlapping memory spaces
12on different processes. Values local to the current process are stored
13within a local property map and may be immediately accessed via
14``get`` and ``put``. Values stored on remote processes may also be
15accessed via ``get`` and ``put``, but the behavior differs slightly:
16
17 - ``put`` operations update a local ghost cell and send a "put"
18   message to the process that owns the value. The owner is free to
19   update its own "official" value or may ignore the put request.
20
21 - ``get`` operations returns the contents of the local ghost
22   cell. If no ghost cell is available, one is created using a
23   (customizable) default value.
24
25Using distributed property maps requires a bit more care than using
26local, sequential property maps. While the syntax and semantics are
27similar, distributed property maps may contain out-of-date
28information that can only be guaranteed to be synchronized by
29calling the ``synchronize`` function in all processes.
30
31To address the issue of out-of-date values, distributed property
32maps support multiple `consistency models`_ and may be supplied with a
33`reduction operation`_.
34
35Distributed property maps meet the requirements of the `Readable
36Property Map`_ and, potentially, the `Writable Property Map`_ and
37`Read/Write Property Map`_ concepts. Distributed property maps do
38*not*, however, meet the requirements of the `Lvalue Property Map`_
39concept, because elements residing in another process are not
40directly addressible. There are several forms of distributed property
41maps:
42
43  - `Distributed property map adaptor`_
44  - `Distributed iterator property map`_
45  - `Distributed safe iterator property map`_
46  - `Local property map`_
47
48------------------
49Consistency models
50------------------
51
52Distributed property maps offer many consistency models, which affect
53how the values read from and written to remote keys relate to the
54"official" value for that key stored in the owning process. The
55consistency model of a distributed property map can be set with the
56member function ``set_consistency_model`` to a bitwise-OR of the
57flags in the ``boost::parallel::consistency_model`` enumeration. The
58individual flags are:
59
60  - ``cm_forward``: The default consistency model, which propagates
61    values forward from ``put`` operations on remote processors to
62    the owner of the value being changed.
63
64  - ``cm_backward``: After all values have been forwarded or flushed
65    to the owning processes, each process receives updates values for
66    each of its ghost cells. After synchronization, the values in
67    ghost cells are guaranteed to match the values stored on the
68    owning processor.
69
70  - ``cm_bidirectional``: A combination of both ``cm_forward`` and
71    ``cm_backward``.
72
73  - ``cm_flush``: At the beginning of synchronization, all of the
74    values stored locally in ghost cells are sent to their owning
75    processors.
76
77  - ``cm_reset``: Executes a ``reset()`` operation after
78    synchronization, setting the values in each ghost cell to their
79    default value.
80
81  - ``cm_clear``: Executes a ``clear()`` operation after
82    synchronizing, eliminating all ghost cells.
83
84
85There are several common combinations of flags that result in
86interesting consistency models. Some of these combinations are:
87
88  - ``cm_forward``: By itself, the forward consistency model enables
89    algorithms such as `Dijkstra's shortest paths`_ and
90    `Breadth-First Search`_ to operate correctly.
91
92  - ``cm_flush & cm_reset``: All updates values are queued locally,
93    then flushed during the synchronization step. Once the flush has
94    occurred, the ghost cells are restored to their default
95    values. This consistency model is used by the PageRank_
96    implementation to locally accumulate rank for each node.
97
98
99-------------------
100Reduction operation
101-------------------
102
103The reduction operation maintains consistency by determining how
104multiple writes to a property map are resolved and what the property
105map should do if unknown values are requested. More specifically, a
106reduction operation is used in two cases:
107
108  1. When a value is needed for a remote key but no value is
109     immediately available, the reduction operation provides a
110     suitable default. For instance, a distributed property map
111     storing distances may have a reduction operation that returns
112     an infinite value as the default, whereas a distributed
113     property map for vertex colors may return white as the
114     default.
115
116  2. When a value is received from a remote process, the process
117     owning the key associated with that value must determine which
118     value---the locally stored value, the value received from a
119     remote process, or some combination of the two---will be
120     stored as the "official" value in the property map. The
121     reduction operation transforms the local and remote values
122     into the "official" value to be stored.
123
124The reduction operation of a distributed property map can be set with
125the ``set_reduce`` method of ``distributed_property_map``. The reduce
126operation is a function object with two signatures. The first
127signature takes a (remote) key and returns a default value for it,
128whereas the second signatures takes a key and two values (local first,
129then remote) and will return the combined value that will be stored in
130the local property map.  Reduction operations must also contain a
131static constant ``non_default_resolver", which states whether the
132reduction operation's default value actually acts like a default
133value. It should be ``true`` when the default is meaningful (e.g.,
134infinity for a distance) and ``false`` when the default should not be
135used.
136
137The following reduction operation is used by the distributed PageRank
138algorithm. The default rank for a remote node is 0. Rank is
139accumulated locally, and then the reduction operation combines local
140and remote values by adding them. Combined with a consistency model
141that flushes all values to the owner and then resets the values
142locally in each step, the resulting property map will compute partial
143sums on each processor and then accumulate the results on the owning
144processor. The PageRank reduction operation is defined as follows.
145
146::
147
148  template<typename T>
149  struct rank_accumulate_reducer {
150    static const bool non_default_resolver = true;
151
152    // The default rank of an unknown node
153    template<typename K>
154    T operator()(const K&) const { return T(0); }
155
156    template<typename K>
157    T operator()(const K&, const T& x, const T& y) const { return x + y; }
158  };
159
160
161--------------------------------
162Distributed property map adaptor
163--------------------------------
164
165The distributed property map adaptor creates a distributed property
166map from a local property map, a `process group`_ over which
167distribution should occur, and a `global descriptor`_ type that
168indexes the distributed property map.
169
170
171Synopsis
172~~~~~~~~
173
174::
175
176  template<typename ProcessGroup, typename LocalPropertyMap, typename Key,
177           typename GhostCellS = gc_mapS>
178  class distributed_property_map
179  {
180  public:
181    typedef ... ghost_regions_type;
182
183    distributed_property_map();
184
185    distributed_property_map(const ProcessGroup& pg,
186                             const LocalPropertyMap& pm);
187
188    template<typename Reduce>
189    distributed_property_map(const ProcessGroup& pg,
190                             const LocalPropertyMap& pm,
191                             const Reduce& reduce);
192
193    template<typename Reduce> void set_reduce(const Reduce& reduce);
194    void set_consistency_model(int model);
195
196    void flush();
197    void reset();
198    void clear();
199  };
200
201  reference get(distributed_property_map pm, const key_type& key);
202
203  void
204  put(distributed_property_map pm, const key_type& key, const value_type& value);
205  local_put(distributed_property_map pm, const key_type& key, const value_type& value);
206
207  void request(distributed_property_map pm, const key_type& key);
208
209  void synchronize(distributed_property_map& pm);
210
211  template<typename Key, typename ProcessGroup, typename LocalPropertyMap>
212  distributed_property_map<ProcessGroup, LocalPropertyMap, Key>
213  make_distributed_property_map(const ProcessGroup& pg, LocalPropertyMap pmap);
214
215  template<typename Key, typename ProcessGroup, typename LocalPropertyMap,
216           typename Reduce>
217  distributed_property_map<ProcessGroup, LocalPropertyMap, Key>
218  make_distributed_property_map(const ProcessGroup& pg, LocalPropertyMap pmap,
219                                Reduce reduce);
220
221Template parameters
222~~~~~~~~~~~~~~~~~~~
223
224**ProcessGroup**:
225  The type of the process group over which the
226  property map is distributed and is also the medium for
227  communication.
228
229
230**LocalPropertyMap**:
231  The type of the property map that will store values
232  for keys local to this processor. The ``value_type`` of this
233  property map will become the ``value_type`` of the distributed
234  property map. The distributed property map models the same property
235  map concepts as the ``LocalPropertyMap``, with one exception: a
236  distributed property map cannot be an `Lvalue Property Map`_
237  (because remote values are not addressable), and is therefore
238  limited to `Read/Write Property Map`_.
239
240
241**Key**:
242  The ``key_type`` of the distributed property map, which
243  must model the `Global Descriptor`_ concept. The process ID type of
244  the ``Key`` parameter must match the process ID type of the
245  ``ProcessGroup``, and the local descriptor type of the ``Key`` must
246  be convertible to the ``key_type`` of the ``LocalPropertyMap``.
247
248
249**GhostCellS**:
250  A selector type that indicates how ghost cells should be stored in
251  the distributed property map. There are either two or three
252  options, depending on your compiler:
253
254    - ``boost::parallel::gc_mapS`` (default): Uses an STL ``map`` to
255      store the ghost cells for each process.
256
257    - ``boost::parallel::gc_vector_mapS``: Uses a sorted STL
258      ``vector`` to store the ghost cells for each process. This
259      option works well when there are likely to be few insertions
260      into the ghost cells; for instance, if the only ghost cells used
261      are for neighboring vertices, the property map can be
262      initialized with cells for each neighboring vertex, providing
263      faster lookups than a ``map`` and using less space.
264
265    - ``boost::parallel::gc_hash_mapS``: Uses the GCC ``hash_map`` to
266      store ghost cells. This option may improve performance over
267      ``map`` for large problems sizes, where the set of ghost cells
268      cannot be predetermined.
269
270
271Member functions
272~~~~~~~~~~~~~~~~
273
274::
275
276  distributed_property_map();
277
278Default-construct a distributed property map. The property map is in
279an invalid state, and may only be used if it is reassigned to a valid
280property map.
281
282------------------------------------------------------------------------------
283
284::
285
286    distributed_property_map(const ProcessGroup& pg,
287                             const LocalPropertyMap& pm);
288
289    template<typename Reduce>
290    distributed_property_map(const ProcessGroup& pg,
291                             const LocalPropertyMap& pm,
292                             const Reduce& reduce);
293
294Construct a property map from a process group and a local property
295map. If a ``reduce`` operation is not supplied, a default of
296``basic_reduce<value_type>`` will be used.
297
298------------------------------------------------------------------------------
299
300::
301
302  template<typename Reduce> void set_reduce(const Reduce& reduce);
303
304Replace the current reduction operation with the new operation
305``reduce``.
306
307------------------------------------------------------------------------------
308
309::
310
311  void set_consistency_model(int model);
312
313Sets the consistency model of the distributed property map, which will
314take effect on the next synchronization step. See the section
315`Consistency models`_ for a description of the effect of various
316consistency model flags.
317
318------------------------------------------------------------------------------
319
320::
321
322  void flush();
323
324Emits a message sending the contents of all local ghost cells to the
325owners of those cells.
326
327------------------------------------------------------------------------------
328
329::
330
331  void reset();
332
333Replaces the values stored in each of the ghost cells with the default
334value generated by the reduction operation.
335
336------------------------------------------------------------------------------
337
338::
339
340  void clear();
341
342Removes all ghost cells from the property map.
343
344
345Free functions
346~~~~~~~~~~~~~~
347
348::
349
350  reference get(distributed_property_map pm, const key_type& key);
351
352Retrieves the element in ``pm`` associated with the given ``key``. If
353the key refers to data stored locally, returns the actual value
354associated with the key. If the key refers to nonlocal data, returns
355the value of the ghost cell. If no ghost cell exists, the behavior
356depends on the current reduction operation: if a reduction operation
357has been set and has ``non_default_resolver`` set ``true``, then a
358ghost cell will be created according to the default value provided by
359the reduction operation. Otherwise, the call to ``get`` will abort
360because no value exists for this remote cell. To avoid this problem,
361either set a reduction operation that generates default values,
362``request()`` the value and then perform a synchronization step, or
363``put`` a value into the cell before reading it.
364
365------------------------------------------------------------------------------
366
367::
368
369  void
370  put(distributed_property_map pm, const key_type& key, const value_type& value);
371
372Places the given ``value`` associated with ``key`` into property map
373``pm``. If the key refers to data stored locally, the value is
374immediately updates. If the key refers to data stored in a remote
375process, updates (or creates) a local ghost cell containing this
376value for the key and sends the new value to the owning process. Note
377that the owning process may reject this value based on the reduction
378operation, but this will not be detected until the next
379synchronization step.
380
381------------------------------------------------------------------------------
382
383::
384
385  void
386  local_put(distributed_property_map pm, const key_type& key, const value_type& value);
387
388Equivalent to ``put(pm, key, value)``, except that no message is sent
389to the owning process when the value is changed for a nonlocal key.
390
391------------------------------------------------------------------------------
392
393::
394
395  void synchronize(distributed_property_map& pm);
396
397Synchronize the values stored in the distributed property maps. Each
398process much execute ``synchronize`` at the same time, after which
399the ghost cells in every process will reflect the actual value stored
400in the owning process.
401
402------------------------------------------------------------------------------
403
404::
405
406 void request(distributed_property_map pm, const key_type& key);
407
408Request that the element "key" be available after the next
409synchronization step. For a non-local key, this means establishing a
410ghost cell and requesting.
411
412------------------------------------------------------------------------------
413
414::
415
416  template<typename Key, typename ProcessGroup, typename LocalPropertyMap>
417  distributed_property_map<ProcessGroup, LocalPropertyMap, Key>
418  make_distributed_property_map(const ProcessGroup& pg, LocalPropertyMap pmap);
419
420  template<typename Key, typename ProcessGroup, typename LocalPropertyMap,
421           typename Reduce>
422  distributed_property_map<ProcessGroup, LocalPropertyMap, Key>
423  make_distributed_property_map(const ProcessGroup& pg, LocalPropertyMap pmap,
424                                Reduce reduce);
425
426Create a distributed property map over process group ``pg`` and local
427property map ``pmap``. A default reduction operation will be generated
428if it is not provided.
429
430---------------------------------
431Distributed iterator property map
432---------------------------------
433
434The distributed iterator property map adaptor permits the creation of
435distributed property maps from random access iterators using the same
436syntax as non-distributed iterator property maps. The specialization
437is based on a `local property map`_, which contains the
438indices for local descriptors and is typically returned to describe
439the vertex indices of a distributed graph.
440
441Synopsis
442~~~~~~~~
443
444::
445
446  template<typename RandomAccessIterator, typename ProcessGroup,
447           typename GlobalKey, typename LocalMap, typename ValueType,
448           typename Reference>
449  class iterator_property_map<RandomAccessIterator,
450                              local_property_map<ProcessGroup, GlobalKey, LocalMap>,
451                              ValueType, Reference>
452  {
453  public:
454    typedef local_property_map<ProcessGroup, GlobalKey, LocalMap> index_map_type;
455
456    iterator_property_map();
457    iterator_property_map(RandomAccessIterator iter, const index_map_type& id);
458  };
459
460  reference get(iterator_property_map pm, const key_type& key);
461  void put(iterator_property_map pm, const key_type& key, const value_type& value);
462
463  template<typename RandomAccessIterator, typename ProcessGroup,
464           typename GlobalKey, typename LocalMap>
465  iterator_property_map<RandomAccessIterator,
466                        local_property_map<ProcessGroup, GlobalKey, LocalMap> >
467  make_iterator_property_map(RandomAccessIterator iter,
468                             local_property_map<ProcessGroup, GlobalKey, LocalMap> id);
469
470
471Member functions
472~~~~~~~~~~~~~~~~
473
474::
475
476    iterator_property_map();
477
478Default-constructs a distributed iterator property map. The property
479map is in an invalid state, and must be reassigned before it may be
480used.
481
482------------------------------------------------------------------------------
483
484::
485
486    iterator_property_map(RandomAccessIterator iter, const index_map_type& id);
487
488Constructs a distributed iterator property map using the property map
489``id`` to map global descriptors to local indices. The random access
490iterator sequence ``[iter, iter + n)`` must be a valid range, where
491``[0, n)`` is the range of local indices.
492
493Free functions
494~~~~~~~~~~~~~~
495
496::
497
498  reference get(iterator_property_map pm, const key_type& key);
499
500Returns the value associated with the given ``key`` from the
501distributed property map.
502
503------------------------------------------------------------------------------
504
505::
506
507  void put(iterator_property_map pm, const key_type& key, const value_type& value);
508
509Associates the value with the given key in the distributed property map.
510
511------------------------------------------------------------------------------
512
513::
514
515  template<typename RandomAccessIterator, typename ProcessGroup,
516           typename GlobalKey, typename LocalMap, typename ValueType,
517           typename Reference>
518  iterator_property_map<RandomAccessIterator,
519                        local_property_map<ProcessGroup, GlobalKey, LocalMap>,
520                                           ValueType, Reference>
521  make_iterator_property_map(RandomAccessIterator iter,
522                             local_property_map<ProcessGroup, GlobalKey, LocalMap>,
523                                                ValueType, Reference> id);
524
525Creates a distributed iterator property map using the given iterator
526``iter`` and local index property map ``id``.
527
528--------------------------------------
529Distributed safe iterator property map
530--------------------------------------
531
532The distributed safe iterator property map adaptor permits the
533creation of distributed property maps from random access iterators
534using the same syntax as non-distributed safe iterator property
535maps. The specialization is based on a `local property map`_, which
536contains the indices for local descriptors and is typically returned
537to describe the vertex indices of a distributed graph. Safe iterator
538property maps check the indices of accesses to ensure that they are
539not out-of-bounds before attempting to access an value.
540
541Synopsis
542~~~~~~~~
543
544::
545
546  template<typename RandomAccessIterator, typename ProcessGroup,
547           typename GlobalKey, typename LocalMap, typename ValueType,
548           typename Reference>
549  class safe_iterator_property_map<RandomAccessIterator,
550                                   local_property_map<ProcessGroup, GlobalKey, LocalMap>,
551                                   ValueType, Reference>
552  {
553  public:
554    typedef local_property_map<ProcessGroup, GlobalKey, LocalMap> index_map_type;
555
556    safe_iterator_property_map();
557    safe_iterator_property_map(RandomAccessIterator iter, std::size_t n,
558                               const index_map_type& id);
559  };
560
561  reference get(safe_iterator_property_map pm, const key_type& key);
562  void put(safe_iterator_property_map pm, const key_type& key, const value_type& value);
563
564  template<typename RandomAccessIterator, typename ProcessGroup,
565           typename GlobalKey, typename LocalMap, typename ValueType,
566           typename Reference>
567  safe_iterator_property_map<RandomAccessIterator,
568                             local_property_map<ProcessGroup, GlobalKey, LocalMap>,
569                                                ValueType, Reference>
570  make_safe_iterator_property_map(RandomAccessIterator iter,
571                                  std::size_t n,
572                                  local_property_map<ProcessGroup, GlobalKey, LocalMap>,
573                                                     ValueType, Reference> id);
574
575Member functions
576~~~~~~~~~~~~~~~~
577
578::
579
580    safe_iterator_property_map();
581
582Default-constructs a distributed safe iterator property map. The property
583map is in an invalid state, and must be reassigned before it may be
584used.
585
586------------------------------------------------------------------------------
587
588::
589
590    safe_iterator_property_map(RandomAccessIterator iter, std::size_t n,
591                               const index_map_type& id);
592
593Constructs a distributed safe iterator property map using the property map
594``id`` to map global descriptors to local indices. The random access
595iterator sequence ``[iter, iter + n)``.
596
597Free functions
598~~~~~~~~~~~~~~
599
600::
601
602  reference get(safe_iterator_property_map pm, const key_type& key);
603
604Returns the value associated with the given ``key`` from the
605distributed property map.
606
607------------------------------------------------------------------------------
608
609::
610
611  void put(safe_iterator_property_map pm, const key_type& key, const value_type& value);
612
613Associates the value with the given key in the distributed property map.
614
615------------------------------------------------------------------------------
616
617::
618
619  template<typename RandomAccessIterator, typename ProcessGroup,
620           typename GlobalKey, typename LocalMap, typename ValueType,
621           typename Reference>
622  safe_iterator_property_map<RandomAccessIterator,
623                             local_property_map<ProcessGroup, GlobalKey, LocalMap>,
624                                                ValueType, Reference>
625  make_safe_iterator_property_map(RandomAccessIterator iter,
626                                  std::size_t n,
627                                  local_property_map<ProcessGroup, GlobalKey, LocalMap>,
628                                                     ValueType, Reference> id);
629
630Creates a distributed safe iterator property map using the given iterator
631``iter`` and local index property map ``id``. The indices in ``id`` must
632
633------------------
634Local property map
635------------------
636
637A property map adaptor that accesses an underlying property map whose
638key type is the local part of the ``Key`` type for the local subset
639of keys. Local property maps are typically used by distributed graph
640types for vertex index properties.
641
642Synopsis
643~~~~~~~~
644
645::
646
647  template<typename ProcessGroup, typename GlobalKey, typename LocalMap>
648    class local_property_map
649    {
650    public:
651    typedef typename property_traits<LocalMap>::value_type value_type;
652    typedef GlobalKey                                      key_type;
653    typedef typename property_traits<LocalMap>::reference  reference;
654    typedef typename property_traits<LocalMap>::category   category;
655
656    explicit
657    local_property_map(const ProcessGroup& process_group = ProcessGroup(),
658                       const LocalMap& local_map = LocalMap());
659
660    reference operator[](const key_type& key);
661  };
662
663  reference get(const local_property_map& pm, key_type key);
664  void put(local_property_map pm, const key_type& key, const value_type& value);
665
666Template parameters
667~~~~~~~~~~~~~~~~~~~
668
669:ProcessGroup: the type of the process group over which the global
670  keys are distributed.
671
672:GlobalKey: The ``key_type`` of the local property map, which
673  must model the `Global Descriptor`_ concept. The process ID type of
674  the ``GlobalKey`` parameter must match the process ID type of the
675  ``ProcessGroup``, and the local descriptor type of the ``GlobalKey``
676  must be convertible to the ``key_type`` of the ``LocalMap``.
677
678:LocalMap: the type of the property map that will store values
679  for keys local to this processor. The ``value_type`` of this
680  property map will become the ``value_type`` of the local
681  property map. The local property map models the same property
682  map concepts as the ``LocalMap``.
683
684Member functions
685~~~~~~~~~~~~~~~~
686
687::
688
689  explicit
690  local_property_map(const ProcessGroup& process_group = ProcessGroup(),
691                     const LocalMap& local_map = LocalMap());
692
693Constructs a local property map whose keys are distributed across the
694given process group and which accesses the given local map.
695
696------------------------------------------------------------------------------
697
698::
699
700  reference operator[](const key_type& key);
701
702Access the value associated with the given key, which must be local
703to this process.
704
705Free functions
706~~~~~~~~~~~~~~
707
708::
709
710  reference get(const local_property_map& pm, key_type key);
711
712Return the value associated with the given key, which must be local
713to this process.
714
715------------------------------------------------------------------------------
716
717::
718
719  void put(local_property_map pm, const key_type& key, const value_type& value);
720
721Set the value associated with the given key, which must be local to
722this process.
723
724-----------------------------------------------------------------------------
725
726Copyright (C) 2004, 2005 The Trustees of Indiana University.
727
728Authors: Douglas Gregor and Andrew Lumsdaine
729
730.. |Logo| image:: pbgl-logo.png
731            :align: middle
732            :alt: Parallel BGL
733            :target: http://www.osl.iu.edu/research/pbgl
734
735.. _Readable Property Map: http://www.boost.org/libs/property_map/ReadablePropertyMap.html
736.. _Writable Property Map: http://www.boost.org/libs/property_map/WritablePropertyMap.html
737.. _Read/Write Property Map: http://www.boost.org/libs/property_map/ReadWritePropertyMap.html
738.. _Lvalue Property Map: http://www.boost.org/libs/property_map/LvaluePropertyMap.html
739.. _Process Group: process_group.html
740.. _Global Descriptor: GlobalDescriptor.html
741.. _Dijkstra's shortest paths: dijkstra_shortest_paths.html
742.. _Breadth-First Search: breadth_first_search.html
743.. _PageRank: page_rank.html
744
745