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