CN103514025A - Opencl编译 - Google Patents
Opencl编译 Download PDFInfo
- Publication number
- CN103514025A CN103514025A CN201310335855.5A CN201310335855A CN103514025A CN 103514025 A CN103514025 A CN 103514025A CN 201310335855 A CN201310335855 A CN 201310335855A CN 103514025 A CN103514025 A CN 103514025A
- Authority
- CN
- China
- Prior art keywords
- kernel
- compiler
- hardware definition
- fpga
- gate array
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/48—Incremental compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/30—Circuit design
- G06F30/34—Circuit design for reconfigurable circuits, e.g. field programmable gate arrays [FPGA] or programmable logic devices [PLD]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- Devices For Executing Special Programs (AREA)
- Programmable Controllers (AREA)
Abstract
本发明涉及OPENCL编译。提供了用于增加集成电路(IC)的可编程逻辑的编译过程的速度并且降低其处理耗力的系统和方法。例如,在一个实施例中,一种方法包括:获取高级程序,其包括用于在集成电路(IC)的可编程逻辑上实现的计算机可读指令;将高级程序转换为表示执行高级程序的功能所需的功能组件的低级代码;基于高级程序,生成包括用于实现低级代码的计算机可读指令的主机程序;获取对高级程序的修改;确定修改是否能够由使用低级代码的新主机程序实现;以及当修改不能由使用低级代码的新主机程序实现时生成实现修改的新主机程序。
Description
技术领域
本公开总体涉及集成电路,比如现场可编程门阵列(FPGA)。更具体而言,本公开涉及集成电路(例如,FPGA)上的可编程逻辑的编译。
背景技术
本节旨在向读者介绍本技术领域的各个方面。相信这种讨论有助于向读者提供背景信息,以便有助于更好地理解本公开的各个方面。因此,应当明白,这些陈述应该在这个意义下进行解读,而不是作为对现有技术的承认。
集成电路(IC)采取各种形式。例如,现场可编程门阵列(FPGA)是意在作为相对通用器件的集成电路。FPGA可以包括逻辑,该逻辑可以在制造后进行编程(例如进行配置)以提供设计FPGA而支持的任何期望的功能。因此,FPGA包含可编程逻辑或逻辑块,其可以根据设计者的设计被配置为在FPGA上执行各种功能。此外,FPGA可以包括输入/输出(I/O)逻辑以及高速通信电路。例如,高速通信电路可以支持各种通信协议并可以包括高速收发器通道,通过该高速收发器通道,FPGA可以向FPGA外部电路发送串行数据和/或从FPGA外部电路接收串行数据。
在诸如FPGA的集成电路中,通常使用诸如VHDL或Verilog的低级/低层次(low level)编程语言配置可编程逻辑。不幸的是,这些低级编程语言可能提供低级抽象,并且因此可能对可编程逻辑设计者造成开发障碍。诸如Open CL的高级/高层次(high level)编程语言有助于使可编程逻辑设计更加容易。高级程序用于生成对应于低级编程语言的代码。不幸的是,从高级编程语言到低级编程语言的转换常利用大量时间和处理能力。实际上,这种转换的编译时间常常花费许多小时甚至几天来完成,导致设计者生产率下降。
发明内容
下面陈述了本文公开的某些实施例的概要。应当理解,呈现这些方面仅为了向读者提供这些特定实施例的简短概要,并且这些方面并不意在限制本公开的范围。实际上,本公开可以包括下面未提出的各个方面。
现有实施例涉及用于通过多个编译方法改善Open CL程序编译时间的系统、方法及装置。具体的,本实施例可以提供Open CL编译器,所述Open CL编译器提供完全初始编译及增量编译。初始编译生成包括用于IC的可编程逻辑的硬件描述的编程内核。有时,可编程逻辑设计者会实现设计改变。当发生这些设计改变时,通过增量编译,编译器可以对由编程内核所实现的指令进行改变,而无需修改硬件描述,因此使设计改变所用的时间远小于每次发生设计改变时需要生成硬件描述的编译方法。
上面提到的各种详细特征可以与本公开的各个方面有关。进一步的特征也可以加入到这些各个方面中。这些详细特征及附加特征可以单独地或以任何组合方式存在。例如,以下讨论的与一个或多个所示实施例相关的各种特征可以单独或以任何组合方式结合到本发明的任何上述方面。同样,以上呈现的简短概要只是意在使读者熟悉本公开的实施例的某些方面和内容,而不是限制到所要求的主题。
附图说明
在阅读以下详细说明并参考附图后,可以更好地理解本公开的各个方面,其中:
图1是根据本公开的各个方面的典型Open CL编译路径的示例框图,其说明了将高级编程语言写成的程序传播到IC的低级可编程逻辑的过程;
图2是说明Open CL编译器的时间密集型硬件生成周期的示例框图;
图3是根据实施例说明调用图2的硬件生成周期的初始编译过程的示例流程图;
图4是根据实施例说明从图3的初始编译得到的编程内核的示例的示例框图;
图5根据本公开实施例描绘了说明不调用图2的硬件生成周期的二次编译过程的示例流程图;
图6是根据实施例说明改变到调用二次编译(例如图5中的一个)的高级程序的示例框图;
图7是根据本公开实施例说明改变到需要新初始编译的高级程序的示例框图;
图8是根据本公开实施例说明改变到如下高级程序的示例框图,在其中二次编译可能是可行的,但是当通过该二次编译实现时,可能在效率边界外;
图9是根据实施例说明并行执行的多个CpenCL线程的示例框图;
图10是根据实施例说明在由初始编译定义的复杂和简单的硬件定义之间的比较的示例框图;
图11是说明在其执行流中使用多个内核的主机程序20的示例调用图;
图12是根据实施例说明用于提高关键路径效率的过程的示例流程图;
图13是说明通过使用现有内核定义的未使用功能单元资源创建新的内核的示例框图;
图14是说明通过使用多个现有内核中定义的未使用功能单元资源创建的新内核的示例框图;
图15是说明被转换为不可编程硬件流水线的可编程内核的示例框图;以及
图16是根据实施例说明具有设计分区的可编程逻辑的示例框图。
具体实施方式
以下将描述一个或多个具体实施例。为了提供这些实施例的简要说明,在说明书中并非描述实际实施方式的所有特征。应当理解,在任何这种实际实施方式的开发中,比如在任何工程或设计项目中,必须对许多特定实施方式做出决定,以实现开发者的具体目标,比如符合系统相关及业务相关的约束,这会随着实施方式而变化。此外,应当理解,这种开发努力可能是复杂且耗时的,尽管如此,其对于受益于本公开的本技术人员仍是设计、制造以及生产的常规任务。
如以下进一步详细讨论的,本公开的实施例总体涉及在Cpen CL编译器中的高效编译。传统上,Open CL编译器中的编译包括生成实现Open CL程序所需的硬件组件的时间和资源密集循环。不幸的是,这个循环常常需要花费很多小时甚至几天来完成,造成可编程逻辑设计者将高级代码编译为集成电路(IC)上的低级指令时的体验不满意。传统上,对高级代码的每个改变需要额外的时间密集型编译。本文所讨论的技术提供两级编译方案,其可以提供时间更高效的编译。第一级,即初始编译,其基于可编程逻辑设计者提供的高级程序生成编程内核,该编程内核可以包括在IC的可编程逻辑上实现的硬件描述。第二级,或二次编译,其有助于后续对高级程序进行改变。二次编译使用修改的指令集,其可以实现在初始编译中生成的硬件上,以实现后续改变。通过只修改指令集而不需修改硬件定义,可以显著降低后续编译时间,这是因为二次编译可以去除为可编程逻辑生成硬件的时间密集型步骤。
记住了前述内容,图1是Open CL编译路径10的示例框图,其说明高级程序被实现为集成电路(IC)的可编程逻辑(例如现场可编程门阵列(FPGA))上的低级代码的路径。
如图所示,Open CL编译路径10开始于高级程序12。高级程序12可以包括由逻辑设计者实现的可编程逻辑。可编程逻辑可以是以诸如Open CL编程语言(例如,C++编程语言)的高级语言写成的计算机可读指令,高级语言使得逻辑设计者能够更有效且更容易地提供编程指令,以实现集成电路(IC)的一组可编程逻辑,而不需要低级计算机编程技能(例如,Verilog或VHDL编程技能)。由于Open CL与诸如C++的其他高级编程语言相当类似,所以与需要学习不熟悉的低级编程语言的设计者相比,熟悉这种编程语言的可编程逻辑设计者将新功能实现到IC中的学习曲线降低。
然而,IC发计软件14,比如AlteraTM的Quartus II,通常使用低级代码而不是高级编程语言指令来操作。因此,编译器16,如OpenCL编译器,可以有助于解释高级程序12,以生成中间低级别的代码18和/或为低级代码18提供实现指令的主机程序20。低级代码18可以是用诸如Verilog的硬件描述语言(HDL)写成的编程代码。低级代码18可以定义一一组硬件组件逻辑,其有助于实现IC上的高级程序12。设计软件14可以接着解释低级代码18,以生成包括实现低级代码18所必需的硬件组件的可编程逻辑。一旦设计软件14生成了适当的可编程逻辑,该可编程逻辑就被实现在IC22(例如,FPGA)上。
不幸的是,如上所讨论的,生成可编程逻辑(包括定义实现低级代码18所必需的硬件组件)常常是时间非常密集型的过程。实际上,该过程可能花费许多小时或几天来生成这种合适的可编程逻辑。为了提供对该时间密集型过程的更详细了解,图2说明有助于确定IC上可编程逻辑的硬件定义的示例硬件组件生成循环。如上所讨论的,逻辑设计者可以实现高级程序12,其由编译器转换为HDL低级代码18。设计软件14可以解释低级代码18并生成适当的可编程逻辑,以便实现在IC22上。为了生成可编程逻辑,设计软件14可以使用计算及时间密集的时序收敛(closure)循环50。时序收敛循环50可以包括综合52、布局布线54、时序分析56和/或设计改变58。综合52包括确定要在IC的可编程逻辑上实现的可能的硬件组件列表,使得HDL程序可以在IC上执行。在布局布线54期间,设计软件14试图高效地放置在综合期间所确定的硬件组件及路由信号,使得硬件组件的存储和速度是高效的,使得可以提高最大工作频率(Fmax)。在时序分析56期间,设计软件14确定布局布线的硬件元件及信号的Fmax是否提供在由可编程逻辑设计者或设计软件14指定的时序参数范围内的Fmax。如果布局布线的硬件元件及信号不符合时序参数,则设计软件14实现设计改变58,将编程逻辑修改为包括一组不同的硬件组件。重复综合52,使用一组不同的硬件组件和/或布局布线配置。重复时序收敛循环50,直到布局布线的硬件组件及信号符合时序参数。不幸的是,可能需要多次重复时序收敛循环50来找到能够执行高级程序12的高效解决方案,从而产生了较长的循环时间60。由于循环时间60可能花费相当长的时间,其可能使可编程逻辑设计者的用户体验不满意。此外,在没有此处所述的后续编译的情况下,每次可编程逻辑发计者修改高级程序12时,设计软件14重新执行时间密集的时序收敛循环50,重复时间密集的编译时间。
为了提升用户体验,可以实现两级编译方案。第一级或初始编译可以有助于生成要在IC上实现的硬件组件,并且第二级或二次编译可以有助于利用初始编译的硬件组件来实现对高级程序12(或低级代码18)进行的任何改变。提供图3至图8以更清楚地说明初始及二次编译过程以及使用这些编译过程时可能遇到的各种情况。
I.初始编译
如上所讨论的,两级编译方案可以提供初始编译,其生成有助于实现高级程序14的硬件组件。图3是说明初始编译过程80的示例流程图。图4是为包括简单的整数算术的高级程序12提供初始编译过程80的示例的示例性框图。
如图3所示,初始编译80可以开始于获取高级程序12(方框82)。在图4的示例中,高级程序包括简单的整数加法,在z中存储a和b的总和。编译器16可以将高级程序12转换为主机程序20(方框84)。如图4所示,主机程序20可以包括低级指令流86,其为从高级程序12到可以由低级代码18实现的低级主机程序20的转换。如图所示,z[id]=a[id]+b[id]转换为分别将A[0]和B[0]加载至寄存器R1和R2的加载函数。求和函数将寄存器R1和R2的总和存储在R3中。存储函数将寄存器R3中的值存储于Z[0]中。在生成低级指令流86后,设计软件14或编译器16可以生成实现低级指令流86所必需的硬件(例如,低级代码18)(方框88)。例如,如图4所示,因为指令流86包括加载单元90、存储单元92、寄存器94(例如,R1、R2以及R3)以及加法功能单元96,所以由低级代码18定义的硬件定义98包括在数据路径100上生成的用于IC22的可编程逻辑中的这些组件中的每一个。此外,控制单元102(例如,状态机)可以通过基于低级指令流86来指示连接到数据路径100的组件(例如,加载单元90和存储单元92),以此控制数据路径100,使得低级指令流86可以被实施。正如将在下面更详细讨论的,硬件定义98不限于有助于当前低级指令流86实施方式的硬件组件。而是,正如将在下面更详细讨论的,硬件定义98可以包括提供至编译器16的编程逻辑中不使用的许多组件。
在生成硬件时,初始编译会根据时序收敛循环50处理组件。因此,可能使用数小时和/或数天来完成初始循环。然而,正如将在下面更详细讨论的,初始编译可以生成硬件定义98,所述硬件定义98在未修改状态中仍然有助于对高级程序12和/或低级指令流86进行某些修改而无需使用额外的初始编译来重新生成硬件定义98。
II.二次编译
二次编译可以有助于实现对高级程序12和/或低级指令流86进行的修改而无需通过初始编译重新生成硬件组件。图5说明示例性的二次编译过程110,而图6至图8说明在修改高级程序12后可能遇到的各种情况。如图5所示,可以在逻辑设计者修改高级程序12(方框112)时开始二次编译过程110。完成轮询以确定是否已经为高级程序12生成现有硬件(方框114)。在替代实施例中,设计者可以简单地选择一个选项来使用二次编译进行编译,使得设计软件14可以安全地假设先前已经发生硬件生成。如果先前没有生成任何硬件,则执行初始编译过程80。然而,如果先前的硬件生成已发生,则获取硬件定义98(方框116)。设计软件14和/或编译器16确定是否可以由当前硬件定义98实现高级程序修改(方框118)。当不能使用现有硬件定义98实现该修改时,执行初始编译过程80,基于修改的高级程序112生成新的硬件定义98。然而,在某些实施例中,当现有硬件定义98足以实现修改的高级程序112时,可以实现二次轮询(方框120)。二次轮询确定使用当前硬件定义98实现修改是否适合在设计软件14或其他地方中设置的预先定义的效率边界内。例如,在一些实施例中,设计软件14可以确定使用原始硬件的关键路径的吞吐量与若执行完全重新编译后得到的关键路径的吞吐量之间的差值。如果吞吐量差值在Fmax噪声内,则设计软件可以确定效率在效率边界内。然而,如果差值不在Fmax噪声内,则设计软件可以确定效率不在效率边界内。
如果使用当前硬件定义98实现修改将导致不可接受的效率(例如由效率边界定义的),则开始初始编译过程80,从而基于修改的高级程序112生成新的硬件组件。然而,当使用相同的硬件定义98在效率边界内可以实现修改时,通过修改低级指令流86以在当前硬件定义98上实现修改,二次编译结束(方框122)。
在一些实施例中,不是自动进行至方框122,而是可以向设计者提供提示,从而允许设计者指定:是否应该通过后续的初始编译重新生成硬件定义98,或者是否应该使用当前硬件,尽管可编程逻辑的效率未落入效率边界内。通过选择潜在冗长的编译时间或潜在低效率的设计的折中,这种选择使设计者能够指导该过程,从而迎合设计者的喜好。
图6说明包括可以由图4的原始硬件定义98实现的自图4的高级程序12的简单修改的示例性的高级程序12’。如图所示,在所提供的示例中,逻辑设计者可以通过向存储于z[id]的总和增加额外的变量c[id]来修改原始高级程序12。高级程序被转换为低级指令流86’。如图所示,从低级指令流86到低级指令流86’的修改相当小,使用了一个额外的加载和一个额外的加法指令。因此,设计软件14可以确定:可以用当前硬件定义98实现修改并且这种实现将落入预定义的效率边界内。因此,为了实现改变,实现的低级指令流86可以被修改为包括低级指令流86’的改变。因此,可以实现高级程序12’的修改而无需初始编译80,从而跳过时间密集的时序收敛循环50。
在某些情况下,可以使用当前硬件定义98实现对高级程序12所做的修改,但是由于规定实现的效率低,这种实现可能是不可接受的。例如,图7说明提供比图6的低级指令流86’更复杂的低级指令流86”的示例性的高级程序12”。在提供的示例中,设计者已经将高级程序12修改为a[id]和b[id]相乘而不是求和。如图4所示,当前硬件定义98不包括乘法功能单元。然而,通过二次编译过程110,设计软件14可以识别使用当前硬件定义98可以实现的一组替换的低级指令。例如,如图所示,低级指令流86”包括加法环路,用作乘法功能单元的替代。因此,可以实现修改而不改变现有硬件定义98。
然而,环路可能会使实现的效率显著低下,或者预定义的效率边界可能是严格的,从而该实现可能不会落入预定义的效率边界内。因此,可以执行初始编译过程80,使得实现带有新硬件定义122的新低级指令流120,所述新硬件定义具有乘法功能单元124。通过生成新低级指令流120以及新硬件定义122,可编程逻辑会更加有效并符合效率标准。
在某些情况下,当前硬件定义98不能实现由逻辑设计者所做的对高级程序12的修改。图8提供一个这样的例子。如图所示,已经将高级程序12修改为使用对数函数的高级程序12”’,从而使用浮点功能单元(FPU)140以及三角函数(TRIG)功能单元142。由于当前硬件定义98不包括浮点功能单元140或三角函数单元142,所以设计软件不能将高级程序12”’转换为可以由当前硬件定义98实现的低级指令流(如无效的低级指令流144所示)。因此,开始完整的初始编译110,生成包括浮点单元140以及三角函数单元142的硬件定义146。
正如图6至图8提供的示例所示,如果使用二次编译可以用于使用现有硬件定义创建实现并且该实现落入可接受的效率边界内,则在修改高级程序12时可以避免硬件生成。牢记一点,在完成初始编译时包括额外的考虑会是有益于的,使得可以降低修改高级程序12所需的初始编译的次数。
III.编译考虑因素以及效率提升
许多考虑因素及效率可能会增加得到的实施方式的Fmax和/或减少可编程逻辑设计者可能遇到的初始编译的次数。例如,数据路径100的长度和/或复杂性可能直接影响实施方式的吞吐量,从而影响Fmax。此外,可用的编程内核的数量可能影响实施方式的吞吐量。另外,通过向内核增加灵活性和/或使得能够对特定内核进行选择性的初始编译,可以大大降低初始编译的数量和/或时间长度。编译器16可以在决定如何生成硬件以及实现高级程序12时考虑到这些因素。
i.数据路径的折中
OpenCL使指令的并行执行更加容易,从而提高可编程逻辑的效率。例如,图9说明可以并行执行的多个OpenCL线程160(例如,高级程序12中的指令)。如图所示,OpenCL线程160包括多个求和计算线程。正如前面关于图4所讨论的,可以通过使用加载单元90、存储单元92以及加法功能单元96来实现加法线程。如图9的示例所示,在第一个时钟周期中,加载单元可以加载a[0]以及b[0]。在第二个时钟周期中,可以使用加法功能单元96来对加载的值a[0]和b[0]进行求和并开始第二个线程,加载a[1]和b[1]。在第三个时钟周期中,a[0]和b[0]的总和可以存储于c[0]中,完成第一个线程的执行。此外,可以使用加法功能单元96添加在先前周期中加载的值。此外,可以由加载单元96加载值a[2]和b[2],从而开始第三个线程。在第四个周期中,将第三个周期的总和存储于c[1]中,从而完成第二个线程的执行。进一步地,通过加法功能单元96添加来自第三个周期的加载值并通过加载单元90加载值a[3]和b[3],从而开始第四个线程。这个循环会继续下去,直到完成执行每个线程。通过这个例子可以看出,通过在每个时钟周期保持最大数目的功能单元处于工作,并行执行可以提供较大的效率。因此,编译器可以包括有效确保线程可以并行执行的考虑因素。
数据路径的大小会直接影响实现的线程的吞吐量。虽然可以通过为线程的每个基本操作只包括一个功能单元来最小化数据路径,但是在某些情况下,向数据路径添加额外功能单元是有益的。图10说明两个示例数据路径170和172的示例性的比较。数据路径170是具有大量功能单元的复杂数据路径,而数据路径172是功能单元数目减少的更简单的数据路径。例如,复杂数据路径170包括是更简单数据路径172两倍的加载单元90、存储单元92、奇存器94、加法功能单元96以及乘法功能单元124。与实现更简单数据路径172相比,实现复杂数据路径170有优点和缺点。根据具体的优先级,任一个可能优先于另一个而被选择。例如,确定数据路径复杂性时有两个首要目标要考虑。其一,通过提供在可能的最少周期内执行线程的能力同时支持许多重叠并行线程,复杂数据路径170会是更高效的。例如,由于功能单元数目增加,可以并行添加许多计算线程而数据路径不会变得饱和。因此,对于高级程序12中的大量线程,效率会增加。然而,选择合适数据路径的第二个目标是减少IC的可编程逻辑占用的面积。随着可选功能单元添加到数据路径上,存储数据路径所需的面积量可能呈平方地增加。然而,这种数据路径可以使得添加更多的线程106而不使数据路径饱和,从而生成更多的吞吐量。可以复制不太复杂的数据路径以提高系统内的吞吐量。考虑上述情况,编译器16可以分析可编程逻辑占用的面积与计算吞吐量之间的折中,以确定应该使用复杂数据路径170还是更简单数据路径172。
在某些情况下,编译器16可使用评估公式:
来评估数据路径大小的效率。例如,编译器16可以以复杂数据路径172开始并采用评估算法评估。编译器16可以迭代地移除一个或多个功能单元(例如,乘法功能单元124)并使用评估公式重新评估并记录评估结果。因此,编译器16可以确定具有最佳平衡结果的解决方案并实现对应的数据路径大小。
ii.多内核优化
目前已经讨论了单个Open CL内核的数据路径以及低级指令流的优化,现在讨论转向多内核程序实现的考虑因素。图11说明在其执行中使用多内核的主机程序20的示例调用图。如图所示,主机程序20可以定义多内核的调用路径。线190表示由主机程序20调用的关键路径(例如,时间最密集的路径)。由于关键路径190是由主机程序20调用的时间最密集的路径,因此与增加其他调用路径的效率相比,使关键路径190的效率增加会对整体性能更有影响。图12是说明根据实施例增加关键路径190的效率的过程200的示例流程图。编译器16或者其他计算机处理设备可以确定由主机程序20调用的内核并评估每一内核的数据路径(方框202)。可以通过确定数据路径并行性或者并行覆盖线程的数量以及每一内核的每一线程周期,以此计算每一内核的执行时间(方框204)。在知道每一内核的执行时间后,可以将调用路径中的每一内核的执行时间相加,以确定关键路径(方框206)。例如,在图11的示例中,通过将内核1、2、4以及6的执行时间相加,计算出一个调用路径的时序。通过将内核1、3、4以及6的执行时间相加,计算出另一调用路径的时序。通过将内核1、3、5以及6的执行时间相加,计算出再一个调用路径的时序。具有最长时序的调用路径(例如,在这些例子中是具有内核1、3、5以及6的路径)将被确定为关键路径。值得注意的是,虽然当前示例没有示出环路调用路径,但是仍可以通过以下步骤计算这种路径的时序:获取分布信息以知晓该环路可能发生的次数,从而将环路中的内核时序以合适的次数增加到时序总和。一旦关键路径190被确定,在关键路径190中的任何内核(例如,内核1、3、5和/或6)可以被选择进行复制(方框208)。如上所述,通过复制内核,吞吐量可以被增加。通过增加关键路径上的吞吐量,可以增加整个系统的效率。编译器16可以评估实现选定内核的额外副本是否是有益的(方框210)。例如,编译器16可以确定实现选定内核的新副本所需的资源量以及实现选定内核的新副本带来的效率增益,并确定是否应该实现新副本。如果应该实现新副本,则复制内核(方框212)并且重复内核选定(方框208),选择在方框212中被复制的相同内核或者在关键路径190上的不同内核。然而,如果编译器16确定实现选定内核的副本无益,则编译器16可以确定是否有另一内核可以被复制(方框214)。如果存在可以被复制的另一内核,则重复内核选择(方框208),选择不同内核。过程200可以继续,直到遇到旁路度量(bypass metrics),或者当关键路径190上无其他内核时。例如,当关键路径190上无内核可用以被复制时,结束过程200(方框216)。此外,旁路度量可以使过程200结束(方框216),例如:超过预定数量的内核复制迭代,IC资源消耗超出阈值,或者确定对于某一数量的迭代,吞吐量度量没有增加。
当增加新的内核给主机程序20时,确定新的内核是否能适合现有的内核会是有益的。例如,图13说明示例性情况,其中新的内核,即内核7被增加到主机程序20中。当编译器16确定新的内核应被增加时,编译器16会检测内核8的功能单元是否可以在现有的内核中找到。例如,如果一个内核具有的未使用功能单元是新内核中所使用的功能单元,则现有的内核可以被修改为实现新的内核功能。例如,如果内核7包括存储功能单元92以及加法功能单元96,则编译器16可以寻找未使用的存储功能单元92以及加法功能单元96。如图13所示,内核1可以包括未使用的存储功能单元92以及未使用的功能单元96。如得到的主机程序20'所示,由于现有的内核包括实现内核7所需的未使用的功能单元,因此内核1可以被修改为还执行内核7的功能。
在一些实施例中,编译器16可以检测多个内核上的未使用的功能单元,并且可以使用未使用的功能单元来生成新的内核。例如,图14提供了部分在内核1上且部分在内核3上实现的内核7的功能的一个例子。如关于图13所讨论的,内核7使用存储功能单元92和加法功能单元96。在所描述的例子中,内核1包括未使用的存储功能单元92,而内核3包括未使用的加法功能单元96。如图所示,编译器16可以修改内核1和3以执行内核7的各部分功能(例如,内核7的一部分A在内核1中而内核7的一部分b在内核3中)。由于可以通过现有的内核实现新的内核的功能,因此无需生成新的内核,从而可以大大减少编译时间。
虽然当前的例子示出由现有内核中的未使用的硬件满足新内核的所有功能,但在一些实施例中,仅有部分功能可以由现有内核的未使用的功能单元满足,从而导致生成新内核。尽管生成新内核,但使用现有内核的至少一些未使用的功能单元会是有益的。例如,这种方案可以使随后编译中的硬件生成不那么复杂并且耗时更少。因此,即使当编译器16确定新内核应被创建时,编译器16仍可以使用现有内核的未使用的功能单元。
iii.编译器灵活性
在两级编译过程期间,可以使设计软件14能够从可编程逻辑设计者接收用户指导,从而使编译器16能够基于设计者输入减轻过多的初始编译。例如,当新项目开始时,设计软件14可以提示可编程逻辑设计者可编程逻辑将被设计用于的预期纵向市场(vertical market)。纵向市场可以是基于具体和专业需求而从事交易的商业。例如,提供到设计软件14的纵向市场参数可以包括金融服务和/或油气工业。基于初始编译之前提供的纵向市场,编译器16或设计软件14可以确定要添加的一组有用的功能单元,而不考虑当前内核是否将使用功能单元。这样的未使用的功能单元可以增加被编译的可编程逻辑的硬件灵活性,从而帮助减少随后的添加额外的功能单元所需的初始编译。例如,金融服务纵向市场可能使用许多三角学功能单元以及浮点功能单元,诸如对数、平方根、双精度操作单元。相反,油气操作可能频繁地使用非常不同的功能单元子集。如果设计者指导编译器16或者设计软件14具体地针对金融服务编译可编程逻辑,则编译器16或者设计软件14可以包括专门面对金融服务的一组扩展的功能单元(例如三角函数和/或浮点功能单元)。在某些实施例中,当存在足够的可编程逻辑存储区域来包含额外的功能单元时,一个浮点功能单元可以合并到每一内核中。因此,如上所述,通过提供一组扩展的功能单元给新创建的内核使用,增加了生成的内核的灵活性,从而未使用的功能单元可以减少随后的初始编译。
然而,这个添加的灵活性会增加可编程逻辑使用的可编程存储空间的量,从而对于一些可编程逻辑设计是不希望的。因此,设计者可以提供指导(例如,通过设计软件14的输入)来关闭这种灵活性特性,使得保留可编程逻辑空间。例如,当可编程逻辑设计差不多完成时,在未来的实质性修改变动相对小的情况下,设计者可能希望减少各个内核的存储区域并且复制内核,如前所述,以增加吞吐量并最终增加整个可编程逻辑设计的性能。因此,通过使设计者能够关闭灵活性功能,基于设计者的指导可以更准确地定制设计。
可以在某些实施例中实现的额外的编译器灵活性包括设计者的如下能力:通过提供指导以将某些内核选择性地从数据路径/可编程控制实现移植到更高效的硬件流水线实现,从而增加效率。这种功能例如在接近设计周期结尾时是期望的,在那时,更关注效率而不是功能增长。图15示出了示例性内核,其基于设计者的指导而被实现为被移植到硬件流水线的指令集和数据路径。如图所示,通过使用控制单元102和主机程序20可以将内核实现有可编程性。然而,当设计者期望使内核的效率增加时,设计者可以指导编译器16或者设计软件14来将内核移植到固定的硬件流水线,移除内核的所有可编程性。在图15的例子中,可编程内核包括通过数据路径100耦合的加载功能单元90、存储功能单元92、寄存器94、加法功能单元96以及乘法功能单元124。如图所示,主机程序20为控制单元102提供指令以使用加载单元90、加法功能单元96以及存储单元92。当设计者期望效率折中(例如,增加Fmax)超过功能灵活性折中(例如,可编程性)时,设计者可以为编译器16或者设计软件14提供指示,使得可编程内核122可以被移植到非可编程硬件流水线240。在接收到这个指示后,编译器16或者设计软件14可以将可编程内核122转换为非可编程硬件流水线240。在图15的例子中,如箭头242所示,设计软件14已将可编程内核122转换为非可编程硬件流水线240。因为主机程序20使用两次调用加载单元90,一次调用加法功能单元96以及存储单元92,所以非可编程硬件流水线240包括两个加载单元90、一个加法功能单元96以及一个存储单元92。从此例中可以看出,控制单元102不存在,因为没有编程指令被解释为控制非可编程硬件流水线240。此外,因为乘法单元124未被主机程序20使用,因此它未被合并到硬件流水线240中。通过移除内核的可编程性,可以极大地减少内核的功能灵活性。然而,这样的修改可以导致实质效率的改进(例如,所用的可编程逻辑区域的量减少和/或Fmax增加)。例如,在一些实施例中,通过将图15的内核转换为非可编程硬件流水线240以便进行简单加法,Fmax性能可以增加为可编程内核的三倍。
两级编译过程可以得到的另一效率是对内核进行选择性分区,使得公共类型的内核可以被编译而替换类型的内核不被编译。图16说明带有设计分区262的示例性的可编程逻辑260。可以启用设计分区262以存储一个或多个相似类型的内核(例如具有公共功能单元)。例如,内核264被存储于一个分区262中,内核266被存储于第二分区262中,而内核268被存储于第三分区262中。通过在设计分区262中存储相似类型的内核,可以使设计软件16能够仅针对具体设计分区262内包含的内核子集执行初始和/或二次编译。此外,设计者可以指导以将具体分区的内核转换为非可编程硬件流水线,以便增强性能。
如前所讨论的,本文提供的两级编译过程有助于减小编译IC的可编程逻辑的处理能力和时间,从而提供了更满意的设计体验。通过设计者的指导,针对具体设计可以进一步增强两级编译过程,从而使编译体验唯一面向设计者项目。这种定制可以为设计增加灵活性,减少编译时间,和/或增加设计者程序的性能。
虽然本公开中所阐述的实施例可以进行各种改变以及各种形式,但是具体的实施例已经在附图中通过例子示出并且已在本文中详细描述。然而,应该理解,本公开并不旨在限制到所公开的特定形式。本公开覆盖落入到如由下列所附的权利要求所定义的本公开的精神和范围中的所有修改、等同体和替换。
Claims (16)
1.一种方法,其包括:
通过至少一个处理器执行初始编译,包括:
解释高级程序;
至少部分地基于所述高级程序来生成包括硬件定义,所述硬件定义包括能够在集成电路即IC的可编程逻辑上实现的内核;以及
基于所述高级程序来生成包括用于控制单元的机器可读实现指令的主机程序;
解释对所述高级程序的修改;以及
执行后续编译,包括基于所述修改来修改机器可读实现指令;
其中至少部分地基于所述硬件定义的吞吐量测量值、减少初始编译的目标或其组合来生成所述硬件定义。
2.如权利要求1所述的方法,包括运行编译器以执行所述初始编译,并且运行可编程逻辑设计软件以执行所述后续编译。
3.如权利要求2所述的方法,基于实现所述硬件定义所需的可编程逻辑区域的量、处理对所述主机程序的修改的所述硬件定义的灵活性或其组合,通过所述编译器调整所述硬件定义中的功能单元的数目。
4.如权利要求2所述的方法,包括基于实现所述硬件定义所需的可编程逻辑区域的量与所述硬件定义的吞吐量测量值之间的折中平衡,通过所述编译器确定所述硬件定义中的功能单元的数目。
6.如权利要求1所述的方法,包括:
通过所述编译器确定所述主机程序的关键路径;以及
通过所述编译器复制关键路径上的内核以增加吞吐量。
7.如权利要求6所述的方法,包括通过以下步骤经由所述编译器确定所述关键路径:
确定一组由主机程序调用的内核;
为该组内核中的每个内核估计数据路径;
确定每个内核的执行时间;
将沿所述主机程序的执行路径的每个内核的执行时间相加,以确定具有最大执行时间的路径。
8.如权利要求1所述的方法,包括通过所述编译器使用由所述初始编译生成的内核中的未使用功能单元来实现第二内核。
9.如权利要求1所述的方法,包括:
通过所述编译器确定两个或更多个内核中的未使用功能单元,以及
通过所述编译器使用所述两个或更多个内核中的所述未使用功能单元中的至少一部分来实现新内核。
10.如权利要求1所述的方法,包括:
通过所述编译器从可编程逻辑设计者接收编译器灵活性信息;以及
通过所述编译器基于所述编译器灵活性信息来生成所述硬件定义。
11.如权利要求10所述的方法,包括接收所述高级程序的目标纵向市场并至少部分地基于所述高级程序来生成所述硬件定义。
12.如权利要求11所述的方法,其中所述目标纵向市场包括金融服务市场,并且至少一个计算机被配置为基于所述金融服务市场来生成具有三角函数功能单元、浮点功能单元或其组合的硬件定义。
13.如权利要求10所述的方法,其中所述编译器灵活性信息包括在吞吐量的增加或随后初始创建数目的减少之间折中的优选指示。
14.如权利要求13所述的方法,包括:
当优选是随后初始创建数目的减少时,添加可编程内核,以及
当优选是吞吐量的增加时,添加不可编程的硬件流水线。
15.一种计算机系统,其包括:
具有编译器的计算机,所述编译器被配置为:
解释包括机器可读指令的高级程序,所述机器可读指令表示在集成电路即IC上要实现的高级功能;以及
执行初始编译,所述初始编译被配置为至少部分地基于所述高级程序来定义并生成硬件定义,所述硬件定义包括在所述IC上时实现的一个或多个内核;以及
可编程逻辑设计软件,其被配置为:
检测对所述高级程序的一个或多个改变;以及
执行后续编译,所述后续编译被配置为在不修改所述硬件定义的情况下使用所述硬件定义实现所述一个或多个改变;
其中所述编译器被配置为至少部分地基于以下项目中的至少两个之间的折中平衡来定义并生成所述硬件定义:用于所述硬件定义的可编程逻辑区域的量、所述硬件定义的吞吐量测量值以及基于未来对所述高级程序的改变将需要额外的初始编译的可能性中。
16.如权利要求15所述的计算机系统,其中所述可编程逻辑设计软件被配置为将所述一个或多个内核划分为第一分区和第二分区,其中可以对第一分区或第二分区中的一个或多个内核执行第二初始编译或第二后续编译而不影响另一分区中的内核。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/531,353 US9134981B2 (en) | 2012-06-22 | 2012-06-22 | OpenCL compilation |
US13/531,353 | 2012-06-22 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103514025A true CN103514025A (zh) | 2014-01-15 |
CN103514025B CN103514025B (zh) | 2016-12-28 |
Family
ID=48670426
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310335855.5A Active CN103514025B (zh) | 2012-06-22 | 2013-06-21 | Opencl编译 |
Country Status (3)
Country | Link |
---|---|
US (1) | US9134981B2 (zh) |
EP (1) | EP2677424B1 (zh) |
CN (1) | CN103514025B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106687924A (zh) * | 2014-07-10 | 2017-05-17 | 英特尔公司 | 用于基于当前状态来更新着色器程序的方法和装置 |
CN112997145A (zh) * | 2018-08-27 | 2021-06-18 | 领汇仪器有限公司 | 使用部分重配置对现场可编程门阵列进行编程的改进的过程 |
CN116541018A (zh) * | 2023-06-19 | 2023-08-04 | 之江实验室 | 一种分布式模型编译系统、方法、装置、介质及设备 |
Families Citing this family (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9134981B2 (en) * | 2012-06-22 | 2015-09-15 | Altera Corporation | OpenCL compilation |
CN104866295B (zh) * | 2014-02-25 | 2018-03-06 | 华为技术有限公司 | OpenCL运行时系统框架的设计方法及装置 |
US9965185B2 (en) | 2015-01-20 | 2018-05-08 | Ultrata, Llc | Utilization of a distributed index to provide object memory fabric coherency |
CN104142845B (zh) * | 2014-07-21 | 2018-08-17 | 中国人民解放军信息工程大学 | 基于OpenCL-To-FPGA的CT图像重建反投影加速方法 |
WO2016114532A1 (ko) * | 2015-01-16 | 2016-07-21 | 서울대학교 산학협력단 | 프로그램 컴파일 장치 및 프로그램 컴파일 방법 |
CN107533457B (zh) * | 2015-01-20 | 2021-07-06 | 乌尔特拉塔有限责任公司 | 对象存储器数据流指令执行 |
US9886210B2 (en) | 2015-06-09 | 2018-02-06 | Ultrata, Llc | Infinite memory fabric hardware implementation with router |
US9971542B2 (en) | 2015-06-09 | 2018-05-15 | Ultrata, Llc | Infinite memory fabric streams and APIs |
US10698628B2 (en) | 2015-06-09 | 2020-06-30 | Ultrata, Llc | Infinite memory fabric hardware implementation with memory |
JP6500626B2 (ja) * | 2015-06-16 | 2019-04-17 | 富士通株式会社 | 計算機、コンパイラプログラム、リンクプログラムおよびコンパイル方法 |
US10235063B2 (en) | 2015-12-08 | 2019-03-19 | Ultrata, Llc | Memory fabric operations and coherency using fault tolerant objects |
WO2017100288A1 (en) | 2015-12-08 | 2017-06-15 | Ultrata, Llc. | Memory fabric operations and coherency using fault tolerant objects |
US10241676B2 (en) | 2015-12-08 | 2019-03-26 | Ultrata, Llc | Memory fabric software implementation |
EP3387547B1 (en) | 2015-12-08 | 2023-07-05 | Ultrata LLC | Memory fabric software implementation |
CN105447285B (zh) * | 2016-01-20 | 2018-11-30 | 杭州菲数科技有限公司 | 一种提高OpenCL硬件执行效率的方法 |
US10311002B2 (en) | 2017-05-15 | 2019-06-04 | International Business Machines Corporation | Selectable peripheral logic in programmable apparatus |
US10891414B2 (en) | 2019-05-23 | 2021-01-12 | Xilinx, Inc. | Hardware-software design flow for heterogeneous and programmable devices |
US11188312B2 (en) | 2019-05-23 | 2021-11-30 | Xilinx, Inc. | Hardware-software design flow with high-level synthesis for heterogeneous and programmable devices |
US11301295B1 (en) | 2019-05-23 | 2022-04-12 | Xilinx, Inc. | Implementing an application specified as a data flow graph in an array of data processing engines |
US10891132B2 (en) * | 2019-05-23 | 2021-01-12 | Xilinx, Inc. | Flow convergence during hardware-software design for heterogeneous and programmable devices |
US10977018B1 (en) | 2019-12-05 | 2021-04-13 | Xilinx, Inc. | Development environment for heterogeneous devices |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7634752B2 (en) * | 2003-01-28 | 2009-12-15 | Altera Corporation | System and method for design entry and synthesis in programmable logic devices |
CN101963916A (zh) * | 2010-09-28 | 2011-02-02 | 中国科学院地质与地球物理研究所 | 编译处理方法及装置 |
US7952387B1 (en) * | 2008-08-13 | 2011-05-31 | Altera Corporation | Securing memory based IP in FPGAs |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7100124B2 (en) * | 2000-07-03 | 2006-08-29 | Cadence Design Systems, Inc. | Interface configurable for use with target/initiator signals |
US6779169B1 (en) * | 2002-05-31 | 2004-08-17 | Altera Corporation | Method and apparatus for placement of components onto programmable logic devices |
US8595670B1 (en) * | 2010-03-08 | 2013-11-26 | Altera Corporation | Method and apparatus for circuit block reconfiguration EDA |
US8812285B2 (en) * | 2010-08-31 | 2014-08-19 | The Regents Of The University Of California | Designing digital processors using a flexibility metric |
US9134981B2 (en) * | 2012-06-22 | 2015-09-15 | Altera Corporation | OpenCL compilation |
-
2012
- 2012-06-22 US US13/531,353 patent/US9134981B2/en active Active
-
2013
- 2013-06-21 EP EP13173146.5A patent/EP2677424B1/en active Active
- 2013-06-21 CN CN201310335855.5A patent/CN103514025B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7634752B2 (en) * | 2003-01-28 | 2009-12-15 | Altera Corporation | System and method for design entry and synthesis in programmable logic devices |
US7952387B1 (en) * | 2008-08-13 | 2011-05-31 | Altera Corporation | Securing memory based IP in FPGAs |
CN101963916A (zh) * | 2010-09-28 | 2011-02-02 | 中国科学院地质与地球物理研究所 | 编译处理方法及装置 |
Non-Patent Citations (2)
Title |
---|
GAJSKI: "The Ultimate Reconfigurable Component", 《CENTER FOR EMBEDDED COMPUTER SYSTEM》, 28 March 2003 (2003-03-28), pages 4 - 14 * |
PEKKA O JASKELAINEN ET AL: "OpenCL-based design methodology for application-specific processors", 《EMBEDDED COMPUTER SYSTEM(SAMOS),2010 INTERNATIONAL CONFERENCE ON,IEEE,PISCATAWAY,NJ,USA》, 19 July 2010 (2010-07-19), pages 223 - 230, XP031806001 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106687924A (zh) * | 2014-07-10 | 2017-05-17 | 英特尔公司 | 用于基于当前状态来更新着色器程序的方法和装置 |
CN112997145A (zh) * | 2018-08-27 | 2021-06-18 | 领汇仪器有限公司 | 使用部分重配置对现场可编程门阵列进行编程的改进的过程 |
CN116541018A (zh) * | 2023-06-19 | 2023-08-04 | 之江实验室 | 一种分布式模型编译系统、方法、装置、介质及设备 |
CN116541018B (zh) * | 2023-06-19 | 2023-09-15 | 之江实验室 | 一种分布式模型编译系统、方法、装置、介质及设备 |
US11934887B1 (en) | 2023-06-19 | 2024-03-19 | Zhejiang Lab | Distributed model compilation |
Also Published As
Publication number | Publication date |
---|---|
CN103514025B (zh) | 2016-12-28 |
EP2677424B1 (en) | 2020-01-15 |
EP2677424A2 (en) | 2013-12-25 |
US20130346953A1 (en) | 2013-12-26 |
EP2677424A3 (en) | 2014-08-06 |
US9134981B2 (en) | 2015-09-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103514025A (zh) | Opencl编译 | |
CN113703775B (zh) | 一种编译方法、装置、设备及存储介质 | |
JP4042604B2 (ja) | プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム | |
US10223124B2 (en) | Thread selection at a processor based on branch prediction confidence | |
CN110968321B (zh) | 张量计算代码优化方法、装置、设备及介质 | |
CN103329132A (zh) | 架构优化器 | |
EP2924559A2 (en) | Program, compiler method, and compiler apparatus | |
Jiang et al. | Boyi: A systematic framework for automatically deciding the right execution model of OpenCL applications on FPGAs | |
CN109840248B (zh) | 一种作业流程优化方法、装置及存储介质 | |
CN103593220A (zh) | Opencl编译 | |
Janakiraman et al. | Multi-objective module partitioning design for dynamic and partial reconfigurable system-on-chip using genetic algorithm | |
KR101962250B1 (ko) | 재구성가능 아키텍처를 위한 스케줄러 및 스케줄링 방법 | |
WO2022073346A1 (en) | Devices, methods, and media for efficient data dependency management for in-order issue processors | |
US20120096247A1 (en) | Reconfigurable processor and method for processing loop having memory dependency | |
US20120089813A1 (en) | Computing apparatus based on reconfigurable architecture and memory dependence correction method thereof | |
WO2017065629A1 (en) | Task scheduler and method for scheduling a plurality of tasks | |
US9383981B2 (en) | Method and apparatus of instruction scheduling using software pipelining | |
Lotfi et al. | ReHLS: resource-aware program transformation workflow for high-level synthesis | |
JPWO2018066073A1 (ja) | 情報処理装置、情報処理方法及び情報処理プログラム | |
Kim et al. | System level power reduction for yolo2 sub-modules for object detection of future autonomous vehicles | |
Karuri et al. | A generic design flow for application specific processor customization through instruction-set extensions (ISEs) | |
CN216527140U (zh) | 一种分支预测的装置及处理器 | |
US9772827B2 (en) | Techniques for determining instruction dependencies | |
Gao et al. | A software pipelining algorithm in high-level synthesis for fpga architectures | |
Baird et al. | Optimizing transfers of control in the static pipeline architecture |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |