getfem-commits
[Top][All Lists]
Advanced

[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::




reply via email to

[Prev in Thread] Current Thread [Next in Thread]