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());
    }
示例#2
0
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";
}