多核协会发布了最新的多核管理api。他们发布的第一个这样的API是MCAPI,它允许数据在一个潜在复杂的异构嵌入式多核环境中进行通信。下一个是MRAPI,它处理资源的管理,允许操作系统在单个进程中提供的范围之外的虚拟扩展。
这次是MTAPI,用于管理任务。现在,你可能会问,“既然有了pthread、OpenMP和MPI,为什么我们还需要另一种任务管理功能?”原因如下:
- Pthreads和OpenMP只在给定的进程中工作,并且/或假定一定程度的同质性。异构AMP系统不能使用它们。换句话说,您不能在完全不同的操作系统实例(或根本没有操作系统)管理的不同isa内核上调用任务。
- MPI对于需要管理数千个或更多任务的嵌入式应用程序来说太重量级了。
虽然您可能认为通过一个安静的小运行时扩展诸如pthread之类的东西来跨进程边界对程序员来说可能很简单,但实际上,MTAPI引入了一些抽象的概念,我不得不努力理解这些概念。这里没有关于这些关系的全面的高级描述和例子,所以我是通过阅读标准的各个部分来拼凑起来的,然后决定我认为我知道发生了什么。(危险!)
下面是我的看法。我们习惯于简单地调用任务(通常是线程)。但是在复杂的系统中,可能有许多不同的“候选”来实现该任务。
- 您可能有多个核心,每个核心都有一个可以实现任务的功能。
- 这些核心可能是相同的,也可能不是相同的——一个可能是CPU,另一个可能是DSP。
- 您可能有专用的硬件来实现该功能。
- 您可以混合使用核心和专用硬件加速器,可以为给定的执行选择其中任何一种。
所以他们加入了一个额外的抽象层,产生了三个不同的概念:
- 一个行动是执行任务的“潜力”。假设您需要完成CRC生成,您有一个CRC加速器和四个不同的核心,每个核心都有一个“GenerateCRC”功能。加速器和GenerateCRC函数都是行动.软件版本注册到本地MTAPI运行时;硬件版本内置在系统中。它们中的每一个都有可能使用特定的数据集执行特定的运行。
- 一个工作是对需要完成的给定事情的所有不同可用操作的抽象。因此,您可能有一个“CRC_job”表示生成CRC的五种不同方式。这支持使用队列或负载平衡。当你真正需要得到一个CRC时,你不需要调用一个特定的动作函数/硬件;您调用作业,系统将决定选择哪个操作来运行特定的实例。
- 一个任务是需要做某事的具体实例或执行。(如果不使用“任务”和“工作”这样的词,很难随意地描述这些东西,这些词在这种情况下有特定的含义……这就是为什么你的头会晕头转向。)任务是你在实际运行时所做的特定调用;它引用一个作业,并通过作业将其分配给与作业绑定的一个操作以供执行(例如,一个核心上的软件实现)。它可以在运行时取消;它也可以作为阻塞运行(非阻塞假定为典型用法)。它也可以被“分离”,这意味着它“自由浮动”,不再被调用代码访问,在这种情况下,它不能被取消或配置为阻塞——它让我觉得类似于终端线程。任务也可以分组,整个组充当阻塞机制。
MTAPI的其他方面让我觉得更容易理解。它涵盖了如何处理这些细节,以及是否共享内存、参数和结果传递、状态检查等方面。