CN103810041A - 一种支持动态伸缩的并行计算的方法 - Google Patents

一种支持动态伸缩的并行计算的方法 Download PDF

Info

Publication number
CN103810041A
CN103810041A CN201410049723.0A CN201410049723A CN103810041A CN 103810041 A CN103810041 A CN 103810041A CN 201410049723 A CN201410049723 A CN 201410049723A CN 103810041 A CN103810041 A CN 103810041A
Authority
CN
China
Prior art keywords
task
processor
buffer pool
dynamic
parallel computation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201410049723.0A
Other languages
English (en)
Inventor
曹东刚
詹杭龙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peking University
Original Assignee
Peking University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Peking University filed Critical Peking University
Priority to CN201410049723.0A priority Critical patent/CN103810041A/zh
Publication of CN103810041A publication Critical patent/CN103810041A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种支持动态伸缩的并行计算的方法,主要包括以下内容:(1)将并行作业转化成由若干任务构成的集合,并将任务集管理与处理器组群的管理进行解耦,以支持可伸缩的计算;(2)通过任务缓冲池实现对并行作业的任务集的管理和调度。本发明可以很轻便地实现动态伸缩,使得程序员能够简单、高效地开发多种类型及特定领域的并行计算程序。

Description

一种支持动态伸缩的并行计算的方法
技术领域
本发明涉及计算机网络技术领域,具体涉及一种在开放、易变的动态网络环境下支持动态伸缩的并行计算方法。
背景技术
并行计算是指同时使用多种计算资源来解决问题的模式,它是提高计算机系统的运算速度和处理能力的一种高效手段。随着并行计算领域的发展,一系列支持并行计算的编程接口和处理系统不断出现。从POSIXThreads、MPI到OpenMP、PVM,再到现在非常流行的用于特定领域的MapReduce、Dryad、Pregel等编程框架,用户可以方便地编写和运行并行程序。
然而,互联网的快速发展对并行计算技术提出新的挑战。一方面,互联网信息量的飞速增长使得并行计算的应用场景越来越广泛,从早期的科学计算,到现在的网页搜索、海量数据分析等,其应用类型逐渐多样化。另一方面,并行计算的载体由封闭的、面向专门应用的系统逐渐转变成开放的,由众多计算资源通过网络构成的运算平台。这种运算平台的特点在于参与计算的资源规模可能在运行时发生改变,可能有计算资源在运行中宕机或离线,或者有新资源随时加入。这就要求平台上的并行计算具有伸缩性,以更好地利用计算资源,并在计算过程中保证作业成功运行或实现加速。然而,上述提到的编程接口或框架均无法满足这种需求。此外,诸如MapReduce、Drayd、Pregel等编程框架均面向领域特定的并行程序,不具有通用性。
发明内容
本发明的目的是提供一种在开放、易变的动态网络环境下支持动态伸缩的并行计算方法,使得程序员能够简单、高效地开发多种类型及特定领域的并行计算程序。
本发明主要包括以下内容:(1)将并行作业转化成由若干任务构成的集合,并将任务集管理与处理器组群的管理进行解耦,以支持可伸缩的计算;(2)通过任务缓冲池实现对并行作业的任务集的管理和调度。
为了实现上述目的,本发明采用以下技术方案:
一种支持动态伸缩的并行计算的方法,首先提出将任务集的管理与处理器进行解耦。任务集的管理只负责维护作业的逻辑流,决定在某一时刻哪些任务可以被调度执行、哪些任务因尚未满足执行条件而待命。在对任务集进行管理时,不需要考虑处理器的情况。
具体包括以下步骤:
1)将并行作业分解成若干任务构成的任务集;
2)利用任务缓冲池维护上述任务集,并创建动态任务表,用于跟踪记录已被调度到处理器集群中的处理器上执行的任务;
3)处理器集群中的处理器只要空闲,便向任务缓冲池请求任务,获得任务缓冲池调度的待执行的任务进行处理,而后将执行结果提交到任务缓冲池;
4)当任务缓冲池接收到处理器提交的任务的执行结果时,更新任务集及动态任务表;
5)当任务集和动态任务表中没有待执行的任务时,任务缓冲池结束对任务的调度,并行作业完成。
进一步地,步骤2)中,所述任务缓冲池中任务的状态包括:尚未调度状态、已被调度尚未提交状态和执行结果已提交状态。
进一步地,步骤2)中,所述任务集中的任务在第一次被调度后,该任务从任务集中移除,添加到动态任务表中。
进一步地,步骤3)中,所述处理器集群中的处理器相互独立,新加入的处理器可以直接向任务缓冲池请求任务。
进一步地,步骤3)中,所述处理器集群中的每个处理器均包含两种状态,空闲及忙碌,并在两种状态间循环转换。若处理器空闲,则向任务缓冲池请求任务并执行,转换成忙碌状态。等任务执行完提交后,处理器恢复成空闲状态。
进一步地,步骤3)中,所述处理器向任务缓冲池请求任务时,任务缓冲池可能返回三种结果,处理器根据任务缓冲池返回的不同结果进行相应操作。若结果为一个待执行的任务,则处理该任务;若结果为stop标记,说明任务缓冲池已确认该并行作业的完成,处理器可以停止运行;若结果为standby标记,说明任务缓冲池目前暂时无法提供任务,但该并行作业尚未完成(可能会有新的待执行任务添加到任务缓冲池中),此时处理器应稍后再请求任务。
进一步地,步骤3)中,如果处理器在执行任务的过程中生成新的子任务,则需要在提交执行结果的同时将新的子任务添加到任务缓冲池中。
进一步地,步骤4)中,如果处理器所提交的任务记录在任务动态表中,任务缓冲池会将该任务项删除;如果该任务未记录在任务动态表中,表示之前已经有其它处理器成功提交过该任务,则忽略此次提交。
进一步地,步骤4)中,当有处理器离线或异常结束时,其所执行的任务处于已被调度尚未提交状态,所以其它在线的处理器在向任务缓冲池请求任务时,仍然可以获得该任务执行,当且仅当某一个处理器提交该任务的执行结果时,任务集将该任务设为完成状态,任务缓冲池将该任务从动态任务表中彻底删除。
本发明可以很轻便地实现动态伸缩,程序员在使用本方法时只需考虑如何将作业划分成一系列任务,如何定义每个任务的数据结构,如何确定每个任务的依赖和触发时间,但不必关心处理器的管理问题。由于任务集不绑定在处理器组群上,因而处理器不需要掌握作业的业务逻辑。这就使得处理器之间相互独立,处理器伸缩性的实现较为容易。
附图说明
图1本发明支持动态伸缩的并行计算的方法流程图。
图2本发明并行计算方法对应的编程接口。
具体实施方式
本发明的具体技术方案如下:
(1)一般对于并行作业的处理是基于分而治之的思想,将作业分解成若干任务(task)构成的集合,任务是其最小的并发单位。一个作业的不同任务间可能存在数据依赖或时序依赖等关系。对并行作业的处理过程就是依次将它的所有任务调度到多个处理器上执行,待任务完成后进行汇总或创建新任务继续执行。因而,运算平台需要负责对任务集和处理器进行管理。
为了支持动态伸缩性,本发明提出将任务集的管理与处理器进行解耦。任务集的管理只负责维护作业的逻辑流,决定在某一时刻哪些任务可以被调度执行、哪些任务因尚未满足执行条件而待命。一个任务在三种状态间依次转换:静态(尚未调度)、运行(已被调度尚未提交)和完成(执行结果被提交)。在对任务集进行管理时,不需要考虑处理器的情况。
本方法要求处理器具有如下的重复行为逻辑:当处理器空闲时,以主动的方式向任务集请求获取新任务;若当前任务集没有更多任务,该处理器终止或进入短暂的休眠状态;若获得新任务,该处理器计算该任务,将其结果提交给任务集;而后进入下一轮的处理行为。
由于任务集不绑定在处理器组群上,因而处理器不需要掌握作业的业务逻辑。这就使得处理器之间相互独立,处理器伸缩性的实现较为容易。当有新的处理器加入运算平台时,新处理器可以直接向任务集请求新任务,实现运算的加速;当有处理器离线或异常结束时,其所执行的任务处于尚未提交状态,所以其它在线的处理器在向任务集请求任务时,仍然可以获得该任务执行,当且仅当某一个处理器提交该任务的结果时,任务集将该任务设为完成状态,从而保证了处理器异常情况下作业的正确执行。
通过上述设计,本发明可以很轻便地实现动态伸缩,程序员在使用本方法时只需考虑如何将作业划分成一系列任务,如何定义每个任务的数据结构,如何确定每个任务的依赖和触发时间,但不必关心处理器的管理问题。本发明根据程序员的作业描述来维护任务集,并支持多种类型的并行作业。图1展示了本发明的总体结构图。
(2)通过任务缓冲池实现对并行作业的任务集的管理和调度。
本发明使用任务缓冲池实现对任务集的维护。为了支持多种类型的作业逻辑,本方法只负责实现对任务缓冲池的通用操作,而对具体任务集的处理则通过调用程序员定义的回调函数来完成。程序员通过该回调函数描述任务的数据结构、任务集的表现形式、以及如何从任务集中选择合适的任务被调度。
根据具体的作业逻辑,任务集的表现形式可以是队列、堆栈、二叉树、搜索树等。例如作业逻辑是基于SIMD模型的暴力搜索密码问题,可将求解空间划分成若干子空间,将每个子空间作为一个任务放入队列中形成任务集,以先进先出的方式进行调度;又如以深度优先搜索算法遍历图,可将图中的每个节点作为一个任务放入堆栈形成任务集,以后进先出的方式进行调度;再如下棋对弈问题,可将每一步的棋盘状态作为一个任务放入搜索树中形成任务集,再以合适的价值函数进行下一步的任务选择。
任务缓冲池中除了记录任务集之外,还需要维护处于运行状态的任务的信息,称为动态任务表。当某个任务第一次被调度时,任务缓冲池将其从任务集中移除,添加到动态任务表中。当且仅当有处理器提交该任务结果时,任务缓冲池才将该任务从动态任务表中彻底删除。如果某处理器在执行任务时失效,由于未提交任务,该任务仍会记录在动态任务表中,可以等待其它处理器来重新执行它。当且仅当任务集和动态任务表均变为空时,任务缓冲池中的所有任务完成。
任务缓冲池提供三个通用操作供其使用者调用,在本方法中的使用者即为各处理器。
一是请求任务fetch_task。当处理器就绪时,调用fetch_task请求获取一个新任务。若任务缓冲池中存在一个可以处理的任务,则此操作返回该任务;若任务缓冲池判定该作业已结束,则此操作返回stop标记,告诉处理器可以停止运行;若任务缓冲池虽然目前无任务可调度,但由于某些正在执行的任务可能生成新的子任务加入到缓冲池中,所以不应该让处理器于此刻停止,本操作返回standby标记,告诉处理器稍后再继续请求任务。
第二个操作是提交任务完成后的结果submit_task。当处理器完成手头的任务时,调用submit_task以提交该任务的结果。如果在执行该任务的过程中生成新的任务,则需要在提交结果的同时将新任务添加到任务缓冲池中。在每次调用提交操作时,如果所提交的任务记录在任务动态表中,任务缓冲池会将该任务项删除;如果该任务未记录在任务动态表中,所以之前已经有其它处理器成功提交过该任务,则忽略此次提交。更新任务动态表之后,任务缓冲池需要检查该作业是否已全部完成,若全部完成则结束对任务的调度。
第三个操作是动态添加新任务到任务缓冲池add_tasks。当有新的任务需要执行时,通过调用add_tasks动态加入到任务缓冲池中。由于本发明注重该方法的通用性,因而程序员需要定义新的任务如何添加到之前所定义任务集的数据结构中。如果任务集是一个队列,则可直接加入队尾;如果任务集是一个二叉树,则可能需要进行二叉树的结构调整。
(3)设计了与该方法对应的编程接口,以回调函数的方式实现该方法的工作协议。
为了让程序员能够简单高效地使用本发明并行计算的方法,本发明基于分而治之的思想设计了一套编程接口,并约定了各接口间的工作协议,如图2所示。这套编程接口只用于描述作业的业务逻辑(即任务集的管理),屏蔽了底层处理器的状态信息。程序员在编写并行应用时,只需实现这些接口,不必考虑底层细节。
如图2中的突出显示部分,程序员在使用该方法时只需要实现这些接口。该方法在执行作业时,在作业切分出任务、处理器执行任务、提交任务、合并结果等环节回调这些接口,根据接口的描述完成相应的业务逻辑,具体说明如下:
a.do_split:描述如何从任务集中切分出一个任务,在这个接口中定义了该作业的任务调度算法。当任务集中无法切分出任务时,若正在被处理器执行的任务可能生成新的任务加入到任务缓冲池中,则返回more标记,要求此后处理器发出的fetch_task请求返回standby标记;若再无新任务产生,则返回completed标记,要求此后的fetch_task请求都会返回stop标记。
b.do_work:描述处理器如何执行每一个任务。程序员可以通过设定不同的任务标记值来实现不同的处理逻辑,以便支持任务并行和复杂的任务图问题。
c.do_add:描述当处理器在执行一个任务的过程中生成新的任务时,该任务如何并入到任务集中。根据不同作业的需求,新任务可能加到队列型任务集的队尾、栈型任务集的栈顶、或树型任务集经过树调整。
d.do_submit:描述当一个任务的结果提交到任务缓冲池时,应该如何添加到结果集中,此外,用标记说明本次提交是否导致作业的提前完成(例如,搜索问题中在某一子树中找到解,可忽略剩余子树而提前结束搜索)。
e.do_merge:描述当作业即将结束时,如何对收集的结果集进行合并与调整(例如对所有结果进行排序等,合并相同键值对等)。
至此,本发明完成了在开放、易变的动态网络环境下支持动态伸缩的并行计算的方法及其相应接口的设计。
以下给出若干使用本发明构建并行应用的实施案例。
(1)计算闭区间[2,10^10]之间的所有素数。
分析:该问题可基于SIMD模型来解决,将数域[2,10^10]划分为众多子段,每段的整数个数为10^5,对子段中的每一个数,用素数检验算法进行验算,得出结果后进行合并。用伪代码描述用户程序如下:
(2)给出一个未完整的数独,包含M个空格,填满所有的空格。
分析:一种求解数独的算法为,依次对数独矩阵中的每个空格,枚举尝试填入1…9的数字,判定是否满足数独规范,若满足则继续试填下一空格,若不满足则换另一个数字或回退到前一个空格,直到所有的空格都填满,且满足数独规范则求得答案。这是典型的深度优先搜索算法,每一个空格的尝试相当于搜索树中的一层。用并行化实现该算法时,可以结合广度优先搜索,提高搜索的并行性。先扩展搜索树的第一层,生成9棵子搜索树,继续扩展到第K层(K<M),最多生成9^K棵子搜索树,把这一层的节点作为并行的任务进行深度优先搜索,若某一棵子树求得解,则作业可提前结束,而不用遍历所有的子树。用伪代码描述程序如下:
Figure BDA0000465657660000071

