21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/ave_deviation_meter.hpp"
27 #include "core/fma.hpp"
31 using namespace libjmmcg;
33 BOOST_AUTO_TEST_SUITE(fma_tests)
35 BOOST_AUTO_TEST_CASE(all_zero)
43 BOOST_CHECK_EQUAL(y, 0.0);
46 BOOST_AUTO_TEST_CASE(all_zero_commute_multiply)
54 BOOST_CHECK_EQUAL(y, 17.0);
57 BOOST_AUTO_TEST_CASE(all_zero_commute_add)
65 BOOST_CHECK_EQUAL(y, 17.0);
68 BOOST_AUTO_TEST_CASE(all_zero_commute_multipy_and_add)
76 BOOST_CHECK_EQUAL(y, 17.0);
79 BOOST_AUTO_TEST_CASE(all_zero_nest)
87 BOOST_CHECK_EQUAL(y, 56.0);
90 BOOST_AUTO_TEST_CASE(m_one_others_zero)
98 BOOST_CHECK_EQUAL(y, 0.0);
101 BOOST_AUTO_TEST_CASE(all_ones)
109 BOOST_CHECK_EQUAL(y, 2.0);
112 BOOST_AUTO_TEST_CASE(one_two)
120 BOOST_CHECK_EQUAL(y, 3.0);
123 BOOST_AUTO_TEST_CASE(all_twos)
131 BOOST_CHECK_EQUAL(y, 6.0);
134 BOOST_AUTO_TEST_CASE(subtract_twos)
142 BOOST_CHECK_EQUAL(y, 2.0);
145 BOOST_AUTO_TEST_CASE(associative_subtract_twos)
153 BOOST_CHECK_EQUAL(y, -2.0);
156 BOOST_AUTO_TEST_CASE(all_zero_two_surrounding_multiplies)
164 BOOST_CHECK_EQUAL(y, 41.0);
167 BOOST_AUTO_TEST_CASE(all_zero_two_post_multiplies)
175 BOOST_CHECK_EQUAL(y, 41.0);
178 BOOST_AUTO_TEST_CASE(all_zero_two_preceeding_multiplies)
186 BOOST_CHECK_EQUAL(y, 41.0);
189 BOOST_AUTO_TEST_CASE(all_zero_two_dbls_add)
197 BOOST_CHECK_EQUAL(y, 41.0);
200 BOOST_AUTO_TEST_CASE(all_zero_two_dbls_subtract)
208 BOOST_CHECK_EQUAL(y, 31.0);
211 BOOST_AUTO_TEST_CASE(all_zero_two_dbls_associative_add)
219 BOOST_CHECK_EQUAL(y, 16.0);
222 BOOST_AUTO_TEST_CASE(all_zero_two_dbls_associative_subtract)
230 BOOST_CHECK_EQUAL(y, -31.0);
233 BOOST_AUTO_TEST_CASE(multiply_equals_add)
241 BOOST_CHECK_EQUAL(y, 17.0);
244 BOOST_AUTO_TEST_CASE(multiply_equals_subtract)
252 BOOST_CHECK_EQUAL(y, 7.0);
255 BOOST_AUTO_TEST_CASE(add_equals)
263 BOOST_CHECK_EQUAL(y, 17.0);
266 BOOST_AUTO_TEST_CASE(subtract_equals)
274 BOOST_CHECK_EQUAL(y, 7.0);
282 BOOST_AUTO_TEST_CASE_TEMPLATE(performance_all_zero_commute_multiply, T, check_fma_tests)
286 #ifdef JMMCG_PERFORMANCE_TESTS
287 const unsigned long test_size=2<<19;
288 const unsigned long num_reps=10000;
290 const unsigned long test_size=2<<2;
291 const unsigned long num_reps=2;
294 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
302 const auto t1=std::chrono::high_resolution_clock::now();
303 for (
unsigned long num_loops=0;num_loops<test_size;++num_loops) {
306 const auto t2=std::chrono::high_resolution_clock::now();
307 BOOST_CHECK_EQUAL(y, test_size*17.0);
308 return timed_results_t::value_type(std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count())/test_size;
311 std::cout<<
"Time per "<<
typeid(T).name()<<
" operation: "<<timed_results.first<<
" nanosec."<<std::endl;
312 #ifdef JMMCG_PERFORMANCE_TESTS
313 BOOST_CHECK(!timed_results.second);
317 BOOST_AUTO_TEST_SUITE_END()