void WaitForRegionsToFinishProcessing (ProcessorQueue &analysis_queue, ComputationPlanner &analysis_compute_plan)
{
  // wait for all of the regions to finish processing before moving on to the next
  // image
  // Need better logic...This is just following the different steps involved in signal processing
  analysis_queue.GetCpuQueue()->WaitTillDone();
  if (analysis_queue.GetMultiFitGpuQueue())
    analysis_queue.GetMultiFitGpuQueue()->WaitTillDone();
  analysis_queue.GetCpuQueue()->WaitTillDone();
  if (analysis_queue.GetSingleFitGpuQueue())
    analysis_queue.GetSingleFitGpuQueue()->WaitTillDone();
  if (analysis_compute_plan.use_gpu_acceleration)
    analysis_queue.GetCpuQueue()->WaitTillDone();
}
void SpinUpGPUThreads(ProcessorQueue &analysis_queue, ComputationPlanner &analysis_compute_plan)
{
  if (analysis_compute_plan.use_gpu_acceleration) {
    // create gpu thread for multi flow fit
    CreateGpuThreadsForFitType(analysis_queue.GetMultiFitGpuInfo(), GPU_MULTI_FLOW_FIT, 
        analysis_compute_plan.numMultiFlowFitGpuWorkers, analysis_queue.GetMultiFitGpuQueue(),
        analysis_compute_plan.valid_devices);
    // create gpu thread for single flow fit
    CreateGpuThreadsForFitType(analysis_queue.GetSingleFitGpuInfo(), GPU_SINGLE_FLOW_FIT, 
        analysis_compute_plan.numSingleFlowFitGpuWorkers, analysis_queue.GetSingleFitGpuQueue(),
        analysis_compute_plan.valid_devices);
  }
}