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;}

原创粉丝点击