/* __ompc_expand_task_pool_default * Expand the task pool for a new team size. Simply a matter of add an extra * task queue per extra thread. */ omp_task_pool_t * __ompc_expand_task_pool_default(omp_task_pool_t *pool, int new_team_size) { int i; int old_team_size; omp_task_queue_level_t *per_thread; if (pool == NULL) return __ompc_create_task_pool(new_team_size); per_thread = &pool->level[PER_THREAD]; old_team_size = pool->team_size; per_thread->num_queues = new_team_size * 2; per_thread->task_queue = aligned_realloc( (void *) per_thread->task_queue, sizeof(omp_queue_t) * old_team_size * 2, sizeof(omp_queue_t) * new_team_size * 2, CACHE_LINE_SIZE); Is_True(per_thread->task_queue != NULL, ("__ompc_expand_task_pool: couldn't expand the task pool")); for (i = old_team_size; i < new_team_size; i++) { __ompc_queue_init(&per_thread->task_queue[TIED_IDX(i)], __omp_task_queue_num_slots); __ompc_queue_init(&per_thread->task_queue[UNTIED_IDX(i)], __omp_task_queue_num_slots); } return pool; }
/* __ompc_init_task_pool_simple: * Initializes a task pool, for which tasks may be added and taken. The task * pool will be single-level, with 1 task queue allotted per thread. */ omp_task_pool_t * __ompc_create_task_pool_simple(int team_size) { int i; omp_task_pool_t *new_pool; omp_task_queue_level_t *per_thread; new_pool = (omp_task_pool_t *) aligned_malloc(sizeof(omp_task_pool_t), CACHE_LINE_SIZE); Is_True(new_pool != NULL, ("__ompc_create_task_pool: couldn't malloc new_pool")); new_pool->team_size = team_size; new_pool->num_levels = 1; new_pool->num_pending_tasks = 0; new_pool->level = aligned_malloc(sizeof(omp_task_queue_level_t), CACHE_LINE_SIZE); pthread_mutex_init(&(new_pool->pool_lock), NULL); pthread_cond_init(&(new_pool->pool_cond), NULL); Is_True(new_pool->level != NULL, ("__ompc_create_task_pool: couldn't malloc level")); per_thread = &new_pool->level[PER_THREAD]; per_thread->num_queues = team_size; per_thread->task_queue = aligned_malloc(sizeof(omp_queue_t) * team_size, CACHE_LINE_SIZE); Is_True(per_thread->task_queue != NULL, ("__ompc_create_task_pool: couldn't malloc per-thread task queue")); for (i = 0; i < team_size; i++) __ompc_queue_init(&per_thread->task_queue[i], __omp_task_queue_num_slots); return new_pool; }
/* __ompc_init_task_pool_simple_2level: * Initializes a task pool, for which tasks may be added and taken. */ omp_task_pool_t * __ompc_create_task_pool_simple_2level(int team_size) { int i; omp_task_pool_t *new_pool; omp_task_queue_level_t *per_thread; omp_task_queue_level_t *community; new_pool = (omp_task_pool_t *) aligned_malloc(sizeof(omp_task_pool_t), CACHE_LINE_SIZE); Is_True(new_pool != NULL, ("__ompc_create_task_pool: couldn't malloc new_pool")); new_pool->team_size = team_size; new_pool->num_levels = 2; new_pool->num_pending_tasks = 0; new_pool->level = aligned_malloc(sizeof(omp_task_queue_level_t)*2, CACHE_LINE_SIZE); pthread_mutex_init(&(new_pool->pool_lock), NULL); pthread_cond_init(&(new_pool->pool_cond), NULL); Is_True(new_pool->level != NULL, ("__ompc_create_task_pool: couldn't malloc level")); per_thread = &new_pool->level[PER_THREAD]; community = &new_pool->level[COMMUNITY]; per_thread->num_queues = team_size; per_thread->task_queue = aligned_malloc(sizeof(omp_queue_t) * team_size, CACHE_LINE_SIZE); community->num_queues = 1; community->task_queue = aligned_malloc(sizeof(omp_queue_t), CACHE_LINE_SIZE); Is_True(per_thread->task_queue != NULL, ("__ompc_create_task_pool: couldn't malloc per-thread task queues")); Is_True(community->task_queue != NULL, ("__ompc_create_task_pool: couldn't malloc community task queue")); for (i = 0; i < team_size; i++) __ompc_queue_init(&per_thread->task_queue[i], __omp_task_queue_num_slots); /* what's a good size for the community queue, as a function of the local queue * sizes and the team size? Just going to make it 2 * local queue size for * now. */ __ompc_queue_init(community->task_queue, __omp_task_queue_num_slots*2); return new_pool; }