Claims (9)

1.一种支持动态伸缩的并行计算的方法,包括以下步骤:
1)将并行作业分解成若干任务构成的任务集;
2)利用任务缓冲池维护上述任务集,并创建动态任务表,用于跟踪记录已被调度到处理器集群中的处理器上执行的任务;
3)处理器集群中的处理器只要空闲,便向任务缓冲池请求任务,获得任务缓冲池调度的待执行的任务进行处理,而后将执行结果提交到任务缓冲池;
4)当任务缓冲池接收到处理器提交的任务的执行结果时,更新任务集及动态任务表;
5)当任务集和动态任务表中没有待执行的任务时,任务缓冲池结束对任务的调度,并行作业完成。
2.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤2)中,所述任务缓冲池中任务的状态包括:尚未调度状态、已被调度尚未提交状态和执行结果已提交状态。
3.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤2)中,所述任务集中的任务在第一次被调度后,该任务从任务集中移除,添加到动态任务表中。
4.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤3)中,所述处理器集群中的处理器相互独立,新加入的处理器可以直接向任务缓冲池请求任务。
5.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤3)中,所述处理器集群中的每个处理器均包含两种状态,空闲及忙碌,并在两种状态间循环转换;若处理器空闲,则向任务缓冲池请求任务并执行,转换成忙碌状态;等任务执行完提交后,处理器恢复成空闲状态。
6.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤3)中,所述处理器向任务缓冲池请求任务时,任务缓冲池可能返回三种结果,处理器根据任务缓冲池返回的不同结果进行相应操作:若结果为一个待执行的任务,则处理该任务;若结果为stop标记,说明任务缓冲池已确认该并行作业的完成,处理器可以停止运行;若结果为standby标记,说明任务缓冲池目前暂时无法提供任务,但该并行作业尚未完成,此时处理器应稍后再请求任务。
7.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤3)中,如果处理器在执行任务的过程中生成新的子任务,则需要在提交执行结果的同时将新的子任务添加到任务缓冲池中。
8.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤4)中,如果处理器所提交的任务记录在任务动态表中,任务缓冲池会将该任务项删除;如果该任务未记录在任务动态表中,表示之前已经有其它处理器成功提交过该任务,则忽略此次提交。
9.如权利要求1所述的支持动态伸缩的并行计算的方法,其特征在于,步骤4)中,当有处理器离线或异常结束时,其所执行的任务处于已被调度尚未提交状态,所以其它在线的处理器在向任务缓冲池请求任务时,仍然可以获得该任务执行,当且仅当某一个处理器提交该任务的执行结果时,任务集将该任务设为完成状态,任务缓冲池将该任务从动态任务表中彻底删除。
CN201410049723.0A 2014-02-13 2014-02-13 一种支持动态伸缩的并行计算的方法 Pending CN103810041A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410049723.0A CN103810041A (zh) 2014-02-13 2014-02-13 一种支持动态伸缩的并行计算的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410049723.0A CN103810041A (zh) 2014-02-13 2014-02-13 一种支持动态伸缩的并行计算的方法

