![]() |
Prev | Next | harmonic_time |
ok = harmonic_time(
time_out, test_time, num_threads, mega_sum
)
bool ok
If it is true,
harmonic_time
passed the correctness test.
Otherwise it is false.
double& time_out
The input value of the argument does not matter.
Upon return it is the number of wall clock seconds required for
to compute the summation.
time_out
is the total wall clock time divided by the
number of repeats.
size_t num_threads
It specifies the number of threads that are available for this test.
If it is zero, the test is run without the multi-threading environment and
1 == thread_alloc::num_threads()
when harmonic_time
is called.
If it is non-zero, the test is run with the multi-threading and
num_threads = thread_alloc::num_threads()
when harmonic_time
is called.
size_t& mega_sum
and is greater than zero.
The value @(@
n
@)@ in the summation
is equal to @(@
10^6
@)@ times
mega_sum
.
# include <cstring> # include <limits> # include <iostream> # include <cstdlib> # include <algorithm> // Note there is no mention of parallel mode in the documentation for // speed_test (so it is safe to use without special consideration). # include <cppad/utility/time_test.hpp> namespace { // value of sum resulting from most recent call to test_once double sum_ = 0.; // void test_once(void) { if( mega_sum_ < 1 ) { std::cerr << "harmonic_time: mega_sum < 1" << std::endl; exit(1); } size_t num_sum = mega_sum_ * 1000000; bool ok = harmonic_sum(sum_, num_sum); if( ! ok ) { std::cerr << "harmonic: error" << std::endl; exit(1); } return; } // void test_repeat(size_t repeat) { size_t i; for(i = 0; i < repeat; i++) test_once(); return; } } // This is the only routine that is accessible outside of this file bool harmonic_time( double& time_out, double test_time, size_t num_threads, size_t mega_sum) { bool ok = true; ok &= thread_alloc::thread_num() == 0; // arguments passed to harmonic_sum num_threads_ = num_threads; mega_sum_ = mega_sum; // create team of threads ok &= thread_alloc::in_parallel() == false; if( num_threads > 0 ) { team_create(num_threads); ok &= num_threads == thread_alloc::num_threads(); } else { ok &= 1 == thread_alloc::num_threads(); } // run the test case and set the time return value time_out = CppAD::time_test(test_repeat, test_time); // destroy team of threads if( num_threads > 0 ) team_destroy(); ok &= thread_alloc::in_parallel() == false; // Correctness check double eps1000 = double(mega_sum_) * 1e3 * std::numeric_limits<double>::epsilon(); size_t i = mega_sum_ * 1000000; double check = 0.; while(i) check += 1. / double(i--); ok &= std::fabs(sum_ - check) <= eps1000; return ok; }