void FrameScheduler::DoOneFrame() { RunAllMonopolies(); CreateThreads(); RunMainThreadWork(); JoinAllThreads(); ResetAllWorkUnits(); WaitUntilNextFrame(); }
void FrameScheduler::CleanUpThreads() { #ifdef MEZZ_USEBARRIERSEACHFRAME while(1!=AtomicCompareAndSwap32(&LastFrame,LastFrame,1)); StartFrameSync.SetThreadSyncCount(0); EndFrameSync.SetThreadSyncCount(0); // Handle situations where Threads have not been created yet #else JoinAllThreads(); #endif }
void OpenMPManager::TransferVectors(size_t Nener,double* h_energies, double* h_nu, double* h_aif,int* h_gns,double* h_gamma,double * h_n){ JoinAllThreads(); memcpy(g_energies,h_energies,size_t(Nener)*sizeof(double)); memcpy(g_nu,h_nu,size_t(Nener)*sizeof(double)); memcpy(g_aif,h_aif,size_t(Nener)*sizeof(double)); memcpy(g_gns,h_gns,size_t(Nener)*sizeof(int)); if(h_gamma!= NULL && h_n != NULL){ memcpy(g_gamma,h_gamma,size_t(Nener)*sizeof(double)); memcpy(g_n,h_n,size_t(Nener)*sizeof(double)); } }
void OpenMPManager::TransferResults(double* h_freq,double* h_intens,int N){ printf("Wait for the jobs to finish\n"); JoinAllThreads(); // If we aren't done wait printf("Transferring from all threads into host!\n"); for(int i = 0; i < total_threads; i++){ for(int j = 0; j < N; j++){ g_intens[j]+=t_intens[i][j]; } } memcpy(h_intens,g_intens,sizeof(double)*size_t(N)); }