Enkits:用于创建并行程序的C和C ++任务调度程序

2021-04-04 10:10:50

允许许可的C和C ++任务调度程序,用于创建并行程序。需要C ++ 11支持。

Enkits的主要目标是帮助开发人员创建处理数据和任务级并行性的程序,以利用多核CPU的全部性能,同时轻量级(仅限少量代码)和易于使用。

Enkits主要在MS Windows上的X64和X86 Intel架构开发,具有对Linux的良好测试支持,并且在Mac OS和Arm Android上的频率频率不太频繁地支持。

构建Enkits很简单,只需将Enkit / SRC中的文件添加到构建系统(_C. *如果您只需要C ++接口,则可以忽略文件,并将Enkit / SRC添加到Cromply Path。 UNIX / Linux构建将需要pthreads库。

对于CMake,在安装CMake的Windows / Mac OS X / Linux上,在Enkits目录中打开提示:

轻量级 - Enkits设计为精益,因此您可以轻松地在任何地方使用它,并了解它。

快速,然后可扩展 - Enkits首先为消费者设备设计,因此在较低数量的线程上的性能很重要,然后是可扩展性。

编织并行性 - Enkits可以从另一个任务中发出任务以及从创建任务系统的线程中发出任务,并具有一个简单的任务界面,用于数据并行和任务并行性。

可以将针对给定的线程引脚 - Enkits可以安排仅在指定的线程上运行的任务。

可以通过define enkits_task_priorities_num(默认为3)来配置最多5项任务优先级。在低优先级之前运行更高的优先任务。

可以注册外部线程要与Enkits一起使用 - 可以使用NumexternAltASKThreads配置Enkits,可以注册与EnkitS API一起使用。

新的完成操作 - 可以对任务完成执行操作。这避免了将任务添加到调度程序的昂贵动作,并且可用于安全地删除已完成的任务。请参见示例/ complediveAction.cpp和example / complediveAction_c.c

#包括" taskscheduler.h" enki :: taskscheduler g_ts; //定义任务集,如果我们只做一件事struct strationtaskset }; int main(int argc,const char * argv []){g_ts。初始化();并行曲线任务; //默认构造函数的设置大小为1 g_ts。 Addtasksettopipe(&任务); //等待任务集(如果存在运行任务,如果它们存在),因为我们刚刚添加了它,它没有范围我们' ll可能会运行它。 G_TS。助人的陪伴(&任务);返回0;}

#包括" taskscheduler.h" enki :: taskscheduler g_ts; int main(int argc,const char * argv []){g_ts。初始化(); enki :: taskset任务(1,[](enki :: tasksetpartition _,uint32_t threadnum_){//在这里做某事}); G_TS。 Addtasksettopipe(&任务); G_TS。助人的陪伴(&任务);返回0;}

//查看优先级的完整举例.cpp#contely" taskscheduler.h" enki :: taskscheduler g_ts; struct exampletask:enki :: itaskset {exampletask(){m_setsize = size_; void Executerange(enki :: tasksetpartition _,uint32_t threadnum_)覆盖{//查看优先级的完整示例.cpp}}; //此示例演示了如何运行长时间运行的任务以及使用优先级尽早完成的任务//。 int main(int argc,const char * argv []){g_ts。初始化(); Exampletask LowPriorityTask(10); LowPriorityTask。 m_priority = enki :: task_priority_low; Exampletask HighPriorityTask(1);高级别托斯购物。 m_priority = enki :: task_priority_high; G_TS。 Addtaskstettopipe(& lowprioritytask); for(int task = 0;任务< 10; ++任务){//运行高优先级任务G_TS。 AddTaskstettopipe(& HighPriorityTask); //等待任务,但仅在此线程G_TS上运行相同优先级或更高的任务。助人的陪伴(&高级别,高级别托斯购物。m_priority);等待低优先级任务,在等待G_TS时运行此线程上的任何任务。助人的陪伴(& lowprioritytask);返回0;}

#包括" taskscheduler.h" enki :: taskscheduler g_ts; //定义任务集,如果我们只做一件事struct pinnedtask:enki :: ipinnedtask {void execute()override {//做某事,可以发布与g_ts}}的任务}}}; int main(int argc,const char * argv []){g_ts。初始化(); PinnedTask任务; //默认构造函数将固定任务的线程设置为0(主线程)G_TS。 addpinnedtask(&任务); // runpinnedtasks必须在主线程上调用以运行该线程的任何固定任务。 //任务线程在任务循环中自动执行此操作。 G_TS。 runpinnedtasks(); //等待任务集(如果存在运行任务)//自从我们'刚刚添加了它,它没有范围我们' ll可能会运行它。 G_TS。助人的陪伴(&任务);返回0;}

#包括" taskscheduler.h" enki :: taskscheduler g_ts; //定义任务集,如果我们只做一件事struct taska:enki :: iTaskset {void executerange(enki :: tasksetpartition范围_,uint32_t threadnum_)override {//在这里做某事,可以用g_ts发布任务} }; struct taskb:enki :: itaskset {enki :: decindency m_dependency; void Executerange(enki :: tasksetpartition范围_,uint32_t threadnum_)覆盖{//在这里做某事,可以使用g_ts}}; int main(int argc,const char * argv []){g_ts。初始化(); //设置依赖项一次(如果需要,可以设置多个)。 Taska Taska; TaskB TaskB;任务。 setDependency(taskb。m_dependency,& taska); G_TS。 Addtasksettopipe(& taska); //添加第一个任务g_ts。助人的陪伴(& taskb); //等待最后返回0;}

#包括" taskscheduler.h" enki :: taskscheduler g_ts; struct parallelTask​​set:ITASkSet {void Executerange(enki :: tasksetpartition范围_,uint32_t threadnum_)覆盖{// do stames}}; void threadfunction(){g_ts。 RegisterExternAltaskThread(); //睡一会儿而不是做一些文件io std :: thing_thread :: sleep_for(std :: chrono :: milliseconds(num_ * 100));并行曲线任务; G_TS。 Addtasksettopipe(&任务); G_TS。助人的陪伴(&任务); G_TS。 deregisterexternaltaskthread(); in int main(int argc,const char * argv []){enki :: taskschedulerconfig config;配置。 numexternaltaskthreads = 1; //我们有一个额外的外部线程g_ts。初始化(配置); std :: threademplethread(threadfunction);考试。加入();返回0;}

#包括" taskscheduler_c.h" enkitaskscheduler * g_pts; void paraltasksetsetfunc(uint32_t start_,uint32_t end_,uint32_t threadnum_,void * pargs_){/ *在这里做某事,可以用g_pts * /} int main发出任务(int argc,const char * argv []){enkitaskset * ptask; g_pts = enkinewtaskscheduler(); enkiinittaskscheduler(g_pts); //创建任务,可以重新使用它来获取在启动ptask = enkicreateaskset上发生的分配(g_pts,paralletasksetfunc); enkiaddtasksettopipe(g_pts,ptask); //默认值为null args,setize为1 //等待任务集(如果存在运行任务,如果它们存在)//自从我们'刚刚添加了它,它没有范围我们' ll可能会运行它。 enkiwaitfortaskset(g_pts,ptask); enkideletetAskset(g_pts,ptask); enkideletetAskscheduler(g_pts);返回0;}

C ++ 98兼容分支已被推翻为i' m不知道任何需要它的人。

用户线程版本不再被维护,因为它们不再使用。

Branch上的用户线程版本userThread用于在其他任务/线程系统上运行Enkits,因此它可以用作其他引擎以及独立的独立。

Avoyd是一个抽象的6度自由voxel游戏。开发了Enkits用于我们内部发动机供电的Avoyd。

araspranckevičius'他的系列代码在每日路径跟踪器实验中进行各种语言。

此软件提供' AS-IS'没有任何表达或ImpliedWarranty。在任何情况下,作者将责备使用本软件的任何损坏。

授予任何人授予任何用于任何目的(包括商业应用程序)的软件,并改变它并重新分发的软件,而且符合以下限制:

该软件的起源不得被误导;您必须违背您写的原始软件。如果在产品中使用此软件,则产品文档中的确认将是非必需的,但不需要。

必须明显标记更改的源版本,并且不得Bemisreprsented作为原始软件。