Publications (1)

Publication Number Publication Date
CN103810041A true CN103810041A (zh) 2014-05-21

Family

ID=50706850

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410049723.0A Pending CN103810041A (zh) 2014-02-13 2014-02-13 一种支持动态伸缩的并行计算的方法

Country Status (1)

Country Link
CN (1) CN103810041A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104580396A (zh) * 2014-12-19 2015-04-29 华为技术有限公司 一种任务调度方法、节点及系统
CN105426249A (zh) * 2015-11-24 2016-03-23 无锡江南计算技术研究所 一种规模动态可伸缩的高可用并行作业控制方法
WO2017050177A1 (zh) * 2015-09-25 2017-03-30 阿里巴巴集团控股有限公司 一种数据同步方法和装置
CN107526632A (zh) * 2016-06-20 2017-12-29 咪咕互动娱乐有限公司 进程池扩充方法和装置
CN108241534A (zh) * 2016-12-27 2018-07-03 阿里巴巴集团控股有限公司 一种任务处理、分配、管理、计算的方法以及装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050081097A1 (en) * 2003-09-12 2005-04-14 International Business Machines Corporation System and method for execution of a job in a distributed computing architecture
CN101308467A (zh) * 2008-07-16 2008-11-19 杭州华三通信技术有限公司 一种任务处理的方法和装置
CN101685452A (zh) * 2008-09-26 2010-03-31 阿里巴巴集团控股有限公司 数据仓库调度方法及调度系统
CN102567118A (zh) * 2011-12-22 2012-07-11 深圳市赛格导航科技股份有限公司 基于gps运营系统的分布式计算系统和方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050081097A1 (en) * 2003-09-12 2005-04-14 International Business Machines Corporation System and method for execution of a job in a distributed computing architecture
CN101308467A (zh) * 2008-07-16 2008-11-19 杭州华三通信技术有限公司 一种任务处理的方法和装置
CN101685452A (zh) * 2008-09-26 2010-03-31 阿里巴巴集团控股有限公司 数据仓库调度方法及调度系统
CN102567118A (zh) * 2011-12-22 2012-07-11 深圳市赛格导航科技股份有限公司 基于gps运营系统的分布式计算系统和方法

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104580396A (zh) * 2014-12-19 2015-04-29 华为技术有限公司 一种任务调度方法、节点及系统
WO2017050177A1 (zh) * 2015-09-25 2017-03-30 阿里巴巴集团控股有限公司 一种数据同步方法和装置
CN105426249A (zh) * 2015-11-24 2016-03-23 无锡江南计算技术研究所 一种规模动态可伸缩的高可用并行作业控制方法
CN107526632A (zh) * 2016-06-20 2017-12-29 咪咕互动娱乐有限公司 进程池扩充方法和装置
CN108241534A (zh) * 2016-12-27 2018-07-03 阿里巴巴集团控股有限公司 一种任务处理、分配、管理、计算的方法以及装置

