void RunProfiling(int iterations, unsigned int uiWorkgroup) { // once without timing to prime the GPU nbody->update(activeParams.m_timestep); nbody->synchronizeThreads(); // Start timer 0 and process n loops on the GPU shrDeltaT(FUNCTIME); for (int i = 0; i < iterations; ++i) { nbody->update(activeParams.m_timestep); } nbody->synchronizeThreads(); // Get elapsed time and throughput, then log to sample and master logs double dSeconds = shrDeltaT(FUNCTIME); double dGigaInteractionsPerSecond = 0.0; double dGigaFlops = 0.0; ComputePerfStats(dGigaInteractionsPerSecond, dGigaFlops, dSeconds, iterations); shrLogEx(LOGBOTH | MASTER, 0, "oclNBody-%s, Throughput = %.4f GFLOP/s, Time = %.5f s, Size = %u bodies, NumDevsUsed = %u, Workgroup = %u\n", (bDouble ? "DP" : "SP"), dGigaFlops, dSeconds/(double)iterations, numBodies, uiNumDevsUsed, uiWorkgroup); }
// Primary GLUT callback loop function //***************************************************************************** void DisplayGL() { // update the simulation, unless paused double dProcessingTime = 0.0; if (!bPause) { // start timer FUNCTIME if it's update time if (iFrameCount >= iFrameTrigger) { shrDeltaT(FUNCTIME); } // Run the simlation computations nbody->update(activeParams.m_timestep); nbody->getArray(BodySystem::BODYSYSTEM_POSITION); // Make graphics work with or without CL/GL interop if (bUsePBO) { renderer->setPBO((unsigned int)nbody->getCurrentReadBuffer(), nbody->getNumBodies()); } else { renderer->setPositions((float*)nbody->getCurrentReadBuffer(), nbody->getNumBodies()); } // get processing time from timer FUNCTIME, if it's update time if (iFrameCount >= iFrameTrigger) { dProcessingTime = shrDeltaT(FUNCTIME); } } // Redraw main graphics display, if enabled glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (displayEnabled) { // view transform glMatrixMode(GL_MODELVIEW); glLoadIdentity(); for (int c = 0; c < 3; ++c) { camera_trans_lag[c] += (camera_trans[c] - camera_trans_lag[c]) * inertia; camera_rot_lag[c] += (camera_rot[c] - camera_rot_lag[c]) * inertia; } glTranslatef(camera_trans_lag[0], camera_trans_lag[1], camera_trans_lag[2]); glRotatef(camera_rot_lag[0], 1.0, 0.0, 0.0); glRotatef(camera_rot_lag[1], 0.0, 1.0, 0.0); renderer->setSpriteSize(activeParams.m_pointSize); renderer->display(displayMode); } // Display user interface if enabled if (bShowSliders) { glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // invert color glEnable(GL_BLEND); paramlist->Render(0, 0); glDisable(GL_BLEND); } // Flip backbuffer to screen glutSwapBuffers(); // If frame count has triggerd, increment the frame counter, and do fps stuff if (iFrameCount++ > iFrameTrigger) { // If tour mode is enabled & interval has timed out, switch to next tour/demo mode dElapsedTime += shrDeltaT(DEMOTIME); if (bTour && (dElapsedTime > demoTime)) { dElapsedTime = 0.0; activeDemo = (activeDemo + 1) % numDemos; SelectDemo(activeDemo); } // get the perf and fps stats iFramesPerSec = (int)((double)iFrameCount/ shrDeltaT(FPSTIME)); double dGigaInteractionsPerSecond = 0.0; double dGigaFlops = 0.0; ComputePerfStats(dGigaInteractionsPerSecond, dGigaFlops, dProcessingTime, 1); // If not paused, set the display window title, reset trigger and log info char cTitle[256]; if(!bPause) { #ifdef GPU_PROFILING #ifdef _WIN32 sprintf_s(cTitle, "OpenCL for GPU Nbody Demo (%d bodies): %i fps | %0.4f BIPS | %0.4f GFLOP/s", numBodies, iFramesPerSec, dGigaInteractionsPerSecond, dGigaFlops); #else sprintf(cTitle, "OpenCL for GPU Nbody Demo (%d bodies): %i fps | %0.4f BIPS | %0.4f GFLOP/s", numBodies, iFramesPerSec, dGigaInteractionsPerSecond, dGigaFlops); #endif #else #ifdef _WIN32 sprintf_s(cTitle, "OpenCL for GPU Nbody Demo (%d bodies)", numBodies, iFramesPerSec, dGigaInteractionsPerSecond); #else sprintf(cTitle, "OpenCL for GPU Nbody Demo (%d bodies)", numBodies, iFramesPerSec, dGigaInteractionsPerSecond); #endif #endif #ifndef __EMSCRIPTEN__ glutSetWindowTitle(cTitle); #else printf("%s\n",cTitle); #endif // Log fps and processing info to console and file shrLog("%s\n", cTitle); // if doing quick test, exit if ((bNoPrompt) && (!--iTestSets)) { // Cleanup up and quit shrQAFinish2(false, *pArgc, (const char **)pArgv, QA_PASSED); Cleanup(EXIT_SUCCESS); } // reset the frame counter and adjust trigger iFrameCount = 0; iFrameTrigger = (iFramesPerSec > 1) ? iFramesPerSec * 2 : 1; } } #ifndef __EMSCRIPTEN__ glutReportErrors(); #endif }