xref: /oneTBB/examples/task_arena/fractal/main.cpp (revision b15aabb3)
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