ort_omp.c
来源:互联网 发布:常见网络诈骗 编辑:程序博客网 时间:2024/05/16 01:49
#include "ort_prive.h"#include <stdlib.h>#include <time.h>//判断当前位置是否在并行域内,判断的依据是当前的eecb的活跃层次数是否为0int omp_in_parallel(void) { return ( __MYCB->activelevel != 0 ); }//获取当前eecb的组内IDint omp_get_thread_num(void) { return ( __MYCB->thread_num ); }//获取当前线程组的线程数目int omp_get_num_threads(void) { return ( __MYCB->num_siblings ); }//获取当前任务的内部控制变量nthreadsint omp_get_max_threads(void) { return ( __CURRTASK(__MYCB)->icvs.nthreads ); }//获取处理器的内核数目int omp_get_num_procs(void) { return ( ort->icvs.ncpus ); }//控制是否支持动态调整线程数目void omp_set_dynamic(int dyn){ ort_eecb_t *me = __MYCB; ort_task_icvs_t *ti = &(__CURRTASK(me)->icvs);//获取当前任务的内部控制变量 if (__INHERITASK(me)) ort_create_task_immediate_node(me); if (!dyn || ort->eecaps.supports_dynamic) ti->dynamic = dyn; check_nested_dynamic(ti->nested, ti->dynamic); /* is eelib ok? */}//判断当前任务是否支持动态调整线程数目int omp_get_dynamic(void) { return ( __CURRTASK(__MYCB)->icvs.dynamic ); }//控制是否支持并行域嵌套void omp_set_nested(int nest){ ort_eecb_t *me = __MYCB; ort_task_icvs_t *ti = &(__CURRTASK(me)->icvs); if (__INHERITASK(me)) ort_create_task_immediate_node(me); if (!nest || ort->eecaps.supports_nested) ti->nested = nest; check_nested_dynamic(ti->nested, ti->dynamic); /* is eelib ok? */}//判断是否支持并行域嵌套int omp_get_nested(void) { return ( __CURRTASK(__MYCB)->icvs.nested ); }//设置内部控制变量nthreads的值void omp_set_num_threads(int num_threads){ /* if (!omp_in_parallel() && num_threads > 0) was used <= (V.2.5) */ ort_eecb_t *me = __MYCB; if(__INHERITASK(me)) ort_create_task_immediate_node(me); __CURRTASK(me)->icvs.nthreads = num_threads;}//初始化通用锁void omp_init_lock(omp_lock_t *lock) { *lock = NULL; ort_prepare_omp_lock(lock, ORT_LOCK_NORMAL); }//通用锁上锁void omp_set_lock(omp_lock_t *lock) { ee_set_lock((ee_lock_t *) *lock); }//通用锁解锁void omp_unset_lock(omp_lock_t *lock) { ee_unset_lock((ee_lock_t *) *lock); }//尝试对通用锁上锁int omp_test_lock(omp_lock_t *lock) { return ( ee_test_lock((ee_lock_t *) *lock) ); }//初始化嵌套锁void omp_init_nest_lock(omp_nest_lock_t *lock) { *lock = NULL; ort_prepare_omp_lock(lock, ORT_LOCK_NEST); }//对嵌套锁上锁void omp_set_nest_lock(omp_nest_lock_t *lock){ ort_eecb_t *me = __MYCB; if(__INHERITASK(me)) ort_create_task_immediate_node(me); ee_set_lock((ee_lock_t *) *lock);}//对嵌套锁解锁void omp_unset_nest_lock(omp_nest_lock_t *lock) { ee_unset_lock((ee_lock_t *) *lock); }//尝试对嵌套锁上锁int omp_test_nest_lock(omp_nest_lock_t *lock){ ort_eecb_t *me = __MYCB; if(__INHERITASK(me)) ort_create_task_immediate_node(me); return ( ee_test_lock((ee_lock_t *) *lock) );}//销毁通用锁void omp_destroy_lock(omp_lock_t *lock){ ee_destroy_lock((ee_lock_t *) *lock); free(*lock);}//销毁嵌套锁void omp_destroy_nest_lock(omp_nest_lock_t *lock){ ee_destroy_lock((ee_lock_t *) *lock); free(*lock);}//获取当前时间double omp_get_wtime(void) { struct timespec ts; clock_gettime(SYS_CLOCK, &ts); return ( ((double) ts.tv_sec) + ((double) ts.tv_nsec) * 1.0E-9 );}//获取时间分辨率double omp_get_wtick(void) { struct timespec ts; clock_getres(SYS_CLOCK, &ts); return ( ((double) ts.tv_sec) + ((double) ts.tv_nsec) * 1.0E-9 );}//设置调度方式和待分配的连续子集的大小void omp_set_schedule(omp_sched_t kind, int chunk){ ort_eecb_t *me = __MYCB; ort_task_icvs_t *icvs = &( __CURRTASK(me)->icvs ); if (__INHERITASK(me)) ort_create_task_immediate_node(me); icvs->rtschedule = kind;//将当前任务的内部控制变量rtschedule设置为指定值 icvs->rtchunk = (chunk < 1) ? -1 : chunk;//设置连续子集的大小}//获取当前任务的调度方式和子集大小void omp_get_schedule(omp_sched_t *kind, int *chunk){ ort_task_icvs_t *icvs = &( __CURRTASK(__MYCB)->icvs ); *kind = icvs->rtschedule; *chunk = icvs->rtchunk;}//获取线程数目的最大值int omp_get_thread_limit(void){ return ((ort->icvs.threadlimit == -1) ? (1<<30) : ort->icvs.threadlimit);}//设置活跃层次数目的最大值void omp_set_max_active_levels(int levels){ if (levels >= 0) if (ort->eecaps.max_levels_supported == -1 || levels <= ort->eecaps.max_levels_supported) ort->icvs.levellimit = levels;}//获取活跃层次数目的最大值int omp_get_max_active_levels(void){ return ((ort->icvs.levellimit == -1) ? (1<<30) : ort->icvs.levellimit);}//获取当前的嵌套层次int omp_get_level(void){ return ( __MYCB->level );}//获取当前eecb的第level层祖先的组内编号int omp_get_ancestor_thread_num(int level){ if (level < 0) return (-1); else if (level == 0) return (0); /* master thread is parent of them all */ else { ort_eecb_t *me = __MYCB; if (me->level < level) return (-1); for (; me->level != level; me = me->parent) ; return (me->thread_num); };}//获取第level层祖先的组内线程的数目int omp_get_team_size(int level){ if (level < 0) return (-1); else if (level == 0) return (1); else { ort_eecb_t *me = __MYCB; if (me->level < level) return (-1); for (; me->level != level; me = me->parent) ; return (me->num_siblings); };}//获取当前eecb的活跃层次数目int omp_get_active_level(void){ return ( __MYCB->activelevel );}//判断当前任务是不是一个终止任务int omp_in_final(void){ return __CURRTASK(__MYCB)->isfinal;}