处理指令的制作方法

文档序号:6418320阅读:101来源:国知局
专利名称:处理指令的制作方法
技术领域
本发明一般地涉及指令的处理,更具体地说,涉及一种对源程序中的变量进行拷贝,从而在不同线程访问该变量时避免重复访问共享存储器的计算机程序和方法。
背景技术
处理器技术方面的最新发展趋势是在单个模片(die)上包括多个处理引擎。举个例子,某些网络处理器特征在于有多个可同时执行不同的分组处理线程的分组引擎。例如,当一个引擎执行一个线程以确定如何将一个分组进一步转发到其目的地时,另一个不同的引擎则执行一个线程以确定如何转发另一个分组。
为了对这些引擎编程,程序员经常使用被称为编译器的工具。编译器可以将源代码翻译成低级汇编代码,甚至翻译成“1”和“0”组成的引擎可执行指令。例如,程序员可以使用编译器将高级“C”源代码next_hop=route_lookup(packet.destination_address);翻译成一系列引擎可以执行的低级指令。编译器也可以例如通过用其它源代码指令取代上述源代码指令而对源代码进行“预处理”,从而改进程序员所写的代码。
为了利用多引擎体系结构的潜能而编写的软件可以提供优越的性能。然而,要想在复杂的并行计算环境中有效率地使用资源,这个责任通常就落到了程序员的头上。

发明内容
多引擎处理器例如网络处理器可以提供由不同的引擎共享的存储器。当不同的线程访问共享存储器中的变量时,可能由于重复访问造成多次延迟时间损失,从而减慢线程的执行。
为了解决以上问题,本发明提供了一种计算机程序,其放置在计算机可读介质上,所述程序包括的程序指令使得处理器访问一组源指令;识别所述源指令中的至少一个变量,所述变量将由不同的线程访问;在由所述源指令组所指定的执行流中确定一个位置,其中,所述至少一个变量值在所确定的流位置后具有不变的值;以及为所述源指令生成至少一组目标指令,其中所述目标指令组中至少有一组包括用于以下操作的指令基于所述所确定的位置,在所述目标指令的执行流中的某一位置处,将所述变量的值从第一存储器拷贝到第二存储器;和对于指定了对所述至少一个变量进行访问的至少一个源指令,访问所述第二存储器中的所述值的拷贝。
根据本发明的其它方面,还提供了相应的指令处理方法和编译器。根据本发明,可以提高并行处理系统的整体效率。


