1d86ed7fbStbbdev /*
2*b15aabb3Stbbdev Copyright (c) 2005-2021 Intel Corporation
3d86ed7fbStbbdev
4d86ed7fbStbbdev Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev you may not use this file except in compliance with the License.
6d86ed7fbStbbdev You may obtain a copy of the License at
7d86ed7fbStbbdev
8d86ed7fbStbbdev http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev
10d86ed7fbStbbdev Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev See the License for the specific language governing permissions and
14d86ed7fbStbbdev limitations under the License.
15d86ed7fbStbbdev */
16d86ed7fbStbbdev
17d86ed7fbStbbdev #define VIDEO_WINMAIN_ARGS
18d86ed7fbStbbdev
19d86ed7fbStbbdev #include <cstdio>
20d86ed7fbStbbdev
21d86ed7fbStbbdev #include <iostream>
22d86ed7fbStbbdev
23d86ed7fbStbbdev #include "oneapi/tbb/tick_count.h"
24d86ed7fbStbbdev
25d86ed7fbStbbdev #include "common/utility/utility.hpp"
26d86ed7fbStbbdev
27d86ed7fbStbbdev #include "fractal.hpp"
28d86ed7fbStbbdev #include "fractal_video.hpp"
29d86ed7fbStbbdev
30d86ed7fbStbbdev bool silent = false;
31d86ed7fbStbbdev bool single = false;
32d86ed7fbStbbdev bool schedule_auto = false;
33d86ed7fbStbbdev int grain_size = 8;
34d86ed7fbStbbdev
main(int argc,char * argv[])35d86ed7fbStbbdev int main(int argc, char *argv[]) {
36d86ed7fbStbbdev oneapi::tbb::tick_count mainStartTime = oneapi::tbb::tick_count::now();
37d86ed7fbStbbdev
38d86ed7fbStbbdev // It is used for console mode for test with different number of threads and also has
39d86ed7fbStbbdev // meaning for GUI: threads.first - use separate event/updating loop thread (>0) or not (0).
40d86ed7fbStbbdev // threads.second - initialization value for scheduler
41d86ed7fbStbbdev utility::thread_number_range threads(utility::get_default_num_threads);
42d86ed7fbStbbdev int num_frames = -1;
43d86ed7fbStbbdev int max_iterations = 1000000;
44d86ed7fbStbbdev
45d86ed7fbStbbdev // command line parsing
46d86ed7fbStbbdev utility::parse_cli_arguments(
47d86ed7fbStbbdev argc,
48d86ed7fbStbbdev argv,
49d86ed7fbStbbdev utility::cli_argument_pack()
50d86ed7fbStbbdev //"-h" option for displaying help is present implicitly
51d86ed7fbStbbdev .positional_arg(threads, "n-of-threads", utility::thread_number_range_desc)
52d86ed7fbStbbdev .positional_arg(
53d86ed7fbStbbdev num_frames, "n-of-frames", "number of frames the example processes internally")
54d86ed7fbStbbdev .positional_arg(
55d86ed7fbStbbdev max_iterations, "max-of-iterations", "maximum number of the fractal iterations")
56d86ed7fbStbbdev .positional_arg(grain_size, "grain-size", "the grain size value")
57d86ed7fbStbbdev .arg(schedule_auto, "use-auto-partitioner", "use oneapi::tbb::auto_partitioner")
58d86ed7fbStbbdev .arg(silent, "silent", "no output except elapsed time")
59d86ed7fbStbbdev .arg(single, "single", "process only one fractal"));
60d86ed7fbStbbdev
61d86ed7fbStbbdev fractal_video video;
62d86ed7fbStbbdev
63d86ed7fbStbbdev // video layer init
64d86ed7fbStbbdev if (video.init_window(1024, 512)) {
65d86ed7fbStbbdev video.calc_fps = false;
66d86ed7fbStbbdev video.threaded = threads.first > 0;
67d86ed7fbStbbdev // initialize fractal group
68d86ed7fbStbbdev fractal_group fg(video.get_drawing_memory(), threads.last, max_iterations, num_frames);
69d86ed7fbStbbdev video.set_fractal_group(fg);
70d86ed7fbStbbdev // main loop
71d86ed7fbStbbdev video.main_loop();
72d86ed7fbStbbdev }
73d86ed7fbStbbdev else if (video.init_console()) {
74d86ed7fbStbbdev // in console mode we always have limited number of frames
75d86ed7fbStbbdev num_frames = num_frames < 0 ? 1 : num_frames;
76d86ed7fbStbbdev for (int p = threads.first; p <= threads.last; p = threads.step(p)) {
77d86ed7fbStbbdev if (!silent)
78d86ed7fbStbbdev printf("Threads = %d\n", p);
79d86ed7fbStbbdev fractal_group fg(video.get_drawing_memory(), p, max_iterations, num_frames);
80d86ed7fbStbbdev fg.run(!single);
81d86ed7fbStbbdev }
82d86ed7fbStbbdev }
83d86ed7fbStbbdev video.terminate();
84d86ed7fbStbbdev utility::report_elapsed_time((oneapi::tbb::tick_count::now() - mainStartTime).seconds());
85d86ed7fbStbbdev return 0;
86d86ed7fbStbbdev }
87