2
0
Alec Jacobson 1 сар өмнө
parent
commit
82578f2511

+ 33 - 17
tests/include/igl/parallel_for.cpp

@@ -24,6 +24,7 @@ TEST_CASE("parallel_for: serial_fallback", "[igl][parallel_for]")
 
 TEST_CASE("parallel_for: basic_parallelism", "[igl][parallel_for]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   const int N = 20000;
   std::vector<int> hit(N, 0);
   std::atomic<int> counter(0);
@@ -69,7 +70,10 @@ TEST_CASE("parallel_for: accumulation", "[igl][parallel_for]")
 
   bool used_parallel = igl::parallel_for(N, prep, func, accum, 1);
 
-  REQUIRE(used_parallel == true);
+  if(igl::default_num_threads() > 1) 
+  { 
+    REQUIRE(used_parallel == true);
+  }
   REQUIRE(total == Approx((double)N));
 }
 
@@ -96,6 +100,7 @@ TEST_CASE("parallel_for: equivalence_to_serial", "[igl][parallel_for]")
 
 TEST_CASE("parallel_for: min_parallel_threshold", "[igl][parallel_for]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   const int N = 500;
   std::vector<int> A(N,0), B(N,0);
 
@@ -118,7 +123,7 @@ TEST_CASE("parallel_for: nested_calls", "[igl][parallel_for]")
   const int N = 2000;
   std::vector<int> out(N, 0);
 
-  bool ok = igl::parallel_for(
+  bool used_parallel = igl::parallel_for(
     N,
     [&](int i)
     {
@@ -132,7 +137,7 @@ TEST_CASE("parallel_for: nested_calls", "[igl][parallel_for]")
     /*min_parallel=*/1
   );
 
-  REQUIRE(ok == true);
+  REQUIRE(used_parallel == true);
   for (int v : out)
     REQUIRE(v == 1);
 }
@@ -178,6 +183,7 @@ TEST_CASE("parallel_for: zero_iterations_does_nothing", "[igl][parallel_for]")
 
 TEST_CASE("parallel_for: min_parallel_equal_threshold", "[igl][parallel_for]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   const int N = 1024;
   std::vector<int> A(N,0), B(N,0);
 
@@ -239,7 +245,6 @@ TEST_CASE("parallel_for: thread_id_range_and_accum_calls", "[igl][parallel_for]"
     /*min_parallel=*/1
   );
 
-  REQUIRE(used_parallel == true);
 
   const size_t nt = prep_nt.load();
   REQUIRE(nt >= 1);
@@ -286,7 +291,10 @@ TEST_CASE("parallel_for: nested_inner_serial_fallback", "[igl][parallel_for]")
     /*min_parallel=*/1
   );
 
-  REQUIRE(outer_parallel == true);
+  if(igl::default_num_threads() > 1) 
+  { 
+    REQUIRE(outer_parallel == true);
+  }
   for (int v : outer_hits)
     REQUIRE(v == 1);
 
@@ -325,13 +333,17 @@ TEST_CASE("parallel_for: deep_nested_calls", "[igl][parallel_for]")
     /*min_parallel=*/1
   );
 
-  REQUIRE(outer_parallel == true);
+  if(igl::default_num_threads() > 1) 
+  { 
+    REQUIRE(outer_parallel == true);
+  }
   for (int v : hits)
     REQUIRE(v == 1);
 }
 
 TEST_CASE("parallel_for: many_small_jobs_reuse_pool", "[igl][parallel_for]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   const int iterations = 200;
   const int N = 64;
 
@@ -346,8 +358,11 @@ TEST_CASE("parallel_for: many_small_jobs_reuse_pool", "[igl][parallel_for]")
       [&](int i){ buf[i] = it; },
       /*min_parallel=*/1
     );
+    if(igl::default_num_threads() > 1) 
+    { 
+      REQUIRE(used_parallel == true);
+    }
 
-    REQUIRE(used_parallel == true);
     for (int i = 0; i < N; ++i)
       REQUIRE(buf[i] == it);
   }
@@ -355,6 +370,7 @@ TEST_CASE("parallel_for: many_small_jobs_reuse_pool", "[igl][parallel_for]")
 
 TEST_CASE("parallel_for: different_index_types", "[igl][parallel_for]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   const long long N = 12345;
 
   std::vector<int> buf((size_t)N, 0);
@@ -408,7 +424,10 @@ TEST_CASE("parallel_for: accumulation_equivalence_to_serial_sum", "[igl][paralle
     /*min_parallel=*/1
   );
 
-  REQUIRE(used_parallel == true);
+  if(igl::default_num_threads() > 1)
+  {
+    REQUIRE(used_parallel == true);
+  }
   REQUIRE(parallel_sum == serial_sum);
 }
 
@@ -442,6 +461,7 @@ using igl_pf_clock = std::chrono::steady_clock;
 
 TEST_CASE("parallel_for: timing_large_loop", "[igl][parallel_for][timing]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   const int N = 5'000'000;
 
   std::vector<double> a(N), b(N);
@@ -514,6 +534,7 @@ TEST_CASE("parallel_for: timing_large_loop", "[igl][parallel_for][timing]")
 
 TEST_CASE("parallel_for: timing_many_small_jobs", "[igl][parallel_for][timing]")
 {
+  if(igl::default_num_threads() <= 1) { SUCCEED("Only one hardware thread; nested parallel test skipped."); return; }
   // This is meant to stress the thread pool reuse behavior: many small jobs.
   const int iterations = 500;
   const int N = 1024;
@@ -597,13 +618,6 @@ TEST_CASE("parallel_for: timing_many_small_jobs", "[igl][parallel_for][timing]")
 
 TEST_CASE("parallel_for: nested_serial_fallback", "[igl][parallel_for]")
 {
-  // If there is only a single hardware thread available, this test
-  // can't meaningfully distinguish nested/parallel behavior.
-  if(igl::default_num_threads() <= 1)
-  {
-    SUCCEED("Only one hardware thread; nested parallel test skipped.");
-    return;
-  }
 
   const int outer_loop_size = 4;
   const int inner_loop_size = 4;
@@ -633,7 +647,10 @@ TEST_CASE("parallel_for: nested_serial_fallback", "[igl][parallel_for]")
   );
 
   // Sanity: outer loop should be parallel when threads > 1.
-  REQUIRE(outer_used_parallel == true);
+  if(igl::default_num_threads() > 1)
+  {
+    REQUIRE(outer_used_parallel == true);
+  }
 
   // Sanity: all iterations of both loops ran.
   REQUIRE(counter.load(std::memory_order_relaxed)
@@ -644,4 +661,3 @@ TEST_CASE("parallel_for: nested_serial_fallback", "[igl][parallel_for]")
 }
 
 #endif // IGL_PARALLEL_FOR_TIMING_TESTS
-