Similar Documents

Publication Publication Date Title
US9170846B2 (en) Distributed data-parallel execution engines for user-defined serial problems using branch-and-bound algorithm
CN102360309B (zh) 片上多核异构系统的调度系统与调度执行方法
Chakroun et al. Combining multi-core and GPU computing for solving combinatorial optimization problems
CN103810041A (zh) 一种支持动态伸缩的并行计算的方法
Fan et al. An effective approximation algorithm for the malleable parallel task scheduling problem
Dongarra et al. Parallel processing and applied mathematics
Wang et al. An adaptive and hierarchical task scheduling scheme for multi-core clusters
Feljan et al. Task allocation optimization for multicore embedded systems
Sun et al. An adaptive framework for large-scale state space search
Li et al. A static task scheduling framework for independent tasks accelerated using a shared graphics processing unit
Muthu et al. Optimized scheduling and resource allocation using evolutionary algorithms in cloud environment
CN108139929A (zh) 用于调度多个任务的任务调度程序和方法
Moustafa et al. 3D cartesian transport sweep for massively parallel architectures with PARSEC
Schmaus et al. System Software for Resource Arbitration on Future Many-Architectures
Messina et al. Exploiting gpus to simulate complex systems
Herrmann et al. Memory-aware list scheduling for hybrid platforms
Niknam et al. Resource optimization for real-time streaming applications using task replication
Liu et al. BSPCloud: A hybrid distributed-memory and shared-memory programming model
Xiao et al. An application-level scheduling with task bundling approach for many-task computing in heterogeneous environments
Wu et al. A model-based software solution for simultaneous multiple kernels on GPUs
Siddiqui et al. Design space exploration of embedded applications on heterogeneous cpu-gpu platforms
Bendjoudi et al. Parallel B&B algorithm for hybrid multi-core/GPU architectures
Krömer et al. An implementation of differential evolution for independent tasks scheduling on GPU
Lou et al. Dynamic scheduling strategy for testing task in cloud computing
Choudhury et al. Balancing thread-level and task-level parallelism for data-intensive workloads on clusters and clouds

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
WD01 Invention patent application deemed withdrawn after publication
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20140521