You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

benchncnn.cpp 6.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. #include <float.h>
  2. #include <stdio.h>
  3. #ifdef _WIN32
  4. #include <windows.h> // Sleep()
  5. #else
  6. #include <unistd.h> // sleep()
  7. #endif
  8. #include "benchmark.h"
  9. #include "cpu.h"
  10. #include "net.h"
  11. namespace ncnn {
  12. // always return empty weights
  13. class ModelBinFromEmpty : public ModelBin
  14. {
  15. public:
  16. virtual Mat load(int w, int /*type*/) const { return Mat(w); }
  17. };
  18. class BenchNet : public Net
  19. {
  20. public:
  21. int load_model()
  22. {
  23. // load file
  24. int ret = 0;
  25. ModelBinFromEmpty mb;
  26. for (size_t i=0; i<layers.size(); i++)
  27. {
  28. Layer* layer = layers[i];
  29. int lret = layer->load_model(mb);
  30. if (lret != 0)
  31. {
  32. fprintf(stderr, "layer load_model %d failed\n", (int)i);
  33. ret = -1;
  34. break;
  35. }
  36. }
  37. return ret;
  38. }
  39. };
  40. } // namespace ncnn
  41. static int g_loop_count = 4;
  42. void benchmark(const char* comment, void (*init)(ncnn::Net&), void (*run)(const ncnn::Net&))
  43. {
  44. ncnn::BenchNet net;
  45. init(net);
  46. net.load_model();
  47. // sleep 10 seconds for cooling down SOC :(
  48. #ifdef _WIN32
  49. Sleep(10 * 1000);
  50. #else
  51. sleep(10);
  52. #endif
  53. // warm up
  54. run(net);
  55. run(net);
  56. run(net);
  57. double time_min = DBL_MAX;
  58. double time_max = -DBL_MAX;
  59. double time_avg = 0;
  60. for (int i=0; i<g_loop_count; i++)
  61. {
  62. double start = ncnn::get_current_time();
  63. run(net);
  64. double end = ncnn::get_current_time();
  65. double time = end - start;
  66. time_min = std::min(time_min, time);
  67. time_max = std::max(time_max, time);
  68. time_avg += time;
  69. }
  70. time_avg /= g_loop_count;
  71. fprintf(stderr, "%16s min = %7.2f max = %7.2f avg = %7.2f\n", comment, time_min, time_max, time_avg);
  72. }
  73. void squeezenet_init(ncnn::Net& net)
  74. {
  75. net.load_param("squeezenet.param");
  76. }
  77. void squeezenet_run(const ncnn::Net& net)
  78. {
  79. ncnn::Extractor ex = net.create_extractor();
  80. ncnn::Mat in(227, 227, 3);
  81. ex.input("data", in);
  82. ncnn::Mat out;
  83. ex.extract("prob", out);
  84. }
  85. void mobilenet_init(ncnn::Net& net)
  86. {
  87. net.load_param("mobilenet.param");
  88. }
  89. void mobilenet_run(const ncnn::Net& net)
  90. {
  91. ncnn::Extractor ex = net.create_extractor();
  92. ncnn::Mat in(224, 224, 3);
  93. ex.input("data", in);
  94. ncnn::Mat out;
  95. ex.extract("prob", out);
  96. }
  97. void mobilenet_v2_init(ncnn::Net& net)
  98. {
  99. net.load_param("mobilenet_v2.param");
  100. }
  101. void mobilenet_v2_run(const ncnn::Net& net)
  102. {
  103. ncnn::Extractor ex = net.create_extractor();
  104. ncnn::Mat in(224, 224, 3);
  105. ex.input("data", in);
  106. ncnn::Mat out;
  107. ex.extract("prob", out);
  108. }
  109. void shufflenet_init(ncnn::Net& net)
  110. {
  111. net.load_param("shufflenet.param");
  112. }
  113. void shufflenet_run(const ncnn::Net& net)
  114. {
  115. ncnn::Extractor ex = net.create_extractor();
  116. ncnn::Mat in(224, 224, 3);
  117. ex.input("data", in);
  118. ncnn::Mat out;
  119. ex.extract("fc1000", out);
  120. }
  121. void googlenet_init(ncnn::Net& net)
  122. {
  123. net.load_param("googlenet.param");
  124. }
  125. void googlenet_run(const ncnn::Net& net)
  126. {
  127. ncnn::Extractor ex = net.create_extractor();
  128. ncnn::Mat in(224, 224, 3);
  129. ex.input("data", in);
  130. ncnn::Mat out;
  131. ex.extract("prob", out);
  132. }
  133. void resnet18_init(ncnn::Net& net)
  134. {
  135. net.load_param("resnet18.param");
  136. }
  137. void resnet18_run(const ncnn::Net& net)
  138. {
  139. ncnn::Extractor ex = net.create_extractor();
  140. ncnn::Mat in(224, 224, 3);
  141. ex.input("data", in);
  142. ncnn::Mat out;
  143. ex.extract("prob", out);
  144. }
  145. void alexnet_init(ncnn::Net& net)
  146. {
  147. net.load_param("alexnet.param");
  148. }
  149. void alexnet_run(const ncnn::Net& net)
  150. {
  151. ncnn::Extractor ex = net.create_extractor();
  152. ncnn::Mat in(227, 227, 3);
  153. ex.input("data", in);
  154. ncnn::Mat out;
  155. ex.extract("prob", out);
  156. }
  157. void vgg16_init(ncnn::Net& net)
  158. {
  159. net.load_param("vgg16.param");
  160. }
  161. void vgg16_run(const ncnn::Net& net)
  162. {
  163. ncnn::Extractor ex = net.create_extractor();
  164. ncnn::Mat in(224, 224, 3);
  165. ex.input("data", in);
  166. ncnn::Mat out;
  167. ex.extract("prob", out);
  168. }
  169. void squeezenet_ssd_init(ncnn::Net& net)
  170. {
  171. net.load_param("squeezenet_ssd.param");
  172. }
  173. void squeezenet_ssd_run(const ncnn::Net& net)
  174. {
  175. ncnn::Extractor ex = net.create_extractor();
  176. ncnn::Mat in(300, 300, 3);
  177. ex.input("data", in);
  178. ncnn::Mat out;
  179. ex.extract("detection_out", out);
  180. }
  181. void mobilenet_ssd_init(ncnn::Net& net)
  182. {
  183. net.load_param("mobilenet_ssd.param");
  184. }
  185. void mobilenet_ssd_run(const ncnn::Net& net)
  186. {
  187. ncnn::Extractor ex = net.create_extractor();
  188. ncnn::Mat in(300, 300, 3);
  189. ex.input("data", in);
  190. ncnn::Mat out;
  191. ex.extract("detection_out", out);
  192. }
  193. int main(int argc, char** argv)
  194. {
  195. int loop_count = 4;
  196. int num_threads = ncnn::get_cpu_count();
  197. int powersave = 0;
  198. if (argc >= 2)
  199. {
  200. loop_count = atoi(argv[1]);
  201. }
  202. if (argc >= 3)
  203. {
  204. num_threads = atoi(argv[2]);
  205. }
  206. if (argc >= 4)
  207. {
  208. powersave = atoi(argv[3]);
  209. }
  210. g_loop_count = loop_count;
  211. ncnn::set_cpu_powersave(powersave);
  212. ncnn::set_omp_dynamic(0);
  213. ncnn::set_omp_num_threads(num_threads);
  214. fprintf(stderr, "loop_count = %d\n", g_loop_count);
  215. fprintf(stderr, "num_threads = %d\n", num_threads);
  216. fprintf(stderr, "powersave = %d\n", ncnn::get_cpu_powersave());
  217. // run
  218. benchmark("squeezenet", squeezenet_init, squeezenet_run);
  219. benchmark("mobilenet", mobilenet_init, mobilenet_run);
  220. benchmark("mobilenet_v2", mobilenet_v2_init, mobilenet_v2_run);
  221. benchmark("shufflenet", shufflenet_init, shufflenet_run);
  222. benchmark("googlenet", googlenet_init, googlenet_run);
  223. benchmark("resnet18", resnet18_init, resnet18_run);
  224. benchmark("alexnet", alexnet_init, alexnet_run);
  225. benchmark("vgg16", vgg16_init, vgg16_run);
  226. benchmark("squeezenet-ssd", squeezenet_ssd_init, squeezenet_ssd_run);
  227. benchmark("mobilenet-ssd", mobilenet_ssd_init, mobilenet_ssd_run);
  228. return 0;
  229. }