diff --git a/CMakeLists.txt b/CMakeLists.txt index fb348bb0775464d65a0c1da1146551c402f0cec7..58f1d75c29bd186c1746c17f2a69cba03f8a7fd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,14 @@ target_include_directories(${PROJECT_NAME}_export PUBLIC eisgenerator) set_target_properties(${PROJECT_NAME}_export PROPERTIES COMPILE_FLAGS ${COMMON_COMPILE_FLAGS} LINK_FLAGS ${COMMON_LINK_FLAGS}) install(TARGETS ${PROJECT_NAME}_export DESTINATION bin) +link_directories(${CMAKE_CURRENT_BINARY_DIR}) +set(SRC_FILES_TEST_APP bench.cpp) +add_executable(${PROJECT_NAME}_bench ${SRC_FILES_TEST_APP}) +add_dependencies(${PROJECT_NAME}_bench ${PROJECT_NAME}) +target_link_libraries(${PROJECT_NAME}_bench ${LIBS_TEST}) +target_include_directories(${PROJECT_NAME}_bench PUBLIC eisgenerator) +set_target_properties(${PROJECT_NAME}_bench PROPERTIES COMPILE_FLAGS ${COMMON_COMPILE_FLAGS} LINK_FLAGS ${COMMON_LINK_FLAGS}) + if (DOXYGEN_FOUND) set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/libeisgenerator.doxygen.in) set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/doc/libeisgenerator.doxygen) diff --git a/bench.cpp b/bench.cpp new file mode 100644 index 0000000000000000000000000000000000000000..714cfbe20104047916ae73c6b6eba9622509e1b0 --- /dev/null +++ b/bench.cpp @@ -0,0 +1,69 @@ +#include <chrono> +#include <cassert> +#include <thread> + +#include "model.h" +#include "log.h" +#include "compcache.h" + + +int main() +{ + eis::Log::level = eis::Log::INFO; + eis::Log(eis::Log::INFO)<<"Eisgenerator Benchmark"; + + std::string modelStr = "rp-rp-rp-rl"; + eis::Log::level = eis::Log::ERROR; + static constexpr long repetitions = 50000; + eis::Model model(modelStr, 100, true); + eis::Range omega(0.1, 1e6, 50, true); + const long datapoints = repetitions*50; + eis::Log::level = eis::Log::INFO; + eis::CompCache* cache = eis::CompCache::getInstance(); + std::chrono::high_resolution_clock clock; + std::vector<size_t> indecies(repetitions); + + eis::Log(eis::Log::INFO)<<"model: "<<modelStr<<" with "<<model.getRequiredStepsForSweeps()<<" steps for sweeps"; + + for(size_t i = 0; i < repetitions; ++i) + indecies[i] = i % model.getRequiredStepsForSweeps(); + + cache->dropAllObjects(); + + eis::Log(eis::Log::INFO)<<"\nSingle Core:"; + + auto start = clock.now(); + for(size_t i = 0; i < repetitions; ++i) + model.executeSweep(omega, i % model.getRequiredStepsForSweeps()); + auto end = clock.now(); + std::chrono::duration<double> diff = end - start; + eis::Log(eis::Log::INFO)<<"Graph execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s"; + + model.compile(); + start = clock.now(); + for(size_t i = 0; i < repetitions; ++i) + model.executeSweep(omega, i % model.getRequiredStepsForSweeps()); + end = clock.now(); + diff = end - start; + eis::Log(eis::Log::INFO)<<"Compiled execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s"; + + cache->dropAllObjects(); + model.dropCompiled(); + + eis::Log(eis::Log::INFO)<<"\nMulti Core with "<<std::thread::hardware_concurrency()<<" threads:"; + + start = clock.now(); + model.executeSweeps(omega, indecies, true); + end = clock.now(); + diff = end - start; + eis::Log(eis::Log::INFO)<<"Graph execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s"; + + model.compile(); + start = clock.now(); + model.executeSweeps(omega, indecies, true); + end = clock.now(); + diff = end - start; + eis::Log(eis::Log::INFO)<<"Compiled execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s"; + + +} diff --git a/eisgenerator/model.h b/eisgenerator/model.h index 0c5d1c4501077442aa9f197e7c1d69b028cbf4ef..7d8473fc2aafbe6923d6158e3092128caca918fa 100644 --- a/eisgenerator/model.h +++ b/eisgenerator/model.h @@ -245,6 +245,12 @@ public: */ bool compile(); + /** + * @brief This function drops the compiled object code, reverting to graph execution + * + */ + void dropCompiled(); + /** * @brief This member determines if the model is in a state ready to execute. * diff --git a/model.cpp b/model.cpp index 27593f9d2390e7f255582596331e23bf51ba48f3..a68cecd79679cbe489f5843127c97e23b5c87461 100644 --- a/model.cpp +++ b/model.cpp @@ -683,6 +683,11 @@ bool Model::compile() return true; } +void Model::dropCompiled() +{ + _compiledModel = nullptr; +} + std::string Model::getCode() { if(!_model || !_model->compileable())