static void _init_ray_tasks_cost2(Patch *p, long layer, long process_id) { Patch_Cost *pc ; long c_est ; long qid ; long min_cost_q, min_cost ; pc = &global->patch_cost[ p->seq_no ] ; c_est = pc->cost_estimate ; if( c_est < 0 ) /* Already processed */ return ; if( c_est < avg_cost_of_patch * layer ) return ; /* Find the first available queue */ min_cost_q = 0 ; min_cost = queue_cost[ 0 ] ; for( qid = 0 ; qid < n_taskqueues ; qid++ ) { if( (c_est + queue_cost[ qid ]) <= avg_cost_of_q ) break ; if( min_cost > queue_cost[ qid ] ) { min_cost_q = qid ; min_cost = queue_cost[ qid ] ; } } if( qid >= n_taskqueues ) { /* All queues are nearly full. Put to min-cost queue */ qid = min_cost_q ; } /* Update queue cost */ queue_cost[ qid ] += c_est ; /* Clear incoming energy variable */ p->el_root->rad_in.r = 0.0 ; p->el_root->rad_in.g = 0.0 ; p->el_root->rad_in.b = 0.0 ; /* Clear cost value */ pc->cost_estimate = -1 ; pc->n_bsp_node = 0 ; /* Enqueue */ enqueue_ray_task( qid, p->el_root, TASK_APPEND, process_id ) ; }
void create_ray_task(Element *e, long process_id) { /* Check existing parallelism */ if( ((e->n_interactions + e->n_vis_undef_inter) < N_inter_parallel_bf_refine) || taskq_too_long(&global->task_queue[ taskqueue_id[process_id] ], n_tasks_per_queue) ) { /* Task size is small, or the queue is too long. Solve it immediately */ process_rays( e, process_id ) ; return ; } /* Put in the queue */ enqueue_ray_task( taskqueue_id[process_id], e, TASK_INSERT, process_id ) ; }