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