图1图示了编译器的操作。
图2图示了编译器生成的不同指令组。
图3图示了从共享存储器拷贝变量的指令。
图4是用于识别从共享资源拷贝来的变量的过程的流程图。
图5是网络处理器的示意图。
具体实施例方式
用来存储数据的存储器经常对程序运行的快慢有很大的影响。例如,多引擎处理器例如网络处理器可以提供由不同的引擎共享的存储器。这个共享存储器可用来存储由在所述引擎上执行的多个线程访问的变量。共享存储器提供了一种很方便的线程间或引擎间的通信机制。但是,例如当不同的线程为了访问用于存储变量的存储器而相互竞争时,使用共享存储器来存储变量就可能引发延迟。
图1图示了编译器100的操作,该编译器100可以处理多个指令110以减少不同的线程所请求的对共享存储器的访问,而不改变程序的功能110。如图1所示,编译器100对源代码110进行操作以产生目标代码116。在所示的例子中,源代码110定义了变量“shared_var”,并包括以下指令(1)向所述变量写入一个值。在这个例子中,写入变量的值在编译过程中并不确定。源代码110还包括以下指令后来(2)读变量值。相同的程序110有可能将由不同的线程独立地执行。因而,在许多执行程序110的线程中,可能每一个线程都要读该变量值。
编译器100有可能只是生成以下指令,这些指令分配一部分共享存储器112来存储shared_var114,并重复地访问共享存储器。然而,由于每次对共享存储器114的访问都造成延迟时间损失,所以对共享存储器的重复访问可能减慢线程的执行。此外,由于产生的指令可被许多不同的线程执行,因此可能要多次忍受这种延迟时间损失。
如图1所示,为了让程序不再重复地访问共享存储器112,编译器100可以生成多个指令116,其在程序110的执行流中,在编译器100确定变量114的值此后将保持恒定时或在此之后,从共享存储器112(1)拷贝所述变量值。如图所示,一旦拷贝完毕,编译器100就可以将访问所述变量值的指令替换为(2)访问所述拷贝的指令。虽然所述拷贝操作产生了固定的初始处理开销,但是对程序内以及执行该程序的各线程之间对该变量的重复访问将会从总体上提高执行速度。
如图1所示,所生成的指令116将shared_var拷贝到存储器118。存储器118可以是只与某个引擎有关的存储器(例如,引擎存储器缓存),或者可以是对于执行所生成的指令116的某个线程,比存储器114具有更低延迟时间的其它某种存储器。
如图2所示,编译器100可从同样的源代码116中生成不同指令组124、126a-126n。这些指令组124、126a-126n可以由不同的引擎和/或由不同的引擎线程来处理。如图所示,编译器100所生成的指令可以不同。图3更具体地示出了一个例子。
如图3所示,编译器100所生成的第一组指令124包括指定(1)对共享存储器112中的变量114进行写操作的指令。第一组124还包括(2)用于在变量114具有不变的值后通知其它线程的指令。假设对所有线程只执行一次写操作(例如,作为线程初始化的一部分),那么剩余的指令组126a-126n就不必包括第一组124中的写操作。取而代之的是,剩余组126a-126n包括了(3)用于在等候(或轮询)通知后拷贝变量114的指令。此后,这些组126a-126n可以(4)访问所述拷贝,而不用访问共享存储器112中的实际变量。
图1-3以和源代码相同的指令示出了编译器100的输出116、124、126。即,所示出的编译器100的输出用的是和源代码相同的类似“C”的指令集。虽然当编译器100作为源代码预处理器使用时这是可能的,但是实际的输出却可能是低级指令集,例如汇编代码或以引擎的指令集表示的引擎可执行代码。
图4图示了由使用上述技术的编译器所实施的过程。如图所示,编译器识别150将由不同线程访问的、包括在源代码中的变量。当由不同线程共享时,一个变量可以被显式说明(例如,说明为“全局的”或“共享的”)或者隐式说明(例如,由说明部分的位置来说明或者由对变量的引用或变量的地址来说明)。
对于这些变量,编译器确定152所述变量是否在程序执行中的某个点后具有恒定值。可由数据流分析(例如,通过识别访问所述变量或变量别名的指令)来完成这种确定。或者,源代码可以包括用于说明出现了不变的变量值的指令(例如“read_only(shared_variable)”)或者可以预留一段代码(“init(){}”)来设置此后保持不变的变量的值。
对于这些变量,编译器可以生成154以下指令首先,将所述变量拷贝到对于执行中的线程具有较低延迟时间的存储器,接下来,将对所述变量的读访问替换为对所述拷贝的读访问。
多种多引擎系统的编译器都可以使用上述技术。例如,可由网络处理器的编译器来实施上述技术。许多网络处理器体系结构具有多个引擎,这些引擎通过对分组进行分类,确定向哪里转发这些分组,应用服务质量(QoS)等来处理上述分组。由于两个分组可能彼此具有很小的相关性(例如,它们可能是不同的网络端点之间的不同流的一部分),所以网络处理器通常不具备对频繁访问的数据进行缓存的硬件支持。因此,即使在缺少缓存硬件支持的情况下,上述技术仍可以有效地对引擎中或线程局部存储器(或至少具有较低延迟时间的存储器)中的共享变量进行缓存。
作为网络处理器的例子,图5描绘了Intel因特网交换网络处理器(IXP)。其它的网络处理器具有不同的设计特征。
所示出的网络处理器200具有核心210处理器(例如,StrongARMXScale)和一组分组引擎204,它们提供一组用于处理分组的线程。分组引擎204可以是适于分组处理的精简指令集计算(RISC)处理器。例如,分组引擎204可能不包括通用处理器通常提供的浮点指令以及用于整数乘法或除法的指令。
各个分组引擎204都可以提供多个线程。例如,分组引擎204的多线程能力可由硬件来支持,所述硬件预留了用于不同线程的不同寄存器,并且可以快速地交换(swap)线程执行上下文(例如,程序计数器和其它运行寄存器值)。在某些网络处理器中,例如示出的IXP中,引擎对每个线程都执行相同的指令组。即,相同的程序由引擎的各个线程独立地执行。
分组引擎204可以具有可由运行在引擎204上的线程进行访问的局部存储器。网络处理器还可以具有由不同的引擎204共享的不同种存储器。例如,共享的“便笺式存储器(scratchpad)”向引擎提供了高速片上存储器。处理器还可以包括对外部静态随机访问存储器(SRAM)和具有更高延迟时间的动态随机访问存储器(DRAM)的控制器。因此,编译器就能在共享便笺式存储器、SRAM或DRAM中为某一变量分配存储空间,并且将所述变量具有不变值后将其拷贝到分组引擎存储器中,以由各个线程对该变量进行访问。
如图所示,网络处理器200还具有其它组件,包括可在处理器200和其它网络组件之间传送分组的接口202。例如,处理器200可具有交换结构接口202(例如,CSIX接口)或者连接于该结构的电路,所述结构202使得处理器200能够向其它(多个)处理器发送分组。处理器200也可具有使得处理器200能够与物理层(PHY)和/或链路层设备进行通信的接口202(例如,系统分组接口层4(SPI-4)接口)。处理器200也可以包括例如与主机进行通信的接口208(例如,外围元件互连(PCI)总线接口)。
如上所述,可由编译器来实施上述技术。除了上述的编译器操作外,编译器还可以执行其它的编译器操作,例如,用于将源代码的文本字符分组为“单词符号(token)”的词法分析、用于将所述单词符号分组为语法短语的句法分析、可检查源代码错误的语义分析、更抽象地表示源代码的中间代码生成(例如,WHIRL)、以及提高所产生代码的性能的优化操作。编译器可以编译面向对象的语言或过程性语言,例如可用Backus-Naur范式(BNF)表达的语言。
其它实施例也位于所附权利要求的范围之内。
权利要求
1.一种计算机程序,其放置在计算机可读介质上,所述程序包括的程序指令使得处理器访问一组源指令;识别所述源指令中的至少一个变量,所述变量将由不同的线程访问;在由所述源指令组所指定的执行流中确定一个位置,其中,所述至少一个变量值在所确定的流位置后具有不变的值;以及为所述源指令生成至少一组目标指令,其中所述目标指令组中至少有一组包括用于以下操作的指令基于所述所确定的位置,在所述目标指令的执行流中的某一位置处,将所述变量的值从第一存储器拷贝到第二存储器;和对于指定了对所述至少一个变量进行访问的至少一个源指令,访问所述第二存储器中的所述值的拷贝。
2.如权利要求1所述的程序,其中,用于生成至少一组目标指令的程序指令包括以下程序指令生成所述目标指令组中的第一指令,以通知所述目标指令组中的第二指令来拷贝所述变量。
3.如权利要求1所述的程序,其中,所述第一存储器包括由多引擎系统中的不同引擎所共享的存储器,所述存储器不和所述不同引擎中的某个特定引擎唯一地相关;并且其中,所述第二存储器是某个引擎的局部存储器。
4.如权利要求1所述的程序,其中,对于执行所述目标指令组中的某个指令的线程,所述第一存储器比第二存储器具有更长的延迟时间。
5.如权利要求1所述的程序,其中,所述位置确定包括对所述至少一个变量值执行数据流分析。
6.如权利要求1所述的程序,其中,至少一组目标指令包括网络处理器的分组引擎的目标指令。
7.如权利要求6所述的程序,其中,所述至少一组目标指令包括多组目标指令。
8.如权利要求1所述的程序,其中,所述程序包括编译器;并且其中,所述源指令包括用比所述目标指令更高级的语言来表达的指令。
9.如权利要求1所述的程序,其中,所述至少一个变量的所述不变值不是在编译期间确定的。
10.一种方法,包括访问一组源指令;识别所述源指令中的至少一个变量,所述变量将由不同的线程访问;在由所述源指令组所指定的执行流中确定一个位置,其中,所述至少一个变量值在所确定的流位置后具有不变的值;以及为所述源指令生成至少一组目标指令,其中所述目标指令组中至少有一组包括用于以下操作的指令基于所述所确定的位置,在所述目标指令的执行流中的某一位置处,将所述变量的值从第一存储器拷贝到第二存储器;和对于指定了对所述至少一个变量进行访问的至少一个源指令,访问所述第二存储器中的所述值的拷贝。
11.如权利要求10所述的方法,其中,所述生成至少一组目标指令包括生成所述目标指令组中的第一指令,以通知所述目标指令组中的第二指令来拷贝所述变量。
12.如权利要求10所述的方法,其中,所述第一存储器包括由多引擎系统中的不同引擎所共享的存储器,所述存储器不和所述不同引擎中的某个特定引擎唯一地相关;并且其中,所述第二存储器是某个引擎的局部存储器。
13.如权利要求10所述的方法,其中,对于执行所述目标指令组中的某个指令的线程,所述第一存储器比第二存储器具有更长的延迟时间。
14.如权利要求10所述的方法,其中,所述位置确定包括对所述至少一个变量值执行数据流分析。
15.如权利要求10所述的方法,其中,所述至少一组目标指令包括网络处理器的分组引擎的目标指令。
16.如权利要求15所述的方法,其中,所述至少一组目标指令包括多组目标指令。
17.如权利要求10所述的方法,其中,所述源指令包括用比所述目标指令更高级的语言来表达的指令。
18.一种编译器,其放置在计算机可读介质上,所述编译器包括的程序指令使得处理器访问一组源指令;识别所述源指令中的至少一个变量,所述变量将由不同的线程访问;在由所述源指令组所指定的执行流中确定一个位置,其中,所述至少一个变量值在所确定的流位置后具有不变的值;以及为所述源指令生成至少一组目标指令,其中所述目标指令组中至少有一组包括用于以下操作的指令基于所述所确定的位置,在所述目标指令的执行流中的某一位置处,将所述变量的值从第一存储器拷贝到第二存储器;和对于指定了对所述至少一个变量进行访问的至少一个源指令,访问所述第二存储器中的所述值的拷贝;其中,所述第一存储器包括由多引擎系统中的不同引擎所共享的存储器,所述存储器不和所述不同引擎中的某个特定引擎唯一地相关;其中,所述第二存储器是所述多引擎系统中的某个引擎的局部存储器;并且其中,所述源指令包括用比所述目标指令更高级的语言来表达的指令。
19.如权利要求18所述的编译器,其中,所述目标指令包括用分组引擎的指令集来表达的指令。
全文摘要
一般而言,在一个方面,本发明公开了一种计算机程序,用于访问一组源指令,并且识别所述源指令内将由不同线程访问的变量。所述程序在由所述源指令组所指定的执行流内确定一个位置,在这个确定的流位置之后,所述变量值具有不变的值。所述程序为所述源指令生成至少一组目标指令。这些目标指令基于所确定的位置,将所述变量的值从第一存储器拷贝到第二存储器。对于指定了对至少一个变量进行访问的至少一个源指令,所生成的目标指令将访问第二存储器中的所述值的拷贝。
文档编号G06F9/45GK1612105SQ20041006259
公开日2005年5月4日 申请日期2004年7月5日 优先权日2003年8月15日
发明者埃里克·J·约翰逊, 詹姆斯·L·小贾森, 史蒂文·D·戈格兰 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1