#include #include #ifdef _WIN32 #define NOMINMAX #include #include // Sleep() #else #include // sleep() #endif #include "benchmark.h" #include "cpu.h" #include "net.h" namespace ncnn { // always return empty weights class ModelBinFromEmpty : public ModelBin { public: virtual Mat load(int w, int /*type*/) const { return Mat(w); } }; class BenchNet : public Net { public: int load_model() { // load file int ret = 0; ModelBinFromEmpty mb; for (size_t i=0; iload_model(mb); if (lret != 0) { fprintf(stderr, "layer load_model %d failed\n", (int)i); ret = -1; break; } } return ret; } }; } // namespace ncnn static int g_loop_count = 4; static ncnn::UnlockedPoolAllocator g_blob_pool_allocator; static ncnn::PoolAllocator g_workspace_pool_allocator; void benchmark(const char* comment, void (*init)(ncnn::Net&), void (*run)(const ncnn::Net&)) { ncnn::BenchNet net; init(net); net.load_model(); g_blob_pool_allocator.clear(); g_workspace_pool_allocator.clear(); // sleep 10 seconds for cooling down SOC :( #ifdef _WIN32 Sleep(10 * 1000); #else sleep(10); #endif // warm up run(net); run(net); run(net); double time_min = DBL_MAX; double time_max = -DBL_MAX; double time_avg = 0; for (int i=0; i= 2) { loop_count = atoi(argv[1]); } if (argc >= 3) { num_threads = atoi(argv[2]); } if (argc >= 4) { powersave = atoi(argv[3]); } g_loop_count = loop_count; g_blob_pool_allocator.set_size_compare_ratio(0.0f); g_workspace_pool_allocator.set_size_compare_ratio(0.5f); ncnn::Option opt; opt.lightmode = true; opt.num_threads = num_threads; opt.blob_allocator = &g_blob_pool_allocator; opt.workspace_allocator = &g_workspace_pool_allocator; ncnn::set_default_option(opt); ncnn::set_cpu_powersave(powersave); ncnn::set_omp_dynamic(0); ncnn::set_omp_num_threads(num_threads); fprintf(stderr, "loop_count = %d\n", g_loop_count); fprintf(stderr, "num_threads = %d\n", num_threads); fprintf(stderr, "powersave = %d\n", ncnn::get_cpu_powersave()); // run benchmark("squeezenet", squeezenet_init, squeezenet_run); benchmark("mobilenet", mobilenet_init, mobilenet_run); benchmark("mobilenet_v2", mobilenet_v2_init, mobilenet_v2_run); benchmark("shufflenet", shufflenet_init, shufflenet_run); benchmark("googlenet", googlenet_init, googlenet_run); benchmark("resnet18", resnet18_init, resnet18_run); benchmark("alexnet", alexnet_init, alexnet_run); benchmark("vgg16", vgg16_init, vgg16_run); benchmark("squeezenet-ssd", squeezenet_ssd_init, squeezenet_ssd_run); benchmark("mobilenet-ssd", mobilenet_ssd_init, mobilenet_ssd_run); benchmark("mobilenet-yolo", mobilenet_yolo_init, mobilenet_yolo_run); return 0; }