void processTiles(const TileProcessingFunc& fun) { auto task = [&](uint32_t threadID) { auto loopID = 0u; while(true) { auto tileID = loopID * getSystemThreadCount() + threadID; ++loopID; if(tileID >= m_Params.m_nTileCount) { return; } uint32_t tileX = tileID % m_Params.m_TileCount.x; uint32_t tileY = tileID / m_Params.m_TileCount.x; Vec2u tileOrg = Vec2u(tileX, tileY) * m_Params.m_TileSize; auto viewport = Vec4u(tileOrg, m_Params.m_TileSize); if(viewport.x + viewport.z > m_Params.m_FramebufferSize.x) { viewport.z = m_Params.m_FramebufferSize.x - viewport.x; } if(viewport.y + viewport.w > m_Params.m_FramebufferSize.y) { viewport.w = m_Params.m_FramebufferSize.y - viewport.y; } fun(threadID, tileID, viewport); } }; launchThreads(task, getSystemThreadCount()); }
void benchLaunch() { CPerfCounter t; t.Reset(); int nl = 100; t.Start(); for(int n = 0; n < nl; n++) { launchThreads(); shutdownThreads(); } t.Stop(); std::cout << "Launch speed" << " " << t.GetElapsedTime() / nl * 1e9 << nWorkers << " ns\n"; }