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 // Support for GUI display for Polygon overlay demo
18d86ed7fbStbbdev 
19d86ed7fbStbbdev #define VIDEO_WINMAIN_ARGS
20d86ed7fbStbbdev #include <iostream>
21d86ed7fbStbbdev 
22d86ed7fbStbbdev #include "oneapi/tbb/tick_count.h"
23d86ed7fbStbbdev 
24d86ed7fbStbbdev #include "common/utility/get_default_num_threads.hpp"
25d86ed7fbStbbdev 
26d86ed7fbStbbdev #include "polyover.hpp"
27d86ed7fbStbbdev #include "polymain.hpp"
28d86ed7fbStbbdev #include "pover_video.hpp"
29d86ed7fbStbbdev #ifndef _WIN32
30d86ed7fbStbbdev #include <sys/time.h>
31d86ed7fbStbbdev #include <unistd.h>
32d86ed7fbStbbdev 
rt_sleep(int msec)33d86ed7fbStbbdev void rt_sleep(int msec) {
34d86ed7fbStbbdev     usleep(msec * 1000);
35d86ed7fbStbbdev }
36d86ed7fbStbbdev 
37d86ed7fbStbbdev #else //_WIN32
38d86ed7fbStbbdev 
39d86ed7fbStbbdev #undef OLDUNIXTIME
40d86ed7fbStbbdev #undef STDTIME
41d86ed7fbStbbdev 
42d86ed7fbStbbdev #include <windows.h>
43d86ed7fbStbbdev 
rt_sleep(int msec)44d86ed7fbStbbdev void rt_sleep(int msec) {
45d86ed7fbStbbdev     Sleep(msec);
46d86ed7fbStbbdev }
47d86ed7fbStbbdev 
48d86ed7fbStbbdev #endif /*  _WIN32  */
49d86ed7fbStbbdev 
g_next_frame()50d86ed7fbStbbdev bool g_next_frame() {
51d86ed7fbStbbdev     if (++n_next_frame_calls >= frame_skips) { // the data race here is benign
52d86ed7fbStbbdev         n_next_frame_calls = 0;
53d86ed7fbStbbdev         return gVideo->next_frame();
54d86ed7fbStbbdev     }
55d86ed7fbStbbdev     return gVideo->running;
56d86ed7fbStbbdev }
57d86ed7fbStbbdev 
g_last_frame()58d86ed7fbStbbdev bool g_last_frame() {
59d86ed7fbStbbdev     if (n_next_frame_calls)
60d86ed7fbStbbdev         return gVideo->next_frame();
61d86ed7fbStbbdev     return gVideo->running;
62d86ed7fbStbbdev }
63d86ed7fbStbbdev 
initializeVideo(int argc,char * argv[])64d86ed7fbStbbdev bool initializeVideo(int argc, char *argv[]) {
65d86ed7fbStbbdev     //pover_video *l_video = new pover_video();
66d86ed7fbStbbdev     //gVideo = l_video;
67d86ed7fbStbbdev     gVideo->init_console(); // don't check return code.
68d86ed7fbStbbdev     gVideo->title = g_windowTitle;
69d86ed7fbStbbdev     g_useGraphics = gVideo->init_window(g_xwinsize, g_ywinsize);
70d86ed7fbStbbdev     return true;
71d86ed7fbStbbdev }
72d86ed7fbStbbdev 
on_process()73d86ed7fbStbbdev void pover_video::on_process() {
74d86ed7fbStbbdev     oneapi::tbb::tick_count t0, t1;
75d86ed7fbStbbdev     double naiveParallelTime, domainSplitParallelTime;
76d86ed7fbStbbdev     // create map1  These could be done in parallel, if the pseudorandom number generator were re-seeded.
77d86ed7fbStbbdev     GenerateMap(
78d86ed7fbStbbdev         &gPolymap1, gMapXSize, gMapYSize, gNPolygons, /*red*/ 255, /*green*/ 0, /*blue*/ 127);
79d86ed7fbStbbdev     // create map2
80d86ed7fbStbbdev     GenerateMap(
81d86ed7fbStbbdev         &gPolymap2, gMapXSize, gMapYSize, gNPolygons, /*red*/ 0, /*green*/ 255, /*blue*/ 127);
82d86ed7fbStbbdev     //
83d86ed7fbStbbdev     // Draw source maps
84d86ed7fbStbbdev     gDrawXOffset = map1XLoc;
85d86ed7fbStbbdev     gDrawYOffset = map1YLoc;
86d86ed7fbStbbdev     for (int i = 0; i < int(gPolymap1->size()); i++) {
87d86ed7fbStbbdev         (*gPolymap1)[i].drawPoly();
88d86ed7fbStbbdev     }
89d86ed7fbStbbdev     gDrawXOffset = map2XLoc;
90d86ed7fbStbbdev     gDrawYOffset = map2YLoc;
91d86ed7fbStbbdev     for (int i = 0; i < int(gPolymap2->size()); i++) {
92d86ed7fbStbbdev         (*gPolymap2)[i].drawPoly();
93d86ed7fbStbbdev     }
94d86ed7fbStbbdev     gDoDraw = true;
95d86ed7fbStbbdev 
96d86ed7fbStbbdev     // run serial map generation
97d86ed7fbStbbdev     gDrawXOffset = maprXLoc;
98d86ed7fbStbbdev     gDrawYOffset = maprYLoc;
99d86ed7fbStbbdev     {
100d86ed7fbStbbdev         RPolygon *xp =
101d86ed7fbStbbdev             new RPolygon(0, 0, gMapXSize - 1, gMapYSize - 1, 0, 0, 0); // Clear the output space
102d86ed7fbStbbdev         delete xp;
103d86ed7fbStbbdev         t0 = oneapi::tbb::tick_count::now();
104d86ed7fbStbbdev         SerialOverlayMaps(&gResultMap, gPolymap1, gPolymap2);
105d86ed7fbStbbdev         t1 = oneapi::tbb::tick_count::now();
106d86ed7fbStbbdev         std::cout << "Serial overlay took " << (t1 - t0).seconds() * 1000 << " msec"
107d86ed7fbStbbdev                   << "\n";
108d86ed7fbStbbdev         gSerialTime = (t1 - t0).seconds() * 1000;
109d86ed7fbStbbdev #if _DEBUG
110d86ed7fbStbbdev         CheckPolygonMap(gResultMap);
111d86ed7fbStbbdev         // keep the map for comparison purposes.
112d86ed7fbStbbdev #else
113d86ed7fbStbbdev         delete gResultMap;
114d86ed7fbStbbdev #endif
115d86ed7fbStbbdev         if (gCsvFile.is_open()) {
116d86ed7fbStbbdev             gCsvFile << "Serial Time," << gSerialTime << "\n";
117d86ed7fbStbbdev             gCsvFile << "Threads,";
118d86ed7fbStbbdev             if (gThreadsLow == THREADS_UNSET || gThreadsLow == utility::get_default_num_threads()) {
119d86ed7fbStbbdev                 gCsvFile << "Threads,Automatic";
120d86ed7fbStbbdev             }
121d86ed7fbStbbdev             else {
122d86ed7fbStbbdev                 for (int i = gThreadsLow; i <= gThreadsHigh; i++) {
123d86ed7fbStbbdev                     gCsvFile << i;
124d86ed7fbStbbdev                     if (i < gThreadsHigh)
125d86ed7fbStbbdev                         gCsvFile << ",";
126d86ed7fbStbbdev                 }
127d86ed7fbStbbdev             }
128d86ed7fbStbbdev             gCsvFile << "\n";
129d86ed7fbStbbdev         }
130d86ed7fbStbbdev         if (gIsGraphicalVersion)
131d86ed7fbStbbdev             rt_sleep(2000);
132d86ed7fbStbbdev     }
133d86ed7fbStbbdev     // run naive parallel map generation
134d86ed7fbStbbdev     {
135d86ed7fbStbbdev         Polygon_map_t *resultMap;
136d86ed7fbStbbdev         if (gCsvFile.is_open()) {
137d86ed7fbStbbdev             gCsvFile << "Naive Time";
138d86ed7fbStbbdev         }
139d86ed7fbStbbdev         NaiveParallelOverlay(resultMap, *gPolymap1, *gPolymap2);
140d86ed7fbStbbdev         delete resultMap;
141d86ed7fbStbbdev         if (gIsGraphicalVersion)
142d86ed7fbStbbdev             rt_sleep(2000);
143d86ed7fbStbbdev     }
144d86ed7fbStbbdev     // run split map generation
145d86ed7fbStbbdev     {
146d86ed7fbStbbdev         Polygon_map_t *resultMap;
147d86ed7fbStbbdev         if (gCsvFile.is_open()) {
148d86ed7fbStbbdev             gCsvFile << "Split Time";
149d86ed7fbStbbdev         }
150d86ed7fbStbbdev         SplitParallelOverlay(&resultMap, gPolymap1, gPolymap2);
151d86ed7fbStbbdev         delete resultMap;
152d86ed7fbStbbdev         if (gIsGraphicalVersion)
153d86ed7fbStbbdev             rt_sleep(2000);
154d86ed7fbStbbdev     }
155d86ed7fbStbbdev     // split, accumulating into concurrent vector
156d86ed7fbStbbdev     {
157d86ed7fbStbbdev         concurrent_Polygon_map_t *cresultMap;
158d86ed7fbStbbdev         if (gCsvFile.is_open()) {
159d86ed7fbStbbdev             gCsvFile << "Split CV time";
160d86ed7fbStbbdev         }
161d86ed7fbStbbdev         SplitParallelOverlayCV(&cresultMap, gPolymap1, gPolymap2);
162d86ed7fbStbbdev         delete cresultMap;
163d86ed7fbStbbdev         if (gIsGraphicalVersion)
164d86ed7fbStbbdev             rt_sleep(2000);
165d86ed7fbStbbdev     }
166d86ed7fbStbbdev     // split, accumulating into ETS
167d86ed7fbStbbdev     {
168d86ed7fbStbbdev         ETS_Polygon_map_t *cresultMap;
169d86ed7fbStbbdev         if (gCsvFile.is_open()) {
170d86ed7fbStbbdev             gCsvFile << "Split ETS time";
171d86ed7fbStbbdev         }
172d86ed7fbStbbdev         SplitParallelOverlayETS(&cresultMap, gPolymap1, gPolymap2);
173d86ed7fbStbbdev         delete cresultMap;
174d86ed7fbStbbdev         if (gIsGraphicalVersion)
175d86ed7fbStbbdev             rt_sleep(2000);
176d86ed7fbStbbdev     }
177d86ed7fbStbbdev     if (gIsGraphicalVersion)
178d86ed7fbStbbdev         rt_sleep(8000);
179d86ed7fbStbbdev     delete gPolymap1;
180d86ed7fbStbbdev     delete gPolymap2;
181d86ed7fbStbbdev #if _DEBUG
182d86ed7fbStbbdev     delete gResultMap;
183d86ed7fbStbbdev #endif
184d86ed7fbStbbdev }
185