程序代码的并行性的分析方法和系统的制作方法

文档序号:6609629阅读:179来源:国知局
专利名称:程序代码的并行性的分析方法和系统的制作方法
技术领域
本发明涉及数据处理领域,具体地,涉及用于多核体系结构的基于模 拟的程序代码的并行性的分析方法和系统以及用于跟踪程序代码的执行过程的模拟器。
技术背景随着对于计算机的应用需求的不断提高,单个处理器的能力(主频、 线宽等)也随之不断地增长。但是,可以预见,这样的单个处理器的能力 提升终究会达到物理极限。从而,在单个处理器的能力增长到一定程度时, 为了继续获得更高的微处理器性能,自然不得不向更宽的方向iU艮。推动 微处理器性能不断提高的因素主要是半导体工艺技术的飞速进步和处理器 体系结构的不断U。目前的半导体工艺技术已可使微处理器集成的晶体管数目达到数亿个,能够确保微处理器的结构向更加复杂的方向;OL从 而,在这样的技术发展和应用需求之下,多核(多处理器)体系结构便成 为了必然产物。多核体系结构通过在一个芯片上集成多个孩t处理器核心来提高禾呈序执 行的并行性。每个微处理器核心实质上都是一个相对简单的单线程微处理 器或者比较简单的多线程微处理器。在多核体系结构中,多个微处理器核 心可以并行地执行任务,因而具有较高的线程级并行性。并且,多核体系 结构通过采用相对简单的微处理器作为处理器核心,能够得到高主频、设 计和验证周期短、控制逻辑简单、扩展性好、易于实现、功耗低、通信延 迟低等优点。从而,在今后的发M势上,无论是移动与嵌入式应用、桌 面应用还是服务器应用,都将采用多核体系结构。7但是,在多核体系结构带来了如此多的好处的同时,它也对系统和程 序设计等方面提出了挑战,也就是说,由于多核体系结构在单个处理器内 封装了多个处理器"执行核",所以只要软件设计合理,就能够支持软件 的多个线程的完全并行执行。从而,这样的多核体系结构的设计概念迫使 软件开发朝并行化方向发展,以便充分发挥多核体系结构的优势。但是,在x86架构下,应用程序的开发者还停留在单线程的开发模式 下,随着多核体系结构逐渐应用在PC、 Server、嵌入式系统和游戏控制台 等中,x86架构下的传统的顺序程序设计概念终将被并发和同步所打破。 尤其对于异构存储器限制系统那样的CELL多核体系结构(每个处理器核 具有有限的256K字节本M储器)的程序设计者来说,更要适应从顺序 到并行的程序设计概念的转变。也就是说,程序设计者必须学会如何为 CELL这样的多核体系结构设计应用程序,即学会如何进行并行程序设计。 但是,在并行程序设计中,程序代码中的各函数的并行性识别及并行任务 的划分通常被认为是一种极其依赖于程序设计者的领域知识、经验和对于 体系结构的了解的技术,没有足够的工具支持,并行性分析及任务划分会 极大地降低整个并行软件开发的效率。因此,需要设计出一种高效、准确的程序代码的并行性的分析4支术, 来帮助并行程序设计者更有效地针对多核体系结构进行程序代码的并行性 的分析以及任务的划分,从而提高并行软件开发的效率。发明内容本发明正是鉴于上述现有技术中的问题而提出的,其目的在于提供一 种基于模拟的程序代码的并行性的分析方法和系统以及用于跟踪程序代码 的执行过程的模拟器,以便通过模拟程序代码的顺序执行来收集其执行信 息,并根据所收集的执行信息对该程序代码进行并行性的分析,来帮助程 序设计者更有效地针对多核体系结构进行该程序代码的并行任务的划分, 从而提高并行软件开发的效率。据本发明的一个方面,提供一种程序代码的并行性的分析方法,包括模拟程序代码的顺序执行,以跟踪该程序代码的执行过程;以及根据 对上述程序代码的执行过程的跟踪结果,对上述程序代码进行并行性的分 析。根据本发明的另一个方面,提供一种用于跟踪程序代码的执行过程的 模拟器,包括模拟的执行环境,用于模拟程序代码能够在其中顺序执行 的目标系统的执行环境;以及执行过程跟踪单元,用于跟踪上述程序代码 在上述模拟执行环境中的顺序执行过程,以获得该程序代码的执行信息。根据本发明的另一个方面,提供一种程序代码的并行性的分析系统, 包括上述的用于跟踪程序代码的执行过程的模拟器;以及并行性分析单 元,用于根据上i2^漠拟器所获得对程序代码的执行过程的跟踪结果,对该 程序代码进行并行性的分析。


