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