ort_omp.c

发布时间:2016-12-9 16:00:01 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"ort_omp.c",主要涉及到ort_omp.c方面的内容,对于ort_omp.c感兴趣的同学可以参考一下。

#include "ort_prive.h" #include <stdlib.h> #include <time.h> //判断当前位置是否在并行域内,判断的依据是当前的eecb的活跃层次数是否为0 int omp_in_parallel(void) { return ( __MYCB->activelevel != 0 ); } //获取当前eecb的组内ID int omp_get_thread_num(void) { return ( __MYCB->thread_num ); } //获取当前线程组的线程数目 int omp_get_num_threads(void) { return ( __MYCB->num_siblings ); } //获取当前任务的内部控制变量nthreads int 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; }

上一篇:通向架构师的道路(第二十六天)漫谈架构与设计文档的写作技巧
下一篇:身份证JS校验

相关文章

关键词: ort_omp.c

相关评论