[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] r4534 - in /trunk/getfem/src: getfem/getfem_mesh_region
From: |
andriy . andreykiv |
Subject: |
[Getfem-commits] r4534 - in /trunk/getfem/src: getfem/getfem_mesh_region.h getfem_mesh_region.cc getfem_models.cc getfem_omp.cc |
Date: |
Thu, 13 Mar 2014 16:51:11 -0000 |
Author: andrico
Date: Thu Mar 13 17:51:10 2014
New Revision: 4534
URL: http://svn.gna.org/viewcvs/getfem?rev=4534&view=rev
Log:
Efficiency improvements for multi-threaded assembly: speeding up partitioning
of regions
Modified:
trunk/getfem/src/getfem/getfem_mesh_region.h
trunk/getfem/src/getfem_mesh_region.cc
trunk/getfem/src/getfem_models.cc
trunk/getfem/src/getfem_omp.cc
Modified: trunk/getfem/src/getfem/getfem_mesh_region.h
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesh_region.h?rev=4534&r1=4533&r2=4534&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_mesh_region.h (original)
+++ trunk/getfem/src/getfem/getfem_mesh_region.h Thu Mar 13 17:51:10 2014
@@ -38,7 +38,7 @@
#ifndef GETFEM_MESH_REGION
#define GETFEM_MESH_REGION
-#include <map>
+#include <unordered_map>
#include <bitset>
#include <iostream>
#include "dal_bit_vector.h"
@@ -57,7 +57,7 @@
class mesh_region {
public:
typedef std::bitset<MAX_FACES_PER_CV+1> face_bitset;
- typedef std::map<size_type,face_bitset> map_t;
+ typedef std::unordered_map<size_type,face_bitset> map_t;
private:
struct impl {
mutable dal::bit_vector index_;
Modified: trunk/getfem/src/getfem_mesh_region.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh_region.cc?rev=4534&r1=4533&r2=4534&view=diff
==============================================================================
--- trunk/getfem/src/getfem_mesh_region.cc (original)
+++ trunk/getfem/src/getfem_mesh_region.cc Thu Mar 13 17:51:10 2014
@@ -100,7 +100,11 @@
}
void mesh_region::add(const dal::bit_vector &bv) {
- for (dal::bv_visitor i(bv); !i.finished(); ++i) add(i);
+ for (dal::bv_visitor i(bv); !i.finished(); ++i)
+ {
+ wp().m[i].set(size_type(-1)+1,1);
+ }
+ touch_parent_mesh();
}
void mesh_region::add(size_type cv, size_type f) {
Modified: trunk/getfem/src/getfem_models.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_models.cc?rev=4534&r1=4533&r2=4534&view=diff
==============================================================================
--- trunk/getfem/src/getfem_models.cc (original)
+++ trunk/getfem/src/getfem_models.cc Thu Mar 13 17:51:10 2014
@@ -868,11 +868,12 @@
for individual threads. This is done every time assembly is performed,
hence, not effective. Will try to include this distribution into the
brick description, to avoid their re-allocation (Andriy)*/
+ scalar_type time = gmm::uclock_sec();
list_distro<real_matlist> rmatlist(brick.rmatlist);
list_distro<real_veclist> rveclist(brick.rveclist[rhs_ind]);
list_distro<real_veclist> rveclist_sym(brick.rveclist_sym[rhs_ind]);
-
-
+ GMM_TRACE2("Matrix distribution took "<< gmm::uclock_sec()-time<<" s.");
+ time = gmm::uclock_sec();
/*running the assembly in parallel*/
gmm::standard_locale locale;
open_mp_is_running_properly check;
@@ -892,6 +893,8 @@
//the memory, allocated dynamically with boost::intrusive_pointer
//is realised only after this call. I hope this doesn't blow memory
with some bricks
dal::collect_static_stored_objects_garbage();
+ double assembly_time = gmm::uclock_sec()-time;
+ GMM_TRACE2("Assembly time "<< assembly_time<<" s.");
}
}
Modified: trunk/getfem/src/getfem_omp.cc
URL:
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_omp.cc?rev=4534&r1=4533&r2=4534&view=diff
==============================================================================
--- trunk/getfem/src/getfem_omp.cc (original)
+++ trunk/getfem/src/getfem_omp.cc Thu Mar 13 17:51:10 2014
@@ -73,6 +73,7 @@
pparent_mesh(pm),original_region(0),
partitions(num_threads())
{
+ scalar_type time = gmm::uclock_sec();
// in case of serial Getfem nothing to partition
if (num_threads()==1) {partitions[0]=id; return;}
@@ -94,19 +95,19 @@
size_type psize = std::ceil(static_cast<scalar_type >(Nelems)/
static_cast<scalar_type >(num_threads()));
mr_visitor mr(*original_region);
- size_type dummy_=0;
for(size_type thread = 0; thread<num_threads();thread++)
{
partitions[thread] =
getfem::mesh_region::free_region_id(*(original_region->get_parent_mesh()));
- mesh_region& partition =
pparent_mesh->region(partitions[thread]);
+ mesh_region partition;
for(size_type i=thread*psize;i<(thread+1)*psize &&
!mr.finished();i++,++mr)
{
- if(mr.is_face()) partition.add(mr.cv(),mr.f());
- else partition.add(mr.cv());
- dummy_=partition.size();
+ if (mr.is_face()) partition.add(mr.cv(),mr.f());
+ else partition.add(mr.cv());
}
+ pparent_mesh->region(partitions[thread]) = partition;
}
+ GMM_TRACE2("Partitioning time: "<<gmm::uclock_sec()-time<<" s.");
}
size_type region_partition::
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] r4534 - in /trunk/getfem/src: getfem/getfem_mesh_region.h getfem_mesh_region.cc getfem_models.cc getfem_omp.cc,
andriy . andreykiv <=