diff --git a/repos/hello_gpgpu/run/hello_gpgpu.run b/repos/hello_gpgpu/run/hello_gpgpu.run index de3738a77b..cfbc688143 100644 --- a/repos/hello_gpgpu/run/hello_gpgpu.run +++ b/repos/hello_gpgpu/run/hello_gpgpu.run @@ -59,8 +59,9 @@ append config { + - + 2022-07-20 14:30 diff --git a/repos/hello_gpgpu/src/hello_gpgpu/main.cc b/repos/hello_gpgpu/src/hello_gpgpu/main.cc index aedb1cc8f9..2f4348575d 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/main.cc +++ b/repos/hello_gpgpu/src/hello_gpgpu/main.cc @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -12,152 +13,243 @@ // bench includes #include "benchmark/benchmark_extern.h" - -void testvm_construct(Genode::Env &env) +struct hello_gpgpu { - // wait for gpgpu construction - Libc::with_libc([&] { - usleep(5000000); - }); + Genode::Env& env; + unsigned int benchConfig; - // init CL env - Genode::log("===Init VM==="); - const unsigned long size = 0x10000 * 0x1000; - cl_genode clg(env, size); - clInitGenode(clg); + Genode::Attached_rom_dataspace config{env, "config"}; - // test RPCs - Genode::log("===Test RPC==="); - clg.testRPC(); - - // run the test and hope the best - Genode::log("===Test GPU==="); - Genode::Heap heap(env.ram(), env.rm()); - Genode::Allocator_avl alloc(&heap); - //const unsigned int size = 0x10000 * 0x1000; - Genode::Ram_dataspace_capability ram_cap = env.ram().alloc(size); - Genode::addr_t mapped_base = env.rm().attach(ram_cap); - alloc.add_range(mapped_base, size); - run_gpgpu_test(alloc); + void handle_config() + { + Genode::log("Reading benchmark config..."); + config.update(); - // run 2mm - Genode::log("===Run PolyBench==="); - Libc::with_libc([&] { - Genode::log("===Run 2mm==="); - ns_2mm::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run 3mm==="); - ns_3mm::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run atax==="); - ns_atax::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run bicg==="); - ns_bicg::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run doitgen==="); - ns_doitgen::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run gemm==="); - ns_gemm::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run gemver==="); - ns_gemver::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run gesummv==="); - ns_gesummv::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run mvt==="); - ns_mvt::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run syr2k==="); - ns_syr2k::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run syrk==="); - ns_syrk::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR + if (!config.valid()) { + Genode::log("Config is invalid!"); + return; + } - /*Genode::log("===Run gramschmidt==="); - ns_gramschmidt::main(0, 0); // this one is broken (div by 0 and unsolvable input instance) (official Linux version is broken too!) -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR*/ - Genode::log("===Run lu==="); - ns_lu::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR + benchConfig = config.xml().attribute_value("bench", (unsigned int)0); // => no benchmark + Genode::log("benchConfig: ", benchConfig); + } - Genode::log("===Run correlation==="); - ns_correlation::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run covariance==="); - ns_covariance::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR + Genode::Signal_handler config_handler { + env.ep(), *this, &hello_gpgpu::handle_config + }; - Genode::log("===Run adi==="); - ns_adi::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run convolution_2d==="); - ns_convolution_2d::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run convolution_3d==="); - ns_convolution_3d::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run fdtd_2d==="); - ns_fdtd_2d::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run jacobi_1d_imper==="); - ns_jacobi_1d_imper::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - Genode::log("===Run jacobi_2d_imper==="); - ns_jacobi_2d_imper::main(0, 0); -#ifdef USE_STUPID_ALLOCATOR - clg.reset(); -#endif // USE_STUPID_ALLOCATOR - }); + void run() + { + // init CL env + Genode::log("===Init VM==="); + const unsigned long size = 0x10000 * 0x1000; + cl_genode clg(env, size); + clInitGenode(clg); - Genode::log("===End==="); - Genode::log("hello gpgpu completed"); -} + // test RPCs + Genode::log("===Test RPC==="); + clg.testRPC(); + + // run the test and hope the best + Genode::log("===Test GPU==="); + Genode::Heap heap(env.ram(), env.rm()); + Genode::Allocator_avl alloc(&heap); + //const unsigned int size = 0x10000 * 0x1000; + Genode::Ram_dataspace_capability ram_cap = env.ram().alloc(size); + Genode::addr_t mapped_base = env.rm().attach(ram_cap); + alloc.add_range(mapped_base, size); + run_gpgpu_test(alloc); + + // run selected benchmarks + Genode::log("===Run PolyBench==="); + Libc::with_libc([&] { + if(benchConfig & (0x1 << 0)) + { + Genode::log("===Run 2mm==="); + ns_2mm::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 1)) + { + Genode::log("===Run 3mm==="); + ns_3mm::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 2)) + { + Genode::log("===Run atax==="); + ns_atax::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 3)) + { + Genode::log("===Run bicg==="); + ns_bicg::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 4)) + { + Genode::log("===Run doitgen==="); + ns_doitgen::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 5)) + { + Genode::log("===Run gemm==="); + ns_gemm::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 6)) + { + Genode::log("===Run gemver==="); + ns_gemver::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 7)) + { + Genode::log("===Run gesummv==="); + ns_gesummv::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 8)) + { + Genode::log("===Run mvt==="); + ns_mvt::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 9)) + { + Genode::log("===Run syr2k==="); + ns_syr2k::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 10)) + { + Genode::log("===Run syrk==="); + ns_syrk::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + + if(benchConfig & (0x1 << 11)) + { + Genode::log("===Run gramschmidt==="); + ns_gramschmidt::main(0, 0); // this one is broken (div by 0 and unsolvable input instance) (official Linux version is broken too!) +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 12)) + { + Genode::log("===Run lu==="); + ns_lu::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + + if(benchConfig & (0x1 << 13)) + { + Genode::log("===Run correlation==="); + ns_correlation::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 14)) + { + Genode::log("===Run covariance==="); + ns_covariance::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + + if(benchConfig & (0x1 << 15)) + { + Genode::log("===Run adi==="); + ns_adi::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 16)) + { + Genode::log("===Run convolution_2d==="); + ns_convolution_2d::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 17)) + { + Genode::log("===Run convolution_3d==="); + ns_convolution_3d::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 18)) + { + Genode::log("===Run fdtd_2d==="); + ns_fdtd_2d::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 19)) + { + Genode::log("===Run jacobi_1d_imper==="); + ns_jacobi_1d_imper::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + if(benchConfig & (0x1 << 20)) + { + Genode::log("===Run jacobi_2d_imper==="); + ns_jacobi_2d_imper::main(0, 0); +#ifdef USE_STUPID_ALLOCATOR + clg.reset(); +#endif // USE_STUPID_ALLOCATOR + } + + }); + + Genode::log("===End==="); + Genode::log("hello gpgpu completed"); + } + + hello_gpgpu(Genode::Env &e) : env(e), benchConfig(0) + { + config.sigh(config_handler); + handle_config(); + } +}; void Libc::Component::construct(Libc::Env& env) { - testvm_construct(env); + static hello_gpgpu hg(env); + hg.run(); }