void AllocateProcessorQueue (ProcessorQueue &my_queue,ComputationPlanner &analysis_compute_plan, int numRegions) { //create queue for passing work to thread pool my_queue.SetCpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers+1)); if (analysis_compute_plan.use_gpu_acceleration) { if(analysis_compute_plan.numBkgWorkers_gpu) { my_queue.AllocateGpuInfo(analysis_compute_plan.numBkgWorkers_gpu); my_queue.SetGpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers_gpu+1)); } } // decide on whether to use both CPU and GPU for bkg model fitting jobs if (analysis_compute_plan.use_gpu_only_fitting) { my_queue.turnOffHeterogeneousComputing(); } if (!analysis_compute_plan.gpu_multiflow_fit) { my_queue.turnOffGpuMultiFlowFitting(); } if (!analysis_compute_plan.gpu_singleflow_fit) { my_queue.turnOffGpuSingleFlowFitting(); } { int cworker; pthread_t work_thread; // spawn threads for doing background correction/fitting work for (cworker = 0; cworker < analysis_compute_plan.numBkgWorkers; cworker++) { int t = pthread_create (&work_thread, NULL, BkgFitWorkerCpu, &my_queue); pthread_detach(work_thread); if (t) fprintf (stderr, "Error starting thread\n"); } } fprintf (stdout, "Number of CPU threads for beadfind: %d\n", analysis_compute_plan.numBkgWorkers); if (analysis_compute_plan.use_gpu_acceleration) fprintf (stdout, "Number of GPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers_gpu); else fprintf (stdout, "Number of CPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers); }
void AllocateProcessorQueue (ProcessorQueue &my_queue,ComputationPlanner &analysis_compute_plan, int numRegions) { //create queue for passing work to thread pool my_queue.SetCpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers+1)); if (analysis_compute_plan.use_gpu_acceleration) { if(analysis_compute_plan.numMultiFlowFitGpuWorkers) { my_queue.AllocateMultiFitGpuInfo(analysis_compute_plan.numMultiFlowFitGpuWorkers); my_queue.SetMultiFitGpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers_gpu+1)); } if(analysis_compute_plan.numSingleFlowFitGpuWorkers) { my_queue.AllocateSingleFitGpuInfo(analysis_compute_plan.numSingleFlowFitGpuWorkers); my_queue.SetSingleFitGpuQueue(new WorkerInfoQueue (numRegions*analysis_compute_plan.numBkgWorkers_gpu+1)); } } { int cworker; pthread_t work_thread; // spawn threads for doing background correction/fitting work for (cworker = 0; cworker < analysis_compute_plan.numBkgWorkers; cworker++) { int t = pthread_create (&work_thread, NULL, BkgFitWorkerCpu, &my_queue); pthread_detach(work_thread); if (t) fprintf (stderr, "Error starting thread\n"); } } fprintf (stdout, "Number of CPU threads for beadfind: %d\n", analysis_compute_plan.numBkgWorkers); if (analysis_compute_plan.use_gpu_acceleration) fprintf (stdout, "Number of GPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers_gpu); else fprintf (stdout, "Number of CPU threads for background model: %d\n", analysis_compute_plan.numBkgWorkers); }