Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Sbalzarini Lab
S
Software
P
Parallel Computing
OpenFPM
openfpm_pdata
Commits
9cc682a6
Commit
9cc682a6
authored
Mar 05, 2015
by
incardon
Browse files
Distributed grid fixed
parent
5f01bfc3
Changes
10
Hide whitespace changes
Inline
Side-by-side
configure.ac
View file @
9cc682a6
...
...
@@ -113,6 +113,12 @@ AM_CONDITIONAL(BUILDCUDA, test ! x$NVCC = x"no")
###########################
# Define that there is MPI
AC_DEFINE([HAVE_MPI],[],[MPI Enabled])
#####
no_avx=no
no_sse42=no
no_sse41=no
...
...
src/CartesianGraphFactory_unit_test.hpp
deleted
100644 → 0
View file @
5f01bfc3
#ifndef CARTESIAN_GRAPH_UNIT_TEST_HPP
#define CARTESIAN_GRAPH_UNIT_TEST_HPP
#include "Graph/CartesianGraphFactory.hpp"
#include "map_graph.hpp"
#define GS_SIZE 8
/*!
*
* Test node
*
*/
struct
node_cp
{
//! The node contain 3 unsigned long integer for comunication computation and memory
typedef
boost
::
fusion
::
vector
<
size_t
,
size_t
,
size_t
>
type
;
//! Attributes name
struct
attributes
{
static
const
std
::
string
name
[];
};
//! The data
type
data
;
//! communication property id in boost::fusion::vector
static
const
unsigned
int
communication
=
0
;
//! computation property id in boost::fusion::vector
static
const
unsigned
int
computation
=
1
;
//! memory property id in boost::fusion::vector
static
const
unsigned
int
memory
=
2
;
//! total number of properties boost::fusion::vector
static
const
unsigned
int
max_prop
=
3
;
};
const
std
::
string
node_cp
::
attributes
::
name
[]
=
{
"communication"
,
"computation"
,
"memory"
};
BOOST_AUTO_TEST_SUITE
(
CartesianGraphFactory_test
)
BOOST_AUTO_TEST_CASE
(
CartesianGraphFactory_use
)
{
typedef
node_cp
node
;
CartesianGraphFactory
<
3
,
Graph_CSR
<
Point_test
<
float
>
,
Point_test
<
float
>>>
g_factory
;
// Cartesian grid
size_t
sz
[
3
]
=
{
GS_SIZE
,
GS_SIZE
,
GS_SIZE
};
// Box
Box
<
3
,
float
>
box
({
0.0
,
0.0
,
0.0
},{
1.0
,
1.0
,
1.0
});
Graph_CSR
<
Point_test
<
float
>
,
Point_test
<
float
>>
g
=
g_factory
.
construct
<
node
::
communication
,
float
,
2
>
(
sz
,
box
);
}
BOOST_AUTO_TEST_SUITE_END
()
#endif
src/Decomposition/CartDecomposition.hpp
View file @
9cc682a6
...
...
@@ -10,11 +10,10 @@
#include "config.h"
#include "Decomposition.hpp"
#include "map_vector.hpp"
#include "
Vector/
map_vector.hpp"
#include <vector>
#include "global_const.hpp"
#include <initializer_list>
#include "map_vector.hpp"
#include "SubdomainGraphNodes.hpp"
#include "metis_util.hpp"
#include "dec_optimizer.hpp"
...
...
@@ -106,11 +105,11 @@ private:
// Here we use METIS
// Create a cartesian grid graph
CartesianGraphFactory
<
dim
,
Graph_CSR
<
nm_
v
,
nm
_e
>>
g_factory_part
;
CartesianGraphFactory
<
dim
,
Graph_CSR
<
nm_
part_v
,
nm_part
_e
>>
g_factory_part
;
// Processor graph
Graph_CSR
<
nm_
v
,
nm
_e
>
gp
=
g_factory_part
.
template
construct
<
NO_EDGE
,
T
,
dim
-
1
,
0
,
1
>(
div
,
domain
);
Graph_CSR
<
nm_
part_v
,
nm_part
_e
>
gp
=
g_factory_part
.
template
construct
<
NO_EDGE
,
T
,
dim
-
1
>(
div
,
domain
);
// Get the number of processing units
size_t
Np
=
v_cl
.
getProcessingUnits
();
...
...
@@ -119,33 +118,22 @@ private:
long
int
p_id
=
v_cl
.
getProcessUnitID
();
// Convert the graph to metis
Metis
<
Graph_CSR
<
nm_
v
,
nm
_e
>>
met
(
gp
,
Np
);
Metis
<
Graph_CSR
<
nm_
part_v
,
nm_part
_e
>>
met
(
gp
,
Np
);
// decompose
met
.
decompose
<
nm_v
::
id
>
();
met
.
decompose
<
nm_
part_
v
::
id
>
();
// Optimize the decomposition creating bigger spaces
// And reducing Ghost over-stress
dec_optimizer
<
dim
,
Graph_CSR
<
nm_
v
,
nm
_e
>>
d_o
(
gp
,
div
);
dec_optimizer
<
dim
,
Graph_CSR
<
nm_
part_v
,
nm_part
_e
>>
d_o
(
gp
,
div
);
// set of Boxes produced by the decomposition optimizer
openfpm
::
vector
<::
Box
<
dim
,
size_t
>>
loc_box
;
// a grig key poiting to the origin
grid_key_dx
<
dim
>
keyZero
;
keyZero
.
zero
();
// optimize the decomposition
d_o
.
template
optimize
<
nm_v
::
sub_id
,
nm_v
::
id
>(
keyZero
,
gp
,
p_id
,
loc_box
);
//-------------------DEBUG---------
VTKWriter
<
decltype
(
gp
)
>
vtk
(
gp
);
vtk
.
write
(
"out_graph.vtk"
);
//---------------------------------
exit
(
1
);
d_o
.
template
optimize
<
nm_part_v
::
sub_id
,
nm_part_v
::
id
>(
gp
,
p_id
,
loc_box
);
// convert into sub-domain
for
(
size_t
s
=
0
;
s
<
loc_box
.
size
()
;
s
++
)
...
...
src/Graph/CartesianGraphFactory.hpp
View file @
9cc682a6
...
...
@@ -8,8 +8,8 @@
#ifndef CARTESIANGRAPHFACTORY_HPP_
#define CARTESIANGRAPHFACTORY_HPP_
#include "map_vector.hpp"
#include "map_graph.hpp"
#include "
Vector/
map_vector.hpp"
#include "
Graph/
map_graph.hpp"
#include "Grid/grid.hpp"
#include "Space/Shape/Box.hpp"
#include "Space/Shape/HyperCube.hpp"
...
...
src/Grid/grid_dist_id.hpp
View file @
9cc682a6
...
...
@@ -223,6 +223,17 @@ public:
~
grid_dist_id
()
{
}
/*! \brief Get the Virtual Cluster machine
*
* \return the Virtual cluster machine
*
*/
Vcluster
&
getVC
()
{
return
v_cl
;
}
};
#endif
src/Grid/grid_dist_id_unit_test.hpp
View file @
9cc682a6
...
...
@@ -55,6 +55,14 @@ BOOST_AUTO_TEST_CASE( grid_dist_id_iterator_test_use)
++
dom
;
}
// Get the virtual cluster machine
Vcluster
&
vcl
=
g_dist
.
getVC
();
// reduce
vcl
.
reduce
(
count
);
vcl
.
execute
();
// Check
BOOST_REQUIRE_EQUAL
(
count
,
1024
*
1024
);
/* auto g_it = g_dist.getIteratorBulk();
...
...
src/dec_optimizer.hpp
View file @
9cc682a6
...
...
@@ -181,7 +181,8 @@ private:
for
(
size_t
j
=
0
;
j
<
domains
.
size
()
;
j
++
)
{
if
(
graph
.
vertex
(
domains
.
get
(
j
)).
template
get
<
p_sub
>()
<
0
)
long
int
gs
=
graph
.
vertex
(
domains
.
get
(
j
)).
template
get
<
p_sub
>();
if
(
gs
<
0
)
{
// not assigned push it
...
...
@@ -217,13 +218,17 @@ private:
// get the vertex and if does not have a sub-id and is assigned ...
if
(
graph
.
vertex
(
gh
.
LinId
(
gk
)).
template
get
<
p_sub
>()
<
0
)
long
int
pid
=
graph
.
vertex
(
gh
.
LinId
(
gk
)).
template
get
<
p_sub
>();
if
(
pid
<
0
)
{
// ... and the p_id different from -1
if
(
pr_id
!=
-
1
)
{
// ... and the processor id of the sub-domain match p_id, add to the queue
if
(
pr_id
==
graph
.
vertex
(
gh
.
LinId
(
gk
)).
template
get
<
p_id
>()
)
long
int
pp_id
=
graph
.
vertex
(
gh
.
LinId
(
gk
)).
template
get
<
p_id
>();
if
(
pr_id
==
pp_id
)
domains_new
.
add
(
gh
.
LinId
(
gk
));
}
else
...
...
@@ -296,8 +301,11 @@ private:
// we get the processor id of the neighborhood sub-domain on direction d
size_t
exp_p
=
graph
.
vertex
(
sub_w_e
).
template
get
<
p_id
>();
// we check if it is the same processor id
w_can_expand
&=
exp_p
==
domain_id
;
// Check if already assigned
long
int
ass
=
graph
.
vertex
(
sub_w_e
).
template
get
<
p_sub
>();
// we check if it is the same processor id ans is not assigned
w_can_expand
&=
((
exp_p
==
domain_id
)
&
(
ass
<
0
));
// next domain
++
it
;
...
...
@@ -376,8 +384,9 @@ private:
}
}
/*! \brief Initialize the wavefront
/*! \brief Initialize the wavefront
s
*
* \param starting point of the wavefront set
* \param v_w Wavefront to initialize
*
*/
...
...
@@ -395,6 +404,55 @@ private:
}
}
/*! \brief Get the first seed
*
* search in the graph for one sub-domain labelled with processor id
* to use as seed
*
* \tparam p_id property in the graph storing the sub-domain id
*
* \param Graph graph
* \param id processor id
*
*/
template
<
unsigned
int
p_id
>
grid_key_dx
<
dim
>
search_first_seed
(
Graph
&
graph
,
long
int
id
)
{
// if no processor is selected return the first point
if
(
id
<
-
1
)
{
grid_key_dx
<
dim
>
key
;
key
.
zero
();
return
key
;
}
// Create a grid iterator
grid_key_dx_iterator
<
dim
>
g_sub
(
gh
);
// iterate through all grid points
while
(
g_sub
.
isNext
())
{
// get the actual key
const
grid_key_dx
<
dim
>
&
gk
=
g_sub
.
get
();
// if the subdomain has the id we are searching stop
if
(
graph
.
vertex
(
gh
.
LinId
(
gk
)).
template
get
<
p_id
>()
==
id
)
{
return
gk
;
}
++
g_sub
;
}
// If not found return an invalid key
grid_key_dx
<
dim
>
key
;
key
.
invalid
();
return
key
;
}
public:
/*! \brief Constructor
...
...
@@ -421,7 +479,7 @@ public:
* \tparam j property containing the decomposition
* \tparam i property to fill with the sub-decomposition
*
* \param
S
eed point
* \param
start_p s
eed point
* \param graph we are processing
*
*/
...
...
@@ -445,7 +503,32 @@ public:
* \tparam j property containing the decomposition
* \tparam i property to fill with the sub-decomposition
*
* \param Seed point
* \param graph we are processing
* \param p_id Processor id (if p_id == -1 the optimization is done for all the processors)
* \param list of sub-domain boxes
*
*/
template
<
unsigned
int
p_sub
,
unsigned
int
p_id
>
void
optimize
(
Graph
&
graph
,
long
int
pr_id
,
openfpm
::
vector
<
Box
<
dim
,
size_t
>>
&
lb
)
{
// search for the first seed
grid_key_dx
<
dim
>
key_seed
=
search_first_seed
<
p_id
>
(
graph
,
pr_id
);
// optimize
optimize
<
p_sub
,
p_id
>
(
key_seed
,
graph
,
pr_id
,
lb
);
}
/*! \brief optimize the graph
*
* Starting from a domain (hyper-cubic), it create wavefront at the boundary and expand
* the boundary until the wavefronts cannot expand any more.
* To the domains inside the hyper-cube one sub-id is assigned. This procedure continue until
* all the domain of one p_id has a sub-id
*
* \tparam j property containing the decomposition
* \tparam i property to fill with the sub-decomposition
*
* \param start_p seed point
* \param graph we are processing
* \param p_id Processor id (if p_id == -1 the optimization is done for all the processors)
* \param list of sub-domain boxes
...
...
src/dec_optimizer_unit_test.hpp
View file @
9cc682a6
...
...
@@ -10,7 +10,7 @@
#include "Graph/CartesianGraphFactory.hpp"
#include "map_graph.hpp"
#include "
Graph/
map_graph.hpp"
#include "metis_util.hpp"
#include "dec_optimizer.hpp"
...
...
src/main.cpp
View file @
9cc682a6
#include <iostream>
#include "config.h"
#include "Graph/CartesianGraphFactory.hpp"
#define BOOST_DISABLE_ASSERTS
...
...
@@ -14,7 +15,7 @@
#include "Space/Shape/Box.hpp"
#include "util.hpp"
#include "CartesianGraphFactory_unit_test.hpp"
#include "
Graph/
CartesianGraphFactory_unit_test.hpp"
#include "metis_util_unit_test.hpp"
#include "dec_optimizer_unit_test.hpp"
#include "Grid/grid_dist_id_unit_test.hpp"
...
...
src/metis_util_unit_test.hpp
View file @
9cc682a6
...
...
@@ -9,7 +9,7 @@
#define METIS_UTIL_UNIT_TEST_HPP_
#include "Graph/CartesianGraphFactory.hpp"
#include "map_graph.hpp"
#include "
Graph/
map_graph.hpp"
#include "metis_util.hpp"
#undef GS_SIZE
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment