Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a5deb14
Prototype of MultiArrayView breaking version
minhb Aug 7, 2014
e640443
break based on iterators
minhb Aug 8, 2014
834b7c5
Parallelized loop@copyMultiArrayImpl
minhb Aug 11, 2014
a83a36a
First step: Reduce overhead
minhb Aug 11, 2014
137a4b3
Wrong 'omp task wait' position
minhb Aug 11, 2014
f84bcc4
Merge pull request #1 from ukoethe/parallelization
minhb Aug 12, 2014
3642e36
Added test file to test parallel copyMultiArray function
minhb Aug 12, 2014
4e43b90
Only one thread updates the number of threads involved in parallel
minhb Aug 12, 2014
ccf5c22
Added timing, max_threads
minhb Aug 12, 2014
575b371
Removed pragma omp taskwait
minhb Aug 12, 2014
ab7a942
Parallelized initMultiArray function
minhb Aug 12, 2014
7500b8f
Added parallel version of transformMultiArray function
minhb Aug 12, 2014
2406bc1
Merge branch 'multiarrayview-testbreaking' into parallelization
minhb Aug 13, 2014
7235dba
Removed OpenMP wrapper for multi_pointoperators
minhb Aug 13, 2014
d6de230
Added parallel version of localMinMaxGraph function
minhb Aug 13, 2014
7334bd3
Added parallel version of extendedLocalMinMaxGraph function
minhb Aug 13, 2014
63452c1
Moved omp task pragma to the intense computation part
minhb Aug 14, 2014
ebf91a1
Added test for parallel version of multi_localminmax
minhb Aug 14, 2014
77ba385
Added test for parallel version of multi_localminmax
minhb Aug 14, 2014
c612380
Added test for parallel version of multi_localminmax
minhb Aug 14, 2014
16fd34e
Parallelized node iteration@boost_graph namespace
minhb Aug 14, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
253 changes: 222 additions & 31 deletions include/vigra/multi_localminmax.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -44,60 +44,248 @@
#include "multi_gridgraph.hxx"
#include "multi_labeling.hxx"
#include "metaprogramming.hxx"
#include "openmp_def.h"

