|
|
@@ -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
|
|
|
-
|