コード例 #1
0
ファイル: Slot_Allocator.hpp プロジェクト: Cincinesh/reyk
 Slot allocate_slot(Id id) {
     if (id > id_to_slot_map_.length()) id_to_slot_map_.resize(id);
     const Slot slot = (Slot) slot_to_id_map_.length();
     slot_to_id_map_.emplace_back(id);
     id_to_slot_map_[id - 1] = slot;
     return slot;
 }
コード例 #2
0
void
component_leaders(
    Graph& g, const ComponentMap& C,
    dynamic_array<typename graph_traits<Graph>::vertex_descriptor>& leaders)
{
  #pragma mta noalias g
  #pragma mta noalias C
  #pragma mta noalias leaders

  typedef typename graph_traits<Graph>::size_type size_type;
  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
  typedef typename graph_traits<Graph>::thread_vertex_iterator
          thread_vertex_iterator;

  size_type order = num_vertices(g);

  size_type* rcount = (size_type*) malloc(order * sizeof(size_type));
  for (size_type i = 0; i < order; ++i) rcount[i] = 0;

  size_type stream_id = 0;
  size_type num_streams = 1;

  // Count the number of vertices in each component.
  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(order, stream_id, num_streams);
    size_type end_pos = end_block_range(order, stream_id, num_streams);

    thread_vertex_iterator verts = thread_vertices(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++verts)
    {
      mt_incr(rcount[C[*verts]], 1);
    }
  }

  size_type num_components = 0;

  // Count the number of components.
  #pragma mta assert nodep
  for (size_type i = 0; i < order; ++i)
  {
    if (rcount[i] > 0) mt_incr(num_components, 1);
  }

  // Resize the leaders array.
  leaders.resize(num_components);

  num_components = 0;

  // Put the leaders for each component in the leaders array.
  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(order, stream_id, num_streams);
    size_type end_pos = end_block_range(order, stream_id, num_streams);

    thread_vertex_iterator verts = thread_vertices(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++verts)
    {
      if (rcount[start_pos] > 0)
      {
        size_type pos = mt_incr(num_components, 1);
        leaders[pos] = *verts;
      }
    }
  }

  free(rcount);
}