namespace vigra {

namespace boost_graph {

// Attempt without LValue propmaps, using only the free functions
// to access ReadablePropertyMap (input) and WritablePropertyMap (label)
#ifdef OPENMP

//TODO: Get rid of break statement inside the parallel region?

// Attempt without LValue propmaps, using only the free functions
// to access ReadablePropertyMap (input) and WritablePropertyMap (label)
template <class Graph, class T1Map, class T2Map, class Compare>
unsigned int
localMinMaxGraph(Graph const &g,
T1Map const &src,
T2Map &dest,
typename property_traits<T2Map>::value_type marker,
typename property_traits<T1Map const>::value_type threshold,
Compare const &compare,
bool allowAtBorder = true)
{
typedef typename graph_traits<Graph>::vertex_iterator graph_scanner;
typedef typename graph_traits<Graph>::adjacency_iterator neighbor_iterator;

typedef typename property_traits<T1Map const>::value_type T1;

graph_scanner node, srcend;
neighbor_iterator arc, nbend;

unsigned int count = 0;

#pragma omp parallel shared(count)
#pragma omp single
{
tie(node, srcend) = vertices(g);

for (; node != srcend; ++node)
{
const T1 current = get(src, *node);

if (!compare(current, threshold))
continue;

if(!allowAtBorder && node.atBorder())
continue;

tie(arc, nbend) = adjacent_vertices(*node, g);

#pragma omp task firstprivate(node, current, arc, nbend)
{
for (;arc != nbend; ++arc)
if (!compare(current, get(src, *arc)))
break;

if (arc == nbend)
{
put(dest, *node, marker);
#pragma omp atomic
++count;
}
}
}
}
return count;
}

#else //#ifndef OPENMP

// Attempt without LValue propmaps, using only the free functions
// to access ReadablePropertyMap (input) and WritablePropertyMap (label)
template <class Graph, class T1Map, class T2Map, class Compare>
unsigned int
localMinMaxGraph(Graph const &g,
T1Map const &src,
T2Map &dest,
typename property_traits<T2Map>::value_type marker,
typename property_traits<T1Map const>::value_type threshold,
Compare const &compare,
bool allowAtBorder = true)
{
typedef typename graph_traits<Graph>::vertex_iterator graph_scanner;
typedef typename graph_traits<Graph>::adjacency_iterator neighbor_iterator;

typedef typename property_traits<T1Map const>::value_type T1;

graph_scanner node, srcend;
neighbor_iterator arc, nbend;

unsigned int count = 0;
tie(node, srcend) = vertices(g);
for (; node != srcend; ++node)
{
const T1 current = get(src, *node);

if (!compare(current, threshold))
continue;

if(!allowAtBorder && node.atBorder())
continue;

tie(arc, nbend) = adjacent_vertices(*node, g);
for (;arc != nbend; ++arc)
if (!compare(current, get(src, *arc)))
break;

if (arc == nbend)
{
put(dest, *node, marker);
++count;
}
}
return count;
}

#endif //#ifdef OPENMP

} // namespace boost_graph

namespace lemon_graph {

#ifdef OPENMP

//TODO: Get rid of break statement inside the parallel region?
template <class Graph, class T1Map, class T2Map, class Compare>
unsigned int
localMinMaxGraph(Graph const &g,
T1Map const &src,
T2Map &dest,
typename property_traits<T2Map>::value_type marker,
typename property_traits<T1Map const>::value_type threshold,
typename T2Map::value_type marker,
typename T1Map::value_type threshold,
Compare const &compare,
bool allowAtBorder = true)
{
typedef typename graph_traits<Graph>::vertex_iterator graph_scanner;
typedef typename graph_traits<Graph>::adjacency_iterator neighbor_iterator;

typedef typename property_traits<T1Map const>::value_type T1;

graph_scanner node, srcend;
neighbor_iterator arc, nbend;
typedef typename Graph::NodeIt graph_scanner;
typedef typename Graph::OutArcIt neighbor_iterator;

unsigned int count = 0;
tie(node, srcend) = vertices(g);
for (; node != srcend; ++node)
{
const T1 current = get(src, *node);

if (!compare(current, threshold))
continue;

if(!allowAtBorder && node.atBorder())
continue;

tie(arc, nbend) = adjacent_vertices(*node, g);
for (;arc != nbend; ++arc)
if (!compare(current, get(src, *arc)))
break;

if (arc == nbend)
#pragma omp parallel shared(count)
#pragma omp single
{
for (graph_scanner node(g); node != INVALID; ++node)
{
put(dest, *node, marker);
++count;
typename T1Map::value_type current = src[*node];

if (!compare(current, threshold))
continue;

if(!allowAtBorder && node.atBorder())
continue;

#pragma omp task firstprivate(node, current)
{
neighbor_iterator arc(g, node);

for (; arc != INVALID; ++arc)
if (!compare(current, src[g.target(*arc)]))
break;

if (arc == INVALID)
{
dest[*node] = marker;
#pragma omp atomic
++count;
}
}
}
}
return count;
}

} // namespace boost_graph

namespace lemon_graph {
//TODO: Get rid of break statement inside the parallel region?
template <class Graph, class T1Map, class T2Map, class Compare, class Equal>
unsigned int
extendedLocalMinMaxGraph(Graph const &g,
T1Map const &src,
T2Map &dest,
typename T2Map::value_type marker,
typename T1Map::value_type threshold,
Compare const &compare,
Equal const &equal,
bool allowAtBorder = true)
{
typename Graph::template NodeMap<unsigned int> regions(g);

int max_region_label = labelGraph(g, src, regions, equal);

// assume that a region is a extremum until the opposite is proved
std::vector<unsigned char> isExtremum(max_region_label+1, (unsigned char)1);

typedef typename Graph::NodeIt graph_scanner;
typedef typename Graph::OutArcIt neighbor_iterator;

unsigned int count = max_region_label;

#pragma omp parallel shared(count)
#pragma omp single
{
for (graph_scanner node(g); node != INVALID; ++node)
{
unsigned int label = regions[*node];

if(!isExtremum[label])
continue;

typename T1Map::value_type current = src[*node];

if (!compare(current, threshold) ||
(!allowAtBorder && node.atBorder()))
{
isExtremum[label] = 0;
--count;
continue;
}

#pragma omp task firstprivate(node, label, current)
{
for (neighbor_iterator arc(g, node); arc != INVALID; ++arc)
{
if (label != regions[g.target(*arc)] && compare(src[g.target(*arc)], current))
{
isExtremum[label] = 0;
#pragma omp atomic
--count;
break;
}
}
}
}
}

for (graph_scanner node(g); node != INVALID; ++node)
{
if(isExtremum[regions[*node]])
dest[*node] = marker;
}
return count;
}

#else //#ifndef OPENMP

template <class Graph, class T1Map, class T2Map, class Compare>
unsigned int
Expand Down Expand Up @@ -137,6 +325,7 @@ localMinMaxGraph(Graph const &g,
return count;
}


template <class Graph, class T1Map, class T2Map, class Compare, class Equal>
unsigned int
extendedLocalMinMaxGraph(Graph const &g,
Expand Down Expand Up @@ -194,6 +383,8 @@ extendedLocalMinMaxGraph(Graph const &g,
return count;
}

#endif //#ifdef OPENMP

} // namespace lemon_graph

template <unsigned int N, class T1, class C1,
Expand Down
Loading