Skip to content
Snippets Groups Projects
Commit d4e837f0 authored by Pietro Incardona's avatar Pietro Incardona
Browse files

vector distributed test

parent 78da786a
No related branches found
No related tags found
No related merge requests found
......@@ -18,6 +18,7 @@
#include "metis_util.hpp"
#include "dec_optimizer.hpp"
#include "Space/Shape/Box.hpp"
#include "Space/space.hpp"
/**
* \brief This class decompose a space into subspaces
......@@ -64,6 +65,9 @@ private:
//! the set of all local sub-domain as vector
data_s<SpaceBox<dim,T>,device_l<SpaceBox<dim,T>>,Memory,openfpm::vector_grow_policy_default, openfpm::vect_isel<SpaceBox<dim,T>>::value > sub_domains;
//! base structure
openfpm::vector<size_t> fine_s;
//! number of total sub-domain
size_t N_tot;
......@@ -247,6 +251,24 @@ public:
~CartDecomposition()
{}
/*! \brief processorID return in which processor the particle should go
*
* \return processorID
*
*/
template<typename Mem> size_t inline processorID(encapc<1, space<dim,T>, Mem> p)
{
size_t pid = 0;
for (size_t i = 0 ; i < dim ; i++)
{
pid += p.get().get(i);
}
return pid;
}
/*! \brief Set the parameter of the decomposition
*
* \param div_ std::vector storing into how many domain to decompose on each dimension
......
#ifndef CARTESIAN_GRAPH_UNIT_TEST_HPP
#define CARTESIAN_GRAPH_UNIT_TEST_HPP
#include "Graph/CartesianGraphFactory.hpp"
#include "Graph/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
......@@ -29,6 +29,7 @@ public:
typedef boost::fusion::vector<T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -44,6 +45,7 @@ public:
typedef boost::fusion::vector<T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -60,6 +62,7 @@ public:
typedef boost::fusion::vector<T,T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -77,6 +80,7 @@ public:
typedef boost::fusion::vector<T,T,T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -95,6 +99,7 @@ public:
typedef boost::fusion::vector<T,T,T,T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -109,6 +114,7 @@ public:
typedef boost::fusion::vector<T,T,T,T,T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -123,6 +129,7 @@ public:
typedef boost::fusion::vector<T,T,T,T,T,T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......@@ -136,6 +143,7 @@ public:
typedef boost::fusion::vector<T,T,T,T,T,T,T,T> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef T stype;
type data;
......
#ifndef SUBDOMAIN_NODES_HPP
#define DUBDOMAIN_NODES_HPP
/* In a decomposition graph each node represent a sub-domain while an edge represent
* an interaction between sub-domain (it mean that they have to communicate).
*
* Here we list the of property that a vertex node can carry with a brief
* explanation:
*
* x = position x of the sub-domain
* y = position y of the sub-domain
* z = position z of the sub-domain
* communication = is the estimated total communication produced by the sub-domain
* computation = the total computation produced by the sub-domain
* memory = estimated memory required by the sub-domain
* id = which processor own this sub-domain
* sub-id = sub-decomposition where each group of sub-domain is organized in an
* hyper-cube
*
* Here we list the properties that an edge node can carry with a brief explanation
*
* communication = is the estimated communication between sub-domains
*
*/
/* \brief Sub-domain vertex graph node
*
*/
struct nm_v
{
//! The node contain 3 unsigned long integer for communication computation memory and id
typedef boost::fusion::vector<float,float,float,size_t,size_t,size_t,size_t,long int> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
//! type of the positional field
typedef float s_type;
//! Attributes name
struct attributes
{
static const std::string name[];
};
//! The data
type data;
//! computation property id in boost::fusion::vector
static const unsigned int x = 0;
//! computation property id in boost::fusion::vector
static const unsigned int y = 1;
//! memory property id in boost::fusion::vector
static const unsigned int z = 2;
//! computation property id in boost::fusion::vector
static const unsigned int communication = 3;
//! computation property id in boost::fusion::vector
static const unsigned int computation = 4;
//! memory property id in boost::fusion::vector
static const unsigned int memory = 5;
//! memory property id in boost::fusion::vector
static const unsigned int id = 6;
//! memory property sub_id in boost::fusion::vector
static const unsigned int sub_id = 7;
//! total number of properties boost::fusion::vector
static const unsigned int max_prop = 8;
};
const std::string nm_v::attributes::name[] = {"x","y","z","communication","computation","memory","id","sub_id"};
/*! \brief sub-domain edge graph node
*
*/
struct nm_e
{
//! The node contain 3 unsigned long integer for comunication computation and memory
typedef boost::fusion::vector<size_t> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
//! Attributes name
struct attributes
{
static const std::string name[];
};
//! The data
type data;
//! computation property id in boost::fusion::vector
static const unsigned int communication = 0;
//! total number of properties boost::fusion::vector
static const unsigned int max_prop = 1;
};
const std::string nm_e::attributes::name[] = {"communication"};
/*! \brief Reduced sub-domain vertex graph node
*
* It contain only the processor id for each node
*
*/
struct nm_part_v
{
//! The node contain 3 unsigned long integer for comunication computation and memory
typedef boost::fusion::vector<size_t,size_t> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
typedef float s_type;
//! Attributes name
struct attributes
{
static const std::string name[];
};
//! The data
type data;
//! partition id in the boost::fusion::vector
static const unsigned int id = 0;
//! partition id in the boost::fusion::vector
static const unsigned int sub_id = 1;
//! total number of properties
static const unsigned int max_prop = 2;
};
const std::string nm_part_v::attributes::name[] = {"id"};
/*! \brief Reduced edge graph node
*
* It contain only the communication between nodes
*
*/
struct nm_part_e
{
//! The node contain 3 unsigned long integer for comunication computation and memory
typedef boost::fusion::vector<> type;
typedef typename memory_traits_inte<type>::type memory_int;
typedef typename memory_traits_lin<type>::type memory_lin;
//! The data
type data;
//! total number of properties
static const unsigned int max_prop = 0;
};
#endif
......@@ -8,14 +8,16 @@
#ifndef VECTOR_HPP_
#define VECTOR_HPP_
#include "VCluster.hpp"
#include "Space/space.hpp"
#include "Vector/vector_dist_iterator.hpp"
#include "Space/Shape/Box.hpp"
#include "Vector/vector_dist_key.hpp"
#define NO_ID false
#define ID true
/*! \brief Distributed vector
*
*
*
*/
......@@ -27,11 +29,11 @@ private:
//! Space Decomposition
Decomposition dec;
// Space for space position
grid_dist_id<1,space,Decomposition,Memory> pos;
// Particle position vector for each subdomain the last one is the unassigned particles vector
Vcluster_object_array<openfpm::vector<space>> v_pos;
// Space for properties
grid_dist_id<1,prop,Decomposition,Memory> prp;
// Particle properties vector for each subdomain the last one is the unassigned particles vector
Vcluster_object_array<openfpm::vector<prop>> v_prp;
// Virtual cluster
Vcluster & v_cl;
......@@ -43,14 +45,18 @@ public:
* \param number of elements
*
*/
vector_dist(size_t np)
vector_dist(size_t np, Box box)
:dec(Decomposition(*global_v_cluster)),v_cl(*global_v_cluster)
{
// Allocate unassigned particles vectors
v_pos = v_cl.template allocate<openfpm::vector<space>>(1);
v_prp = v_cl.template allocate<openfpm::vector<prop>>(1);
// resize the position vector
pos.resize(np);
v_pos.get(0).resize(np);
// resize the properties vector
prp.resize(np);
v_prp.get(0).resize(np);
// Create a valid decomposition of the space
// Get the number of processor and calculate the number of sub-domain
......@@ -60,12 +66,12 @@ public:
// Calculate the maximum number (before merging) of sub-domain on
// each dimension
size_t div[space::size];
for (int i = 0 ; i < space::size ; i++)
{div[i] = round_big_2(pow(n_sub,1.0/space::size));}
size_t div[space::max_prop];
for (int i = 0 ; i < space::max_prop ; i++)
{div[i] = round_big_2(pow(n_sub,1.0/space::max_prop));}
// Create the sub-domains
dec.setParameters(div);
dec.setParameters(div,box);
}
/*! \brief Get position of an object
......@@ -73,9 +79,9 @@ public:
* \param vec_key vector element
*
*/
template<unsigned int id> auto getPos(size_t vec_key) -> decltype(pos.template get<id>(vec_key))
template<unsigned int id> inline auto getPos(vect_dist_key_dx vec_key) -> decltype(v_pos.get(vec_key.getSub()).template get<id>(vec_key.getKey()))
{
return pos.template get<id>(vec_key);
return v_pos.get(vec_key.getSub()).template get<id>(vec_key.getKey());
}
/*! \brief Get the property of the object
......@@ -83,9 +89,9 @@ public:
* \param vec_key vector element
*
*/
template<unsigned int id> auto getProp(size_t vec_key) -> decltype(prp.template get<id>(vec_key))
template<unsigned int id> inline auto getProp(vect_dist_key_dx vec_key) -> decltype(v_prp.get(vec_key.v_c).template get<id>(vec_key.key))
{
return prp.template get<id>(vec_key);
return v_prp.get(vec_key.v_c).template get<id>(vec_key.key);
}
/*! \brief It communicate the particle to the respective processor
......@@ -93,29 +99,26 @@ public:
*/
void map()
{
// allocate n vector with n = number of processors
// boost::shared_ptr<openfpm::vector<space>> (new openfpm::vector<space>[v_cl.getProcessingUnits()]);
// allocate n vector with n = number of processors
// boost::shared_ptr<openfpm::vector<prop>> (new openfpm::vector<space>[v_cl.getProcessingUnits()]);
// Unassigned particle vector, is always the last one
size_t up_v = v_pos.size()-1;
// Contain the map of the processor should communicate
openfpm::vector<unsigned char> p_map;
// Contain the processor id of each particle (basically where they have to go)
openfpm::vector<size_t> lbl_p(pos.size());
openfpm::vector<size_t> lbl_p(v_pos.size());
// It contain the list of the processors it should to communicate
openfpm::vector<size_t> p_list;
auto it = pos.getIterator();
auto it = v_pos.get(up_v).getIterator();
// Label all the particles it the processor id where they should go
while (it.isNext())
{
auto key = it.get();
size_t p_id = dec.processorID(pos.get_o(key));
size_t p_id = dec.processorID(v_pos.get(up_v).get(key));
lbl_p.get(key) = p_id;
......@@ -126,6 +129,27 @@ public:
}
}
/*! \brief Get the iterator across the position of the particles
*
* \return an iterator
*
*/
vector_dist_iterator<openfpm::vector<space>> getIterator()
{
return vector_dist_iterator<openfpm::vector<space>>(v_pos);
}
/*! \brief Get the iterator across the properties of the particles
*
* \return an iterator
*
*/
vector_dist_iterator<openfpm::vector<space>> getPropIterator()
{
return vector_dist_iterator<openfpm::vector<prop>>(v_prp);
}
};
......
......@@ -8,9 +8,10 @@
#ifndef VECTOR_DIST_ITERATOR_HPP_
#define VECTOR_DIST_ITERATOR_HPP_
#include "vector_dist_key.hpp"
#include "VCluster.hpp"
template<unsigned int dim, typename device_v>
template<typename device_v>
class vector_dist_iterator
{
//! vector list counter
......@@ -44,7 +45,7 @@ class vector_dist_iterator
* assign
*
*/
vector_dist_iterator<dim,device_v> & operator=(const vector_dist_iterator<dim,device_v> & vdi)
vector_dist_iterator<device_v> & operator=(const vector_dist_iterator<device_v> & vdi)
{
v_c = vdi.v_c;
vList = vdi.vList;
......@@ -59,13 +60,13 @@ class vector_dist_iterator
*
*/
vector_dist_iterator<dim,device_v> operator++()
vector_dist_iterator<device_v> operator++()
{
++v_it;
// check if a_it is at the end
if (v_it.isNext() == true)
if (v_it < vList.get(v_c).size())
return *this;
else
{
......@@ -76,7 +77,7 @@ class vector_dist_iterator
// get the next grid iterator
if (v_c < vList.size())
v_it = vList[v_c].getDomainIterator();
v_it = 0;
}
return *this;
......@@ -103,9 +104,9 @@ class vector_dist_iterator
* \return the actual key
*
*/
size_t get()
vect_dist_key_dx get()
{
return vect_dist_key_dx<dim>(v_c,v_it.get());
return vect_dist_key_dx(v_c,v_it);
}
};
......
......@@ -16,7 +16,6 @@
*
*/
template<unsigned int dim>
class vect_dist_key_dx
{
//! grid list counter
......
......@@ -8,22 +8,35 @@
#ifndef VECTOR_DIST_UNIT_TEST_HPP_
#define VECTOR_DIST_UNIT_TEST_HPP_
#include <random>
#include "Vector/vector_dist.hpp"
BOOST_AUTO_TEST_SUITE( vector_dist_test )
BOOST_AUTO_TEST_CASE( vector_dist_iterator_test_use)
{
vector_dist<space<2,float>, Point_test<float>, Box<2,float>, CartDecomposition<2,float> > vd(4096);
Box<2,float> box({0.0,0.0},{1.0,1.0});
vector_dist<space<2,float>, Point_test<float>, Box<2,float>, CartDecomposition<2,float> > vd(4096,box);
// randomized
size_t seed = global_v_cluster->getProcessUnitID();
srand (time(NULL)+seed);
auto it = vd.getIterator();
while (it.isNext())
{
auto key = it.get();
vd.template getPos<space<2,float>::x>(key) = (rand()/(double)(RAND_MAX));
vd.template getPos<space<2,float>::y>(key) = (rand()/(double)(RAND_MAX));
++it;
}
// collect weight
}
BOOST_AUTO_TEST_SUITE_END()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment