#define VIDEO_WINMAIN_ARGS
#include <iostream>
#include "oneapi/tbb/tick_count.h"
#include "oneapi/tbb/global_control.h"
#include "common/utility/utility.hpp"
#include "common/utility/get_default_num_threads.hpp"
#include "seismic_video.hpp"
#include "universe.hpp"
Universe u;
struct RunOptions {
utility::thread_number_range threads;
int numberOfFrames;
bool silent;
bool parallel;
RunOptions(utility::thread_number_range threads_,
int number_of_frames_,
bool silent_,
bool parallel_)
: threads(threads_),
numberOfFrames(number_of_frames_),
silent(silent_),
parallel(parallel_) {}
};
RunOptions ParseCommandLine(int argc, char *argv[]) {
utility::thread_number_range threads(
utility::get_default_num_threads, 0, utility::get_default_num_threads());
int numberOfFrames = 0;
bool silent = false;
bool serial = false;
utility::parse_cli_arguments(
argc,
argv,
utility::cli_argument_pack()
.positional_arg(threads, "n-of-threads", utility::thread_number_range_desc)
.positional_arg(numberOfFrames,
"n-of-frames",
"number of frames the example processes internally (0 means unlimited)")
.arg(silent, "silent", "no output except elapsed time")
.arg(serial, "serial", "in GUI mode start with serial version of algorithm"));
return RunOptions(threads, numberOfFrames, silent, !serial);
}
int main(int argc, char *argv[]) {
oneapi::tbb::tick_count mainStartTime = oneapi::tbb::tick_count::now();
RunOptions options = ParseCommandLine(argc, argv);
SeismicVideo video(u, options.numberOfFrames, options.threads.last, options.parallel);
if (video.init_window(u.UniverseWidth, u.UniverseHeight)) {
video.calc_fps = true;
video.threaded = options.threads.first > 0;
u.InitializeUniverse(video);
video.main_loop();
}
else if (video.init_console()) {
if (options.numberOfFrames == 0) {
options.numberOfFrames = 1000;
std::cout << "Substituting 1000 for unlimited frames because not running interactively"
<< "\n";
}
for (int p = options.threads.first; p <= options.threads.last;
p = options.threads.step(p)) {
oneapi::tbb::tick_count xwayParallelismStartTime = oneapi::tbb::tick_count::now();
u.InitializeUniverse(video);
int numberOfFrames = options.numberOfFrames;
if (p == 0) {
for (int i = 0; i < numberOfFrames; ++i) {
u.SerialUpdateUniverse();
}
}
else {
oneapi::tbb::global_control c(oneapi::tbb::global_control::max_allowed_parallelism,
p);
for (int i = 0; i < numberOfFrames; ++i) {
u.ParallelUpdateUniverse();
}
}
if (!options.silent) {
double fps =
options.numberOfFrames /
((oneapi::tbb::tick_count::now() - xwayParallelismStartTime).seconds());
std::cout << fps << " frame per sec with ";
if (p == 0) {
std::cout << "serial code"
<< "\n";
}
else {
std::cout << p << " way parallelism"
<< "\n";
}
}
}
}
video.terminate();
utility::report_elapsed_time((oneapi::tbb::tick_count::now() - mainStartTime).seconds());
return 0;
}