[Bf-blender-cvs] [7781c49c227] newboolean: Set up to try either spinlock or mutex for boolean parallelism.

Howard Trickey noreply at git.blender.org
Mon Jul 27 00:09:50 CEST 2020


Commit: 7781c49c22769f8d070b149d223df6dcb5204283
Author: Howard Trickey
Date:   Sun Jul 26 13:09:29 2020 -0400
Branches: newboolean
https://developer.blender.org/rB7781c49c22769f8d070b149d223df6dcb5204283

Set up to try either spinlock or mutex for boolean parallelism.

On my 48 core Linux machine, mutex's seem to lead to faster execution.

===================================================================

M	source/blender/blenlib/intern/mesh_intersect.cc

===================================================================

diff --git a/source/blender/blenlib/intern/mesh_intersect.cc b/source/blender/blenlib/intern/mesh_intersect.cc
index 8c8ed165b93..b61e120c1e3 100644
--- a/source/blender/blenlib/intern/mesh_intersect.cc
+++ b/source/blender/blenlib/intern/mesh_intersect.cc
@@ -325,6 +325,8 @@ std::ostream &operator<<(std::ostream &os, Facep f)
  * ensure that only one instance of a Vert with a given co_exact will
  * exist. I.e., it dedups the vertices.
  */
+
+// #define USE_SPINLOCK
 class MArena::MArenaImpl {
 
   /* Don't use Vert itself as key since resizing may move
@@ -361,13 +363,21 @@ class MArena::MArenaImpl {
   int next_face_id_ = 0;
 
   /* Need a lock when multithreading to protect allocation of new elements. */
+#ifdef USE_SPINLOCK
   SpinLock lock_;
+#else
+  ThreadMutex *mutex_;
+#endif
 
  public:
   MArenaImpl()
   {
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_init(&lock_);
+#else
+      mutex_ = BLI_mutex_alloc();
+#endif
     }
   }
   MArenaImpl(const MArenaImpl &) = delete;
@@ -375,7 +385,11 @@ class MArena::MArenaImpl {
   ~MArenaImpl()
   {
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_end(&lock_);
+#else
+      BLI_mutex_free(mutex_);
+#endif
     }
   }
 
@@ -412,11 +426,19 @@ class MArena::MArenaImpl {
   {
     Face *f = new Face(verts, next_face_id_++, orig, edge_origs, is_intersect);
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_lock(&lock_);
+#else
+      BLI_mutex_lock(mutex_);
+#endif
     }
     allocated_faces_.append(std::unique_ptr<Face>(f));
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_unlock(&lock_);
+#else
+      BLI_mutex_unlock(mutex_);
+#endif
     }
     return f;
   }
@@ -440,7 +462,11 @@ class MArena::MArenaImpl {
     Vert vtry(co, double3(), NO_INDEX, NO_INDEX);
     VSetKey vskey(&vtry);
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_lock(&lock_);
+#else
+      BLI_mutex_lock(mutex_);
+#endif
     }
     int i = vset_.index_of_try(vskey);
     if (i == -1) {
@@ -450,7 +476,11 @@ class MArena::MArenaImpl {
       ans = vset_[i].vert;
     }
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_unlock(&lock_);
+#else
+      BLI_mutex_unlock(mutex_);
+#endif
     }
     return ans;
   }
@@ -480,7 +510,11 @@ class MArena::MArenaImpl {
     Vertp ans;
     VSetKey vskey(&vtry);
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_lock(&lock_);
+#else
+      BLI_mutex_lock(mutex_);
+#endif
     }
     int i = vset_.index_of_try(vskey);
     if (i == -1) {
@@ -500,7 +534,11 @@ class MArena::MArenaImpl {
       ans = vset_[i].vert;
     }
     if (intersect_use_threading) {
+#ifdef USE_SPINLOCK
       BLI_spin_unlock(&lock_);
+#else
+      BLI_mutex_unlock(mutex_);
+#endif
     }
     return ans;
   };



More information about the Bf-blender-cvs mailing list