相信通过以下结合附图对本发明具体实施方式
的说明,能够使人们更 好地了解本发明上述的特点、优点和目的。图1是根据本发明实施例的程序代码的并行性的分析方法的流程图; 图2是图l的方法中的执行过程跟踪步骤的详细流程图; 图3是根据本发明一个实施例的执行信息的日志的示例; 图4是图l的方法中的并行性分析步骤的详细流程图;图5(a) ~ (c)是根据本发明一个实施例的并行性分析过程的实例;图6是根据本发明实施例的程序代码的并行性的分析系统的方框图;图7是根据本发明实施例的用于跟踪程序代码的执行过程的模拟器的方框图;图8-io示出了图7的模拟器的工作过程;以及图11-13是程序代码的示例。
具体实施方式
在多核体系结构中,对于计算强度很大的应用程序来说,会存在有大量的数据处理以及复杂的数据相关性,如果不进行数据分割的话,只能由 一个低频的单核来串行处理,则执行时间会很长。从而,在多核体系结构 中,需要正确地对这样的应用程序进行并行化。应用程序的并行化实际上就是将冗长的串行算法的时间复杂度通过增 加空间复杂度的方式进行压缩,把以前一个周期一个操作去执行的算法结 构改造成一个周期可以进行多个操作的并行算法,这就是并行化^j故的主 要工作。也就是说,并行化就是要找出一个应用程序内能够并行执行的任 务,并将其分配给多个处理器核来并行执行,从而实现在一个时刻或者时 间段内有一个以上的事件发生。但这种并行化却并非是一个简单的过程。 因为,即使多核体系结构中的多个处理器核能够同时执行一个程序中的多 个任务,但这些任务之间可能会存在运行资源冲突的问题。多个处理器核同时运行期间很多资源其实是共享的,比如高速緩存、存储器、BUS等。 如果并行化不正确,例如不能够并行执行的任务被进行了并行化,则其结果可能会使该应用程序所得到的执行结果不正确;又例如,本来能够并行 执行的任务未被并行化,则其结果^tA处理器核的利用效率的降低。针对 于此,本发明的目的使义要提供一种有效的程序代码的并行性的分析技术, 以便将程序设计者从繁杂的并行性识别及任务划分中解脱出来。 下面就结合附图对本发明的各个优选实施例进行详细的说明。 图l是根据本发明实施例的程序代码的并行性的分析方法的流程图。如图1所示,首先,在步骤105,模拟程序代码的顺序执行,以跟踪该程序代码的执行过程。具体地,在该步骤中,首先,为要进行并行性分析的 已设计完成的程序代码模拟其目标系统的执行环境,然后在该模拟的执行 环境中顺序执行该程序代码,并且在顺序执行的同时跟踪其执行过程。在 该步骤中,模拟程序代码在目标执行环境中的顺序执行的目的是为了收集 其执行信息,以用于对该程序代码的并行性的分析。在本发明的一个实施例中,上述执行信息包括但不限于函数调用信息、存储器分配信息以及 存储器访问信息a对于该步骤,将在后面结合附图2和3进行详细说明。 在步骤110,对上述程序代码进行并行性的分析。具体地,在该步骤中,根据对于上述程序代码的顺序执行过程的跟踪结果,即在步骤105中 所收集的执行信息,分析该程序代码中的各函数调用之间的依赖关系。在 该步骤中,根据执行信息,将上述程序代码中没有存储器访问冲突的各函 数调用确定为没有依赖关系。对于该步骤,将在后面结合附图4和5进行 详细i兌明。本发明实施例可选择地包括用于向用户呈现对上述程序代码的并行性 的分析结果的步骤115。具体地,在该步骤中,向用户呈现的是在步骤110 中获得的上述程序代码中各函数调用之间的依赖关系,以帮助该程序代码 的设计者找出该程序代码中没有依赖关系、能够由多个处理器核并行执行 的任务。在一个实施例中,上述程序代码中的各函数调用之间的依赖关系 是以树状图的形式来表现的。关于该树状图,在后面结合附图4和5的说 明中有详细记栽,此外,在其他实施例中,上述程序代码中的各函数调用之间的依赖关系也可以以列表、文本等任何形式来呈现。下面,结合图2详细描述上面图1的方法中的执行过程跟踪步骤105。 图2是该执行过程跟踪步骤105的详细流程图。如图2所示,首先,在步骤205,为要进行并行性分析的程序代码模 拟其目标系统的执行环境。具体地,该步骤是利用模拟器来实现的。也就 是说,在该步骤中,利用模拟器在主系统(当前系统)上模拟将要实际使 用该程序代码的目标系统,以1更为该程序代码^:供目标系统的执行环境。 在本发明的一个实施例中,上述目标系统是CELL多核系统,也就是说, 上述要进行并行性分析的程序代码是为CELL系统设计的。此外,在本发 明的一个实施例中,上述的所模拟的执行环境包括模拟存储器、存储器管 理单元、流水线以及模拟寄存器等对于程序代码的执行来说最基本的系统 组件。但是,本发明并不限于此,只要能够确保程序代码的顺序执行并且 所模拟的是目标系统的环境,该执行环境可以包括任何其他的系统组件。 此外,对于上述模拟器,将在后面结合图7-10进行详细说明。接着,在步骤210,将上述程序代码加载到所模拟的目标系统的执行 环境中。具体地,在该步骤中,将上述程序代码加栽到该模拟执行环境中的模拟存储器中,并且分析该程序代码中的符号表,以获得该程序代码中 的各函数的地址。由于该符号表中记录着该程序代码中的各函数的名称、 大小和存储地址,所以可以根据各函数的名称来获得其相应的地址。在步骤215,获取上述程序代码中当前将要执行的指令并执行。具体 地,由于所模拟的执行环境中的模拟指令寄存器的值指示着当前将要执行 的指令的虚拟地址,所以在该步骤中,首先获取模拟指令寄存器中的虛拟 地址,并将其传送给存储器管理单元,以便将该虚拟地址转换为物理地址; 然后,才艮据所得到的物理地址,从模拟存储器的相应位置处获取将要执行 的指令,将其解码为二进制格式,并执行。同时,模拟指令寄存器自动指 向下一将要执行的指令。接着,下面的步骤220-255是 程序代码的执行过程、记录执行信 息的过程。在步骤220,判断上述当前指令是否为诸如call (x86)或bl (PPC) 的函数调用/返回指令。如果是,则该过程前进到步骤225;否则,转到步 骤250。在步骤225,对于在步骤220中被确定为函数调用/返回指令的当前指 令,进一步判断其所调用的函ltA否为系统API( Application Programming Interface,应用程序编程接口 ),诸如C库函数。如果是,则该过程前进 到步骤230;否则,转到步骤245。在步骤230,对于在步骤220中被确定为函数调用/返回指令的当前指 令,进一步判断其所调用的函数是否为存储器分配指令或释放指令,即是 否为指令malloc或free。如果是,则该过程前进到步骤235;否则,转到 步骤240。接着,由于在步骤230中确定当前指令所调用的函fci系统API中的 maHoc或free,所以在步驟235,将该当前指令执行时的有关存储器分配/ 释放信息记录到存储器分配日志中。具体地,在该步骤中,将执行该当前 指令时的系统周期(时间信息)、所分配的存储器大小、存储器地址记录 到该存储器分配日志中。然后,该过程前进到步骤240,执行该指令所调用的系统API,接着,由于在步骤225中确定当前指令是函数调用/返回指令且其所调 用的函数不是系统API,所以在步骤245,将该当前指令执行时的有关函 数调用信息记录到函数调用日志中。具体地,在该步骤中,将执行该当前 指令时的系统周期、该指令所调用的函数的标识记录到该函数调用日志中。 为了便于用户识别,优选地,该函数的标识采用该函数的名称。但是,由 于在指令的执行过程中其所调用的函数是以地址来指示的,所以在记录曰 志之前,首先要根据上面提到的该程序代码中的符号表,将所调用的函数 的地址转换为相应的函数名称,然后再将该函数名称记录到日志中。接着,在步骤250,对于在步骤220中被确定为非函数调用/返回指令 的当前指令,进一步判断其是否为加载/存储指令,如果是,则该过程前进 到步骤255;否则,转到步骤260,判断是否存在下一指令。接着,由于在步骤250中确定当前指令是加载/存储指令,所以在步骤 255,将该当前指令执行时的有关存储器访问信息记录到存储器访问曰志 中。具体地,在该步骤中,将执行该当前指令时的系统周期、该指令所访 问的数据地址、数据大小以及读/写类型记录到该存储器访问日志中'然后, 该过程前进到步骤260,判断是否存在下一指令。在步骤260,若存在下一指令,则返回到步骤215,继续获取并执行下 一指令。若不存在下一指令,则前进到步骤265。在步骤265,对上述步骤215-260所生成的日志进行预处理。具体地, 在该步骤中,分析上述程序代码中的各函数的存储器访问操作或存储器分 配操作的本地性或非本地性,并相应地设置上述日志中与该存储器访问操 作或存储器分配操作对应的记录中的存储器类型项。举例来说,变量i是 函数A中的局部变量,则对于函数A中针对变量i的存储器访问操作,在 日志中将与该存储器访问操作对应的记录中的存储器类型项设置为本地, 以表明该存储器访问操作不依赖于其他函数中的存储器操作,可以本地进行。下面,对于图11-13中所示出的情况进行说明。在图11中,从表面来看,函数a ()和b ()在栈(i和j)和堆(p 和q)上可能会存在存储器操作的重叠部分,但实际上,根据这两个函数 的主要代码部分可以分析出,其并没有沖突的存储器操作部分,是可以分 配给不同的处理器核并在各处理器核的本地存储器的基础上执行的。所以, 在这样的情况下,将日志中与这两个函数中的栈(i、 j)和堆(p、 q)操 作相应的记录中的存储器类型设置为本地,以表明该堆、栈操作与其他函 数中针对相同变量的堆、栈操作并不存在依赖关系,没有冲突,可以本地 进行。再者,在图12和13中,分别地,可以看出,函数a ()和b ()均使 用相同的锁i来保护其关鍵部分,但从这两个函数的主要代码部分可以看 出,其并没有对相同的存储器变量进行操作,从而不存在冲突的存储器操 作。所以,在这样的情况下,将日志中与这两个函数的锁操作相应的记录 中的存储器类型设置为本地,以表明该锁操作并不与其他函数中针对相同 变量的锁操作相冲突,可以本地进行,下面,举一个具体例子来说明利用图2的过程所得到的跟踪结果。图 3 (a)示出了两段简单的程序代码,其中的main ()是主函数,Add () 是被主函数所调用的子函数。图3(b)示出了记录有图3(a)中的这两段 程序代码的执行信息的日志。可以看出,该日志按时戳(执行周期)的顺 序依次记录了这两段程序代码在执行过程中的所有存储器访问信息、存储 器分配信息、函数调用信息等。并且,该日志中的各个字段的具体含义已 在图3 (b)中示出,以上,就是对图2的执行过程跟踪步骤的详细描述。需要说明的是, 在图2所示的过程中,虽然将步骤220-250的记录执行信息的过程安排在 步骤215的指令执行之后,但这只是为了便于说明而以这样的顺序来进行 描述的,其并非是限定性的。在具体实现中,也可以在步骤215的指令执 行的同时执行步骤220-250。此外,还需要说明的是,在上面图2所示的过程中,虽然是根据指令 的类型将程序代码的执行信息分类记录到不同的日志中的,但是,在实际实现中,也可以不分别设置函数调用日志、存储器分配日志以及存储器访 问日志等这多种日志,而是仅利用一个日志来记录该程序代码的所有执行 信息,并在进行并行性的分析时在该日志的基础上得到上述几类日志。并 且,在具体实现中,无论是利用一个日志还是利用多个日志来记录执行信 息,所记录的信息种类并不仅限于上述的函数名称、存储器地址、存储器 类型等,而是,除了上述的信息类型之外,还可以记录其他更加详细的、 与程序代码的执行有关的信息。下面,结合图4详细描述上面图1的方法中的并行性分析步骤110。 图4是该并行性分析步骤110的详细流程图。如图4所示,首先,在步骤405,为当前进行并行性分析的程序代码 生成调用树。具体地,在该步骤中,以该程序代码中的主函数作为根节点, 以该程序代码在顺序执行过程中的各函数调用作为根节点之下的各节点, 并以各函数调用之间的进一步调用关系作为相应的节点之间的父子关系, 来生成该程序代码的调用树。如上面结合图2所说明的,与该程序代码的 每一次非系统API的函数调用有关的信息都被记录在了函数调用日志中, 所以在该步骤中,可以根据上面图2的过程所生成的日志来识别出该程序 代码在执行过程中的各函数调用。该步骤所生成的调用树中的每一个节点 都代表该程序代码在执行过程中的一次函数调用,并且每一个节点都包括 下列各项函数标识funcjd,其是该节点所对应的函数调用中被调用函数的标 识。在本发明的一个是实施例中,该标识是^皮调用函数的名称。调用函数列表calleejist,其是到达该节点所对应的函数调用时的各级 调用函数的列表,也就是说,该列M示的是到达该函数调用时的堆栈状 态。在本发明的一个实施例中,该列表是由各级调用函数的名称組成的。 举例来说,如果主函数main ()调用函数tree (),而函数tree ()在执 行期间又调用了函数node (),则对于函数node ()的调用来说,其所 对应的节点的调用函数列表calljist为(main, tree),调用号call number,其用于区别具有相同的函数标识和调用函数列表的不同的函数调用,也就是说,其用于区别同一函数的不同次调用。该 调用号可以用数字来表示,也可以用其他标识来表示。以上各项均需通过分析图2的过程所生成的函数调用日志来获得。接着,在步骤410,根据上面图2的过程所记录的执行信息日志,为 上述调用树中的各节点获得其所对应的函数调用的读访问记录集合和写访 问记录集合。也就是说,上述调用树中的各节点还包括下列各项读访问记录集合read—set,其是在该节点所对应的函数调用期间对存 储器进行的读访问的记录的集合。写访问记录集合write—set,其是在该节点所对应的函数调用期间对存 储器进行的写访问的记录的集合。由于该程序代码的与每一次非系统API的函数调用及存储器访问有关 的信息都一皮记录在了日志中,所以在该步骤中,根据该日志来识别出该程 序代码在执行过程中的各非系统API的函数调用,并分别统计出该各函数 调用期间的存储器读访问记录和写访问记录,以分别作为该函数调用所对 应的节点的读访问记录集合和写访问记录集合。在步骤415,对上述调用树进行优化。具体地,在该步骤中,假设节 点A和B是该调用树中同一父节点下的两个叶子节点,如果1) A的读访问记录集合read_set中的记录i^与B的写访问记录集合 write_set中的记录涉及相同的非本地存储器地址p;或2 )A的写访问记录集合write一set中的记录及^与B的读访问记录集合 read_set中的记录及5涉及相同的非本地存储器地址P;或3)A的写访问记录集合writ^set中的记录&与B的写访问记录集合 write_set中的记录I "涉及相同的非本地存储器地址p; 则将节点A和B合并为一个新的节点,以表示A、 B的相互依赖性。其中, 对于相同的非本地存储器地址的判断,是根据各读、写访问记录中的存储 器地址信息和存储器类型信息来进行的。也就是说,在本步骤中,对于上述程序代码中同一函数下的各函数调 用,根据其读、写访问记录集合中各记录的存储器地址和存储器类型,判断其中一个函数调用的写访问记录集合与另一个函数调用的读或写访问记 录集合是否存在关于同一个非本地存储器地址的记录,若存在,则确定这些函数调用之间具有依赖关系、不可并行执行;否则,确定这些函数调用 间不具有依赖关系、可并行执行。并且,重复步骤415,直到该调用树中不再存在能够进一步合并的上 述那样的兄弟节点为止。下面,举一个具体例子来说明图4的过程。图5(a)示出了两段简单 的程序代码,其中的main ()是主函数,Add ()是被主函数所调用的子 函数。图5 (b)示出了记录有图5(a)中的这两段程序代码的执行信息的 日志。可以看出,该日志按时戳(执行周期)的顺序依次记录了这两段程 序代码在执行过程中的所有存储器访问信息、函数调用信息等。并且,由 于这两段程序代码中不存在存储器分配/释放指令malloc和free,所以没有 记录与存储器分配/释放有关的信息。以上述图5(a)中的程序代码及图5(b)中相应的执行信息日志为例, 利用上述图4的过程,可得到图5 (c)所示的该程序代码的最终调用树的 一部分。其中,节点(add, main, 0, read_set, write一set)与节点(add, main, 1, read一set, write一set)不能够合并,从而表示函数add ()被主 函数main ()的第1次调用和第2次调用没有依赖关系、能够并行执行。从而,在上面图1的步骤115中便可向用户呈现利用该过程最终生成 的调用树,以利用调用树中各节点之间的关系来表现程序代码中的各函数 调用之间的依赖关系,使用户获得对于该程序代码的并行性的直观认识。此外,需要说明的是,上面图4的并行性分析过程所采用的树形分析 方式仅是本发明的一个实施例,其并非要对本发明进行限制。在其他实施 例中,也可以使用列表、文本等任何形式来进行程序代码的各函数调用之 间的依赖关系的分析及呈现。返回到图4,该并行性分析过程还可包括可选步骤420。在可选步驟420,对上述程序代码在其执行过程中的各次函数调用进 行代码大小和数据大小的分析。具体地,该步骤根据下列算式来实现self—code—size(A)=the own code size of fimction A code—size(call A) = self—code—size(A) + Z (self_code_size(f))A^调用的函敏— —data一size(callA) = Z(sizeof(i))A的存储器访问i也就是说,在该步骤中,对于上述程序代码在执行过程中的各次函数调用caHA,将其所对应的被调用函数A的本身代码大小与该函数调用期 间进一步调用的各函数f的代码大小之和作为该函数调用callA的代码大 小,并将该函数调用callA在生命周期中进行各次存储器访问i时所访问的 空间大小之和作为该函数调用callA的数据大小。上面的步骤420,对于当前进行并行性分析的程序代码是要应用于 CELL那样每一个处理器核都具有本地存储器限制(256KB)的多核体系 结构的情况而言,是必须的。因为,在这样的系统中,每一个处理器核所 能够承受的任务的大小(代码及数据大小)是受其本地存储器的限制的, 所以在对各个处理器核进行任务的分配时,必须首先考虑该任务的大小是 否适合于该处理器核。但是,对于处理器核并没有本地存储器大小限制的 多核体系结构而言,在对其程序代码进行并行性的分析时,则无需考虑所 分配的任务的大小是否适合于其处理器核,从而无需执行上面的步骤420。 因而,步骤420在图4中是作为可选步骤、依情况来执行的。此外,在执行步骤420的情况下,在上面图1的步骤115中还要向用 户呈现该步骤中所获得的各函数调用的代码大小和数据大小。各函数调用 的代码大小和数据大小可以随调用树中的相应节点一起呈现。以上,就是对图4的程序代码的并行性分析过程的详细描述。需要说 明的是,在上面图4所示的过程中,虽然将步骤410的读访问记录集合和 写访问记录集合获取步骤安排在步骤405的调用树生成步骤之后,但这只 是为了便于说明而以这样的顺序来进行描述的,其并非是限定性的。在具 体实现中,也可以在步骤405的调用树生成的同时执行步骤410。以上,就是对本实施例的程序代码的并行性的分析方法的描述。从以 上描述可知,本实施例首先通过模拟程序代码的顺序执行来收集对于该程18序代码的并行性分析来说所需的执行信息,然后根据所收集的执行信息来 进行各函数调用之间的依赖关系的分析,最终以直观的形式向用户呈现该 分析结果。因而,在本实施例中,由于模拟程序代码的实际执行,所以能够收集 到内核级的存储器访问信息以及由例如输入输出控制的系统调用所引入的 潜在的依赖关系,从而在此基础上进行的并行性分析更加准确,能够帮助并且,利用本实施例,能够使程序代码的并行性分析独立于目标系统的硬 件和操作系统。此外,以上虽然是针对于CELL系统的情况来描述本发明如何进行程 序代码的并行性分析的,但是,并不限于此,本发明同样可应用于诸如 Simple Scalar、 Power系统芯片等其他多核系统的程序代码的并行性分析。在同一发明构思下,图6是示出根据本发明实施例的程序代码的并行 性的分4斤系统的方才匡图。如图6所示,本实施例的程序代码的并行性的分析系统60包括模拟 器61、并行性分析单元62和呈现单元63。其中,模拟器61,用于跟踪要进行并行性分析的程序代码的执行过程, 以收集其执行信息。图7是根据本发明实施例的用于 程序代码的执行过程的模拟器的 方框图。如图7所示,本实施例的模拟器61包括模拟存储器611、存储 器管理单元612、流水线613、模拟寄存器614、执行过程跟踪单元615和 跟踪预处理单元616。其中,模拟存储器611,是从主系统(当前系统)的存储器中分配出 的、用作模拟器61所模拟的目标系统环境中的物理存储器的存储器块。存储器管理单元(MMU) 612,用于在程序代码的存储器访问期间将 虛拟地址转换为物理地址。该存储器管理单元612包含一转换后4^緩沖器 TLB,其是高速緩存,并且存储有虚拟地址与物理地址之间的映射关系。 该存储器管理单元612进行地址转换的过程是搜索该转换后备緩冲器TLB,找到匹配的虚拟地址与物理地址对,从而得到所需的物理地址。 流水线613,其包括指令取单元6131、指令解码单元6132和指令执行单元6133。指令取单元6131将多条指令从模拟存储器611中取到该流水线613上,指令解码单元6132分析每一条指令的二进制格式,而指令执行单元6133则执行每一条指令的动作。模拟寄存器614,用作模拟器61所模拟的目标系统的寄存器,用于存储中间计算结果。其中的pc寄存器记录当前要执行的指令的位置(虚拟地址)。执行过程跟踪单元615,用于跟踪程序代码在模拟器61中的顺序执行 过程,以获得该程序代码的执行信息。具体地,其判断在该模拟器61中执 行的当前指令的类型如果该指令是调用非系统api的函数调用/返回指 令,则将当前执行周期以及被调用函数的标识记入日志;如果该指令是调 用系统api中的存储器分配或释放函数的函数调用/返回指令,则将当前执 行周期以及被分配的存储器大小、存储器地址记入日志;以及如果该指令 是加栽/存储指令,将当前执行周期以及数据地址、数据大小、读/写类型和 存储器类型记入日志。跟踪预处理单元616,用于分析上迷日志中所记录的各存储器访问操作和存储器分配操作的相应存储器类型,并将该存储器类型信息记入曰志。下面,结合图8-10说明模拟器61的工作过程。如图8所示,在才莫拟器61启动后,指令取单元6131读取pc寄存器 中的值,以获得下一条指令的地址,并将该地址传送给存储器管理单元 以进行虚拟-物理地址的转换。然后,指令取单元6131根据所获得的物理 地址a^漠拟存储器611的相应位置处读取指令,同时pc寄存器的值自动 指向下一指令。如图9所示,在指令执行单元6133执行一条加载/存储指令时,首先 从该指令本身或寄存器中获取数据地址,并将该地址传送给存储器管理单 元612以进行虚拟-物理地址的转换。然后,指令执行单元6133根据所获 得的物理地址将数据加载或存储到模拟存储器611的相应位置处。与此同时,执行过程跟踪单元615记录相应的存储器访问信息。如图IO所示,在指令执行单元6133执行一条分支指令时,首先将PC 寄存器中的值更新为该分支指令的目标地址,并丢弃掉已取到流水线613 上的所有指令。然后,指令取单元6131根据PC寄存器中的新值将相应指 令取到流水线613上。与此同时,执行过程跟踪单元615记录相应的函数 调用信息。以上,就是对本实施例的用于跟踪程序代码的执行过程的模拟器的详 细描述。利用本实施例的模拟器,能够获得对于程序代码的并行性分析来 说详细、有用的执行信息。返回到图6,并行性分析单元62,用于根据模拟器61对程序代码的执 行过程的跟踪结果,获得该跟踪结果所记录的该程序代码在执行过程中的 M行动作及其相应的时间信息和存储器类型信息,来进行并行性的分析。 如图7所示,该并行性分析单元62进一步包括调用树构造单元621、访 问记录获得单元622、调用树优化单元623和代码/数据大小分析单元6M。其中,调用树构造单元621,用于根据模拟器61所获得的跟踪结果, 以上述程序代码在执行过程中的各次函数调用作为节点、以函数调用之间 的关系作为节点之间的关系,生成该程序代码的调用树。访问记录获得单元622,用于根据模拟器61所获得的跟踪结果,为上 述调用树构造单元621所生成的调用树中的各节点获得其所对应的函数调 用期间的读访问记录集合和写访问记录集合.调用树优化单元623,用于对于上述调用树中同一父节点下的各叶子 节点,根据其读访问记录集合和写访问记录集合确定其之间是否存在针对 同一非本地存储器地址的访问冲突,并且将存在存储器访问冲突的各叶子 节点进一步合并为一个节点。代码/数据大小分析单元624,用于对于上述程序代码在执行过程中的 各次函数调用,将其所对应的被调用函数的本身代码大小与该函数调用期 间进一步调用的各函数的代码大小之和作为该函数调用的代码大小,并将 其在生命周期中进行各次存储器访问时所访问的存储器空间大小之和作为该函数调用的数据大小。接着,呈现单元63,用于向用户呈现对上述程序代码的并行性的分析 结果。该分析结果可包括上述程序代码的各函数调用之间的依赖关系、代 码大小和数据大小的图形、文字等的表示。以上,就是对本实施例的程序代码的并行性的分析系统的描述。从以 上描述可知,本实施例首先利用模拟器来收集对于该程序代码的并行性分 析来说所需的执行信息,然后根据所收集的执行信息来进行各函数调用之 间的依赖关系的分析,最终以直7见的形式向用户呈现该分冲斤结果。因而,在本实施例中,由于利用模拟器模拟程序代码的实际执行,所 以能够收集到内核级的存储器访问信息以及由例如输入输出控制的系统调 用所引入的潜在的依赖关系,从而在此基础上进行的并行性分析更加准确,的划分。并且,利用本实施例,能够4吏程序代码的并行性分析独立于目标 系统的硬件和操作系统。本实施例的程序代码的并行性的分析系统及其各个组成部分可以由诸 如超大M4莫集成电路或门阵列、诸如逻辑芯片、晶体管等的半导体、或者 诸如现场可编程门阵列、可编程逻辑设备等的可编程硬件设备的硬件电路 实现,也可以用由各种类型的处理器执行相应的软件的方式实现,也可以 由上述硬件电路和软件的结合实现。并且这些各个组成部分也可以物理上 集中在一起实施,也可以物理上相互独立而操作上互相协作。以上虽然通过一些示例性的实施例对本发明的程序代码的并行性的分 析方法和系统进行了详细的描述,但是以上这些实施例并不是穷举的,本 领域技术人员可以在本发明的精神和范围内实现各种变化和修改。因此, 本发明并不限于这些实施例,本发明的范围仅以所附权利要求为准。
权利要求
1.一种程序代码的并行性的分析方法,包括模拟程序代码的顺序执行,以跟踪该程序代码的执行过程;以及根据对上述程序代码的执行过程的跟踪结果,对上述程序代码进行并行性的分析。
2. 如权利要求l所述的程序代码的并行性的分析方法,其中上述对程 序代码的执行过程的跟踪结果是记录有上述程序代码在上述顺序执行过程 中的执行动作、所述动作的相应时间信息或存储器类型信息的日志。
3. 如权利要求1或2所述的程序代码的并行性的分析方法,其中上述 模拟程序代码的顺序执行,以跟踪该程序代码的执行过程的步骤进一步包 括为上述程序代码模拟其目标系统的执行环境; 将上述程序代码加载到上述所模拟的执行环境中; 在上述执行环境中,顺序执行上述所加载的程序代码中的各指令;以及将上述程序代码在上述顺序执行过程中的执行信息记入日志.
4. 如权利要求3所述的程序代码的并行性的分析方法,其中上述将程 序代码在上述顺序执行过程中的执行信息记入日志的步骤进一步包括判断上述程序代码中的当前指令的类型如果其是调用非系统API的函数调用/返回指令,则将当前执行周期以 及被调用函数的标识记入日志;如果其是调用系统API中的存储器分配或释放函数的函数调用/返回 指令,则将当前执行周期以及被分配的存储器大小、存储器地址记入日志; 以及如果其是加载/存储指令,则将当前执行周期以及数据地址、数据大小、 读/写类型记入日志。
5.如权利要求3所述的程序代码的并行性的分析方法,其中上述日志被分类为函数调用日志、存储器分配日志以及存储器访问日志,分别用于 记录上述程序代码在顺序执行过程中的函数调用信息、存储器分配信息以 及存储器访问信息。
6. 如权利要求1或2所述的程序代码的并行性的分析方法,其中根据 对上述程序代码的执行过程的跟踪结果,对上述程序代码进行并行性的分 析的步骤进一步包括根据上述跟踪结果,分析上述程序代码在上述执行过程中的各次函数 调用之间的依赖关系,以找出其中没有依赖关系的、可并行执行的函数调 用。
7. 如权利要求6所述的程序代码的并行性的分析方法,其中分析上述 程序代码在上述执行过程中的各次函数调用之间的依赖关系的步骤进一步 包括根据上述跟踪结果所记录的上述程序代码在上述顺序执行过程中的各 执行动作及其相应的时间信息和存储器类型信息,来进行上述依赖关系的 分析。
8. 如权利要求6所述的程序代码的并行性的分析方法,其中分析上述 程序代码在上述执行过程中的各次函数调用之间的依赖关系的步骤进一步 包括根据上述跟踪结果,为上述程序代码在上述执行过程中的各次函数调 用获得该次函数调用期间的读访问记录集合和写访问记录集合;对于同一函数中的各函数调用,根据该各函数调用期间的读访问记录 集合和写访问记录集合,确定其之间是否存在存储器访问冲突;以及将上述同一函数中的各函数调用中存在存储器访问沖突的各函数调用 确定为具有依赖关系、不可并行执行,而将不存在存储器访问冲突的各函 数调用确定为不具有依赖关系、可并行执行。
9. 如权利要求6所述的程序代码的并行性的分析方法,其中分析上述 程序代码在上述执行过程中的各次函数调用之间的依赖关系的步骤进一步 包括以上迷程序代码在上述执行过程中的各次函数调用作为节点、以函数调用之间的相互关系作为节点之间的关系,生成该程序代码的调用树; 根据上述跟踪结果,为上述各节点获得其所对应的函数调用期间的读访问记录集合和写访问记录集合;对于上述调用树中同 一父节点下的各叶子节点,根据其读访问记录集合和写访问记录集合确定其之间是否存在存储器访问冲突;以及将上述同 一父节点下的各叶子节点中存在存储器访问冲突的各叶子节点进一步合并为一个节点。
10. 如权利要求1或2所述的程序代码的并行性的分析方法,其中根 据上述跟踪结果,对上述程序代码进行并行性的分析的步骤进一步包括根据上述跟踪结果,对上述程序代码在上述执行过程中的各次函数调 用进行代码大小和数据大小的分析。
11. 如权利要求10所述的程序代码的并行性的分析方法,其中对上述 程序代码在上述执行过程中的各次函数调用进行代码大小和数据大小的分 析的步骤进一步包括对于上述程序代码在上述执行过程中的各次函数调用,将其所对应的被调用函数的本身代码大小与该函数调用期间进一 步调用的各函数的代码大小之和作为该函数调用的代码大小;以及将其在生命周期中进行各次存储器访问时所访问的存储器空间大小之和作为该函数调用的数据大小。
12. —种用于跟踪程序代码的执行过程的模拟器,包括 模拟的执行环境,用于模拟程序代码能够在其中顺序执行的目标系统的执行环境;以及执行过程跟踪单元,用于跟踪上述程序代码在上述模拟执行环境中的顺序执行过程,以获得该程序代码的执行信息。
13. 权利要求12所述的程序代码的并行性的分析系统,还包括 跟踪预处理单元,用于获得与上述程序代码在上述顺序执行过程中的各执行动作相应的存储器类型信息,并将其记入日志。
14. 权利要求12所述的用于跟踪程序代码的执行过程的模拟器,其中 上述^=莫拟的执行环境进一步包括模拟存储器,用作所模拟的上述目标系统的存储器; 存储器管理单元,用于在程序代码的存储器访问期间将虚拟地址转换 为物理地址;流水线,其包括指令取单元、指令解码单元和指令执行单元,分别用 于实现从上述模拟存储器的指令的获取、指令的格式转换以及指令的执行; 以及模拟寄存器,用作所模拟的上述目标系统的寄存器。
15. 权利要求12所述的用于 程序代码的执行过程的模拟器,其中 上述执行过程跟踪单元判断在上i^漠拟的执行环境中执行的当前指令的类 型如果该指令是调用非系统API的函数调用/返回指令,则将当前执行周 期以及被调用函数的标识记入曰志;如果该指令是调用系统API中的存储器分配或释放函数的函数调用/ 返回指令,则将当前执行周期以及被分配的存储器大小、存储器地址记入 曰志;以及如果该指令是加栽/存储指令,将当前执行周期以及数据地址、数据大 小、读/写类型记入日志。
16. —种程序代码的并行性的分析系统,包括权利要求12-15中任意一项所述的用于,程序代码的执行过程的模 拟器;以及并行性分析单元,用于根据上迷模拟器对程序代码的执行过程的跟踪 结果,对该程序代码进行并行性的分析。
17. 权利要求16所述的程序代码的并行性的分析系统,其中上述并行 性分析单元根据上述模拟器获得的跟踪结果中记录的上述程序代码的^ 行动作及其相应的时间信息和存储器类型信息,来进行并行性的分析。
18. 权利要求16所述的程序代码的并行性的分析系统,其中上述并行性分析单元进一步包括访问记录获得单元,用于根据上g拟器所获得的跟踪结果,为上述 程序代码在执行过程中的各次函数调用获得读访问记录集合和写访问记录 集合;以及依赖性确定单元,用于对于同一函数中的各函数调用,根据该各函数 调用的读访问记录集合和写访问记录集合,确定其之间是否存在依赖关系。
19. 权利要求18所述的程序代码的并行性的分析系统,其中上述依赖 性确定单元进一步包括调用树构造单元,用于根据上i^拟器所获得的跟踪结果,以上述程序代码在执行过程中的各次函数调用作为节点、以函数调用之间的关系作为节点之间的关系,生成该程序代码的调用树;以及调用树优化单元,用于对于上述调用树中同一父节点下的各叶子节点, 根据其所对应的函数调用期间的读访问记录集合和写访问记录集合确定其之间是否存在存储器访问沖突,并且将存在存储器访问冲突的各叶子节点 进一步合并为一个节点。
20. 权利要求16所述的程序代码的并行性的分析系统,还包括 代码/数据大小分析单元,用于对于上述程序代码在执行过程中的各次函数调用,将其所对应的被调用函数的本身代码大小与该函数调用期间进 一步调用的各函数的代码大小之和作为该函数调用的代码大小,并将其在 生命周期中进行各次存储器访问时所访问的存储器空间大小之和作为该函 数调用的数据大小。
全文摘要
本发明提供一种程序代码的并行性的分析方法和系统以及用于跟踪程序代码的执行信息的模拟器。该程序代码的并行性的分析方法包括模拟程序代码的顺序执行,以跟踪该程序代码的执行过程;以及根据对上述程序代码的执行过程的跟踪结果,对上述程序代码进行并行性的分析。本发明通过模拟程序代码的顺序执行来收集其执行信息,并根据所收集的执行信息对该程序代码进行并行性的分析,以帮助程序设计者更有效地针对多核体系结构进行程序代码的并行任务的划分,从而提高并行软件开发的效率。
文档编号G06F9/45GK101329638SQ200710109089
公开日2008年12月24日 申请日期2007年6月18日 优先权日2007年6月18日
发明者博 冯, 鲲 王, 王华勇, 蓉 阎 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1