math_bench.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * Copyright 2010-2025 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx/blob/master/LICENSE
  4. */
  5. #include <bx/math.h>
  6. #include <bx/timer.h>
  7. #include <bx/file.h>
  8. #include <math.h>
  9. typedef float (*MathFn)(float);
  10. template<MathFn mfn>
  11. float mathTest(const char* _name)
  12. {
  13. bx::WriterI* writer = bx::getStdOut();
  14. int64_t elapsed = -bx::getHPCounter();
  15. float result = 0.0f;
  16. const float max = 1389.0f;
  17. for (float xx = 0.0f; xx < max; xx += 0.1f)
  18. {
  19. result += mfn(xx);
  20. }
  21. bx::Error err;
  22. elapsed += bx::getHPCounter();
  23. bx::write(writer, &err, "%-20s: %15f\n", _name, double(elapsed) );
  24. return result;
  25. }
  26. float rsqrt(float _a)
  27. {
  28. return 1.0f/::sqrtf(_a);
  29. }
  30. float sinCosNonApproxBench()
  31. {
  32. bx::WriterI* writer = bx::getStdOut();
  33. int64_t elapsed = -bx::getHPCounter();
  34. float result = 0.0f;
  35. const float max = 1389.0f;
  36. for (float xx = 0.0f; xx < max; xx += 0.1f)
  37. {
  38. float ss, cc;
  39. ss = bx::sin(xx);
  40. cc = bx::cos(xx);
  41. result += ss + cc;
  42. }
  43. bx::Error err;
  44. elapsed += bx::getHPCounter();
  45. bx::write(writer, &err, "%-20s: %15f\n", "sin + cos", double(elapsed) );
  46. return result;
  47. }
  48. float sinCosApproxBench()
  49. {
  50. bx::WriterI* writer = bx::getStdOut();
  51. int64_t elapsed = -bx::getHPCounter();
  52. float result = 0.0f;
  53. const float max = 1389.0f;
  54. for (float xx = 0.0f; xx < max; xx += 0.1f)
  55. {
  56. float ss, cc;
  57. bx::sinCosApprox(ss, cc, xx);
  58. result += ss + cc;
  59. }
  60. bx::Error err;
  61. elapsed += bx::getHPCounter();
  62. bx::write(writer, &err, "%-20s: %15f\n", "sinCosApprox", double(elapsed) );
  63. return result;
  64. }
  65. float g_result; // trick compiler to not discard results
  66. void math_bench()
  67. {
  68. bx::WriterI* writer = bx::getStdOut();
  69. bx::Error err;
  70. bx::write(writer, &err, "Math bench\n\n");
  71. g_result += mathTest< ::sqrtf >(" ::sqrtf");
  72. g_result += mathTest<bx::sqrtRef >("bx::sqrtRef");
  73. g_result += mathTest<bx::sqrtSimd >("bx::sqrtSimd");
  74. g_result += mathTest<bx::sqrt >("bx::sqrt");
  75. bx::write(writer, &err, "\n");
  76. g_result += mathTest< ::rsqrt >(" ::rsqrtf");
  77. g_result += mathTest<bx::rsqrtRef >("bx::rsqrtRef");
  78. g_result += mathTest<bx::rsqrtSimd>("bx::rsqrtSimd");
  79. g_result += mathTest<bx::rsqrt >("bx::rsqrt");
  80. bx::write(writer, &err, "\n");
  81. g_result += sinCosNonApproxBench();
  82. g_result += sinCosApproxBench();
  83. bx::write(writer, &err, "\n");
  84. g_result += mathTest< ::sinf >(" ::sinf");
  85. g_result += mathTest<bx::sin >("bx::sin");
  86. bx::write(writer, &err, "\n");
  87. g_result += mathTest< ::sinhf>(" ::sinhf");
  88. g_result += mathTest<bx::sinh >("bx::sinh");
  89. bx::write(writer, &err, "\n");
  90. g_result += mathTest< ::asinf>(" ::asinf");
  91. g_result += mathTest<bx::asin >("bx::asin");
  92. bx::write(writer, &err, "\n");
  93. g_result += mathTest< ::cosf >(" ::cosf");
  94. g_result += mathTest<bx::cos >("bx::cos");
  95. bx::write(writer, &err, "\n");
  96. g_result += mathTest< ::coshf>(" ::coshf");
  97. g_result += mathTest<bx::cosh >("bx::cosh");
  98. bx::write(writer, &err, "\n");
  99. g_result += mathTest< ::acosf>(" ::acosf");
  100. g_result += mathTest<bx::acos >("bx::acos");
  101. bx::write(writer, &err, "\n");
  102. g_result += mathTest< ::tanf >(" ::tanf");
  103. g_result += mathTest<bx::tan >("bx::tan");
  104. bx::write(writer, &err, "\n");
  105. g_result += mathTest< ::tanhf>(" ::tanhf");
  106. g_result += mathTest<bx::tanh >("bx::tanh");
  107. bx::write(writer, &err, "\n");
  108. g_result += mathTest< ::atanf>(" ::atanf");
  109. g_result += mathTest<bx::atan >("bx::atan");
  110. bx::write(writer, &err, "\n");
  111. g_result += mathTest< ::expf>(" ::expf");
  112. g_result += mathTest<bx::exp >("bx::exp");
  113. bx::write(writer, &err, "\n");
  114. g_result += mathTest< ::exp2f>(" ::exp2f");
  115. g_result += mathTest<bx::exp2 >("bx::exp2");
  116. bx::write(writer, &err, "\n");
  117. g_result += mathTest< ::logf >(" ::logf");
  118. g_result += mathTest<bx::log >("bx::log");
  119. bx::write(writer, &err, "\n");
  120. g_result += mathTest< ::log2f>(" ::log2f");
  121. g_result += mathTest<bx::log2 >("bx::log2");
  122. }