void TestObserver( int M, int T, uintptr_t testMode ) { theStats.Reset(); theGlobalBarrierActive = true; theTestMode = testMode; NativeParallelFor( M, TestBody(T) ); // When T (number of threads in arena, i.e. master + workers) is less than P // (hardware concurrency), more than T-1 workers can visit the same arena. This // is possible in case of imbalance or when other arenas are activated/deactivated // concurrently). ASSERT( !theNumObservers, "Unexpected alive observer(s)" ); REMARK( "Entries %d / %d, exits %d\n", (int)theStats.m_entries, (int)theStats.m_workerEntries, (int)theStats.m_exits ); if ( testMode & tmSynchronized ) { if ( testMode & tmLocalObservation ) { ASSERT( theStats.m_entries >= M * T, "Too few on_entry calls" ); ASSERT( theStats.m_workerEntries >= M * (T - 1), "Too few worker entries" ); } else { ASSERT( theStats.m_entries >= M * M * T, "Too few on_entry calls" ); ASSERT( theStats.m_entries <= M * (P + 1), "Too many on_entry calls" ); ASSERT( theStats.m_workerEntries >= M * M * (T - 1), "Too few worker entries" ); ASSERT( theStats.m_workerEntries <= M * (P - 1), "Too many worker entries" ); } ASSERT( theStats.m_entries == theStats.m_exits, "Entries/exits mismatch" ); } else { ASSERT( theStats.m_entries >= M, "Too few on_entry calls" ); ASSERT( theStats.m_exits >= M || (testMode & tmAutoinitialization), "Too few on_exit calls" ); if ( !(testMode & tmLocalObservation) ) { ASSERT( theStats.m_entries <= M * M * P, "Too many on_entry calls" ); ASSERT( theStats.m_exits <= M * M * T, "Too many on_exit calls" ); } ASSERT( theStats.m_entries >= theStats.m_exits, "More exits than entries" ); } }
/// @param iterations Number of iterations to gather data for. /// @returns the number of nanoseconds the run took. uint64_t Run(std::size_t iterations) { std::size_t iteration = iterations; // Set up the testing fixture. SetUp(); // Get the starting time. Clock::TimePoint startTime, endTime; startTime = Clock::Now(); // Run the test body for each iteration. while (iteration--) TestBody(); // Get the ending time. endTime = Clock::Now(); // Tear down the testing fixture. TearDown(); // Return the duration in nanoseconds. return Clock::Duration(startTime, endTime); }