CN105677491A - 一种数据传输方法及装置 - Google Patents
一种数据传输方法及装置 Download PDFInfo
- Publication number
- CN105677491A CN105677491A CN201511032093.7A CN201511032093A CN105677491A CN 105677491 A CN105677491 A CN 105677491A CN 201511032093 A CN201511032093 A CN 201511032093A CN 105677491 A CN105677491 A CN 105677491A
- Authority
- CN
- China
- Prior art keywords
- data
- internal memory
- address
- memory
- accelerator
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Systems (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明实施例公开了一种数据传输方法及装置,其中,该方法包括:接收Java应用程序的内存申请请求;为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存,所述第一内存为物理地址连续的内存空间;确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息,所述第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度;向加速器发送所述第一数据信息;接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。采用本发明实施例,能够提升Java应用程序与加速器之间的数据传输效率,从而提升了数据的加速性能。
Description
技术领域
本发明涉及通信技术领域,尤其涉及一种数据传输方法及装置。
背景技术
Java是一种可编写跨平台应用程序的面向对象的程序设计语言,其具有平台无关性、安全性、网络移动性等特性,极大地提升了编程效率,由此在不同领域获得了较为广泛的应用。与此同时,通过Java应用程序编写的具体算法,存在执行效率低的问题,并不能满足目前日益增长的数据计算需求,目前可采用硬件方式或软件方式来进行加速,即通过硬件或软件来计算Java应用程序需要计算的数据。其中,硬件方式包括通过加速器如现场可编程门阵列(Field-ProgrammableGateArray,简称为“FPGA”)加速器来实现加速。
目前,在将Java应用程序中的待计算数据下发到加速器如FPGA加速器进行加速计算时,即在通过加速器实现硬件加速的过程中,存在较大的数据传输开销。如图1所示,是现有技术中的一种硬件加速方式的示意图,将Java应用程序中的待计算数据下发到FPGA加速器进行计算,需要经过①->②->③->④->⑤->⑥6个阶段,包括待计算数据对应的数据下发过程①->②->③和结果数据对应的数据返回过程④->⑤->⑥。其中,该数据下发过程需要进行三次拷贝,包括用户态下Java数据传输到用户程序库userlibrary时一次数据拷贝、userlibrary传输到内核态时一次拷贝、内核态传输到FPGA加速器时一次拷贝。结果数据返回过程与数据下发过程类似。这就使得Java应用程序与加速器之间的数据传输开销较大,由此降低了数据传输效率。而且,在加速器的计算速度足够快的情况下,该硬件加速过程中的多次数据拷贝则会导致加速性能降低。
发明内容
本发明实施例所要解决的技术问题在于,提供一种数据传输方法及装置,能够提升Java应用程序与加速器之间的数据传输效率,从而提升了数据的加速性能。
第一方面,本发明实施例提供了一种数据传输方法,包括:
Java应用程序向数据传输装置发送内存申请请求;数据传输装置接收Java应用程序的内存申请请求,为所述Java应用程序分配第一内存,以使Java应用程序将需要计算的目标数据写入所述第一内存;数据传输装置确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息,该第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度;数据传输装置向加速器发送所述第一数据信息;加速器根据所述第一数据信息提取所述目标数据,并对所述目标数据进行计算,得到结果数据并存储该结果数据,向数据传输装置返回用于指示该结果数据的存储位置的第二数据信息;数据传输装置接收加速器返回的第二数据信息,并根据该第二数据信息获取该目标数据对应的结果数据。
其中,所述第一内存是所述Java应用程序和所述数据传输装置均能访问的物理地址连续的内存空间。可选的,所述第一内存可以是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,所述第一内存还可以是预设的固定长度的内存空间。该数据传输装置可通过调用位于操作系统如Linux系统中的用户程序库userlibrary中的程序指令来进行操作。该userlibrary为Java应用程序提供了具体的应用程序编程接口(ApplicationProgrammingInterface,简称为“API”),用来实现申请内存、传输数据、接收结果等,该API接口基于Java本地接口(JavaNativeInterface,简称为“JNI”)实现。
在一些实施例中,在所述为所述Java应用程序分配第一内存之后,数据传输装置还可以以共享内存的方式将所述第一内存封装为缓冲区ByteBuffer对象,并将所述ByteBuffer对象返回给所述Java应用程序。以使Java应用程序根据该ByteBuffer对象将需要计算的目标数据写入该第一内存中,并向数据传输装置返回写入了目标数据后的ByteBuffer对象及该目标数据的长度。数据传输装置根据Java应用程序返回的ByteBuffer对象确定出该目标数据的内存地址,得到包括该目标数据的内存地址及该目标数据的长度的第一数据信息。
在一些实施例中,所述向加速器发送所述第一数据信息之前,所述数据传输装置还可以为所述Java应用程序分配第二内存,所述第二内存用于存放加速器对所述目标数据进行计算后得到的结果数据;
所述第一数据信息还包括所述第二内存的地址以及所述第二内存的长度;所述向加速器发送所述第一数据信息,包括:
将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,以使所述加速器根据所述第三内存的地址从所述第三内存中获取所述第一数据信息;
所述接收所述加速器返回的第二数据信息,包括:
从所述第三内存获取所述加速器返回的第二数据信息。
进一步的,在一些实施例中,所述将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,包括:
将所述第一数据信息写入第三内存,并将所述第三内存的地址加入第一队列,以使所述加速器通过所述第一队列获取所述第三内存的地址;
所述从所述第三内存获取所述加速器返回的第二数据信息,包括:
轮询第二队列读指针和第二队列写指针,并比较所述第二队列读指针的值和所述第二队列写指针的值是否相同;若不同,则从所述第二队列读指针或所述第二队列写指针所在的第二队列中获取所述第三内存的地址,并根据所述第三内存的地址从所述第三内存中获取第二数据信息,所述第二数据信息包括所述结果数据的内存地址以及所述结果数据的长度;将所述第二数据信息传输给所述Java应用程序,以使所述Java应用程序根据所述第二数据信息获取所述结果数据。
其中,所述将所述第二数据信息传输给所述Java应用程序,可以具体为:将所述第二数据信息封装为ByteBuffer对象,并将该ByteBuffer对象传输给所述Java应用程序,以使所述Java应用程序根据所述ByteBuffer对象获取所述结果数据。
第二方面,本发明实施例还提供了一种数据传输方法,应用于加速器中,包括:
加速器接收数据传输装置发送的第一数据信息,所述第一数据信息包括需要计算的目标数据的内存地址及所述目标数据的长度,且所述目标数据的内存地址对应的第一内存为物理地址连续的内存空间;根据所述目标数据的内存地址以及所述目标数据的长度提取所述目标数据;对所述目标数据进行计算,得到所述计算后的结果数据,并存储所述结果数据,向所述数据传输装置返回用于指示所述结果数据的存储位置的第二数据信息。
进一步的,该第一数据信息中还包括用于存放所述目标数据对应的结果数据的第二内存的地址以及所述第二内存的长度;则所述存储所述结果数据,向所述数据传输装置返回用于指示所述结果数据的存储位置的第二数据信息,可以具体为:根据所述第二内存的地址以及所述第二内存的长度将所述结果数据写入所述第二内存;获取所述结果数据的内存地址和所述结果数据的长度,并向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,以根据所述第二数据信息获取所述结果数据。
在一些实施例中,所述接收数据传输装置发送的第一数据信息,包括:
接收数据传输装置发送的第三内存的地址,并根据所述第三内存的地址从所述第三内存获取所述数据传输装置发送的第一数据信息,所述第三内存为所述数据传输装置和所述加速器均能访问的内存空间;
所述向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,包括:
将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中,并通过所述第三内存将所述第二数据信息传输给所述数据传输装置。
进一步的,在一些实施例中,所述接收数据传输装置发送的第三内存的地址,包括:
轮询第一队列写指针及第一队列读指针,并比较所述第一队列写指针的值和所述第一队列读指针的值是否相同;若不同,则从所述第一队列写指针或所述第一队列读指针所在的第一队列中获取所述第三内存地址;
所述通过所述第三内存将所述第二数据信息传输给所述数据传输装置,包括:
将所述第三内存的地址加入第二队列,以使所述数据传输装置通过所述第二队列获取所述第三内存的地址。
第三方面,本发明实施例提供了一种数据传输装置,包括:内存管理单元、信息确定单元、发送单元以及获取单元;其中,
内存管理单元,用于在接收Java应用程序的内存申请请求时,为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存,所述第一内存为物理地址连续的内存空间;
信息确定单元,用于确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息,所述第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度;
发送单元,用于向加速器发送所述信息确定单元确定出的所述第一数据信息,以使所述加速器根据所述第一数据信息提取所述目标数据;
获取单元,用于接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。
其中,所述第一内存是所述Java应用程序和所述数据传输装置均能访问的物理地址连续的内存空间。可选的,所述第一内存可以是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,所述第一内存还可以是预设的固定长度的内存空间。该数据传输装置可通过调用操作系统如Linux系统中的用户程序库userlibrary中的程序指令来进行操作。
在一些实施例中,所述装置还包括:
封装单元,用于以共享内存的方式将所述第一内存封装为缓冲区ByteBuffer对象,并将所述ByteBuffer对象返回给所述Java应用程序。以使Java应用程序根据该ByteBuffer对象将需要计算的目标数据写入该第一内存中,并向数据传输装置返回写入了目标数据后的ByteBuffer对象及该目标数据的长度。信息确定单元根据Java应用程序返回的ByteBuffer对象确定出该目标数据的内存地址,得到包括该目标数据的内存地址及该目标数据的长度的第一数据信息。
在一些实施例中,所述内存管理单元,还用于为所述Java应用程序分配第二内存,所述第二内存用于存放加速器对所述目标数据进行计算后得到的结果数据;
所述第一数据信息还包括所述第二内存的地址以及所述第二内存的长度;所述发送单元具体用于:
将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,以使所述加速器根据所述第三内存的地址从所述第三内存中获取所述第一数据信息;
所述获取单元具体用于:
从所述第三内存获取所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述结果数据。
进一步的,在一些实施例中,所述发送单元具体用于:
将所述第一数据信息写入第三内存,并将所述第三内存的地址加入第一队列,以使所述加速器通过所述第一队列获取所述第三内存的地址;
所述获取单元具体用于:
轮询第二队列读指针和第二队列写指针,并比较所述第二队列读指针的值和所述第二队列写指针的值是否相同;
若不同,则从所述第二队列读指针或所述第二队列写指针所在的第二队列中获取所述第三内存的地址,并根据所述第三内存的地址从所述第三内存中获取第二数据信息,所述第二数据信息包括所述结果数据的内存地址以及所述结果数据的长度;
将所述第二数据信息传输给所述Java应用程序,以使所述Java应用程序根据所述第二数据信息获取所述结果数据。
其中,所述获取单元将所述第二数据信息传输给所述Java应用程序的具体方式可以为:将所述第二数据信息封装为ByteBuffer对象,并将该ByteBuffer对象传输给所述Java应用程序,以使所述Java应用程序根据所述ByteBuffer对象获取所述结果数据。
第四方面,本发明实施例还提供了一种加速器,包括:信息接收单元、数据获取单元、计算单元以及信息发送单元;其中,
信息接收单元,用于接收数据传输装置发送的第一数据信息,所述第一数据信息包括需要计算的目标数据的内存地址、所述目标数据的长度、用于存放所述目标数据对应的结果数据的第二内存的地址以及所述第二内存的长度,且所述目标数据的内存地址对应的第一内存和所述第二内存为物理地址连续的内存空间;
数据获取单元,用于根据所述目标数据的内存地址以及所述目标数据的长度提取所述目标数据;
计算单元,用于对所述目标数据进行计算,得到所述计算后的结果数据,并根据所述第二内存的地址以及所述第二内存的长度将所述结果数据写入所述第二内存;
信息发送单元,用于获取所述结果数据的内存地址和所述结果数据的长度,并向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,以根据所述第二数据信息获取所述结果数据。
在一些实施例中,所述信息接收单元具体用于:
接收数据传输装置发送的第三内存的地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息,所述第三内存为所述数据传输装置和所述加速器均能访问的内存空间;
所述信息发送单元具体用于:
获取所述结果数据的内存地址和所述结果数据的长度,将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中,并通过所述第三内存将所述第二数据信息传输给所述数据传输装置。
进一步的,在一些实施例中,所述信息接收单元具体用于:
轮询第一队列写指针及第一队列读指针,并比较所述第一队列写指针的值和所述第一队列读指针的值是否相同;
若不同,则从所述第一队列写指针或所述第一队列读指针所在的第一队列中获取所述第三内存地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息;
所述信息发送单元具体用于:
获取所述结果数据的内存地址和所述结果数据的长度,并将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中;
将所述第三内存的地址加入第二队列,以使所述数据传输装置通过所述第二队列获取所述第三内存的地址。
第五方面,本发明实施例还提供了一种计算机存储介质,所述计算机存储介质存储有程序,所述程序执行时包括上述第一方面的数据传输方法的部分或全部的步骤。
第六方面,本发明实施例还提供了一种计算机存储介质,所述计算机存储介质存储有程序,所述程序执行时包括上述第二方面的数据传输方法的部分或全部的步骤。
第七方面,本发明实施例提供了一种数据传输设备,包括:通信接口、存储器和处理器,所述处理器分别与所述通信接口和存储器连接;其中,
所述存储器用于存储驱动软件;
所述处理器从所述存储器读取所述驱动软件并在所述驱动软件的作用下执行上述第一方面的数据传输方法的部分或全部的步骤。
第八方面,本发明实施例还提供了一种加速器,包括:通信接口、存储器和处理器,所述处理器分别与所述通信接口和存储器连接;其中,
所述存储器用于存储驱动软件;
所述处理器从所述存储器读取所述驱动软件并在所述驱动软件的作用下执行上述第二方面的数据传输方法的部分或全部的步骤。
与现有技术相比,本发明实施例具有以下有益效果:
在本发明实施例中,可在接收到Java应用程序的内存申请请求时,通过为该Java应用程序分配物理地址连续的内存,使得Java应用程序通过将需要计算的目标数据写入该内存,并确定出包括该目标数据的内存地址及长度信息的数据信息传输给加速器,以使加速器根据该数据信息提取出目标数据,并对该目标数据进行计算,得到该目标数据对应的结果数据,从而能够通过提升Java应用程序与加速器之间的数据传输效率,实现提升数据的加速性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是现有技术中的一种硬件加速方式的示意图;
图2是本发明实施例提供的一种数据传输方法的流程示意图;
图3是本发明实施例提供的一种数据传输方法的交互示意图;
图4是本发明实施例提供的一种数据传输方法的应用场景图;
图5是本发明实施例提供的一种BD队列的结构示意图;
图6是本发明实施例提供的一种指针示意图;
图7是本发明实施例提供的一种数据传输装置的结构示意图;
图8是本发明实施例提供的一种加速器的结构示意图;
图9是本发明实施例提供的一种数据传输设备的结构示意图;
图10是本发明实施例提供的另一种加速器的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
应理解,本发明实施例涉及的“第一”、“第二”和“第三”等是用于区别不同对象,而非用于描述特定顺序。此外,术语“包括”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
应理解,本发明实施例所涉及的技术方案可具体应用于各种操作系统(OperatingSystem,简称为“OS”),如Linux系统中,该操作系统中包括用户态、内核态等多种运行级别,Java应用程序(Application,APP)可运行于该操作系统中。进一步的,该操作系统可运行于各种数据传输设备中,该数据传输设备包括但不限于智能手机(如Android手机、iOS手机等)、平板电脑、移动互联网设备(MobileInternetDevices,简称“MID”)、个人电脑等等。
请参见图2,图2是本发明实施例提供的一种数据传输方法的流程示意图,具体的,如图2所示,本发明实施例的所述数据传输方法可包括以下步骤:
101、接收Java应用程序的内存申请请求。
需要说明的是,本发明实施例的所述方法可具体在操作系统如Linux的用户态下实施,本发明实施例以用户程序库userlibrary对应的数据传输装置的角度对该方法进行描述,也即该数据传输装置可通过调用该userlibrary中的程序指令来进行操作。
应理解,本发明实施例的Java应用程序和userlibrary均处于用户态下。该userlibrary是一种库,其为Java应用程序提供具体的API接口,用于实现申请内存、传输数据、接收结果等,该API接口基于Java本地接口(JNI)实现。
102、响应所述内存申请请求,为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存。
其中,所述第一内存是所述Java应用程序和该数据传输装置(也即userlibrary)均能访问的物理地址连续的内存空间。该第一内存可以是在Linux内核引导阶段预留的内存,该部分预留的内存不受系统管理且物理地址连续。将该段内存映射到用户态,可对该部分内存进行自行管理,同时避免了操作系统OS管理带来的内存碎片导致运行慢等问题。
进一步的,该为Java应用程序分配的第一内存可被封装为ByteBuffer对象并返回给该Java应用程序。其中,该ByteBuffer对象为Java应用程序能够识别的对象,从而Java应用程序能够访问该ByteBuffer对象,并通过该ByteBuffer对象访问到该第一内存,以便于该Java应用程序将需要计算的目标数据写入该第一内存中。
103、确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息。
其中,所述第一数据信息可包括所述目标数据的内存地址以及所述目标数据的长度信息。
具体实施例中,Java应用程序在获取到该数据传输装置为其分配的第一内存即ByteBuffer对象之后,即可将需要加速(计算)的数据即目标数据写入该ByteBuffer对应的第一内存中,并可以以“传对象+传参数”的形式将ByteBuffer对象及该目标数据的有效长度信息传输到数据传输装置。数据传输装置在接收到该ByteBuffer对象及该目标数据的长度信息之后,即可根据该ByteBuffer对象确定出该目标数据的内存地址(可以与该第一内存的地址相同)以及该目标数据的长度,也即该目标数据对应的第一数据信息。
104、向加速器发送所述第一数据信息,以使所述加速器根据所述第一数据信息提取所述目标数据。
105、接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。
具体实施例中,数据传输装置在获取到该包括目标数据的内存地址及长度信息的第一数据信息之后,即可将该第一数据信息传输给加速器以对目标数据进行加速,比如按照协议格式将该第一数据信息写入BD队列中,以通知加速器获取该目标数据。进一步的,该加速器接收到该第一数据信息,并根据该第一数据信息获取该目标数据,对该目标数据进行计算之后,得到该目标数据对应的结果数据并进行存储之后,则可将用于指示该结果数据的存储位置的信息即第二数据信息返回给数据传输装置,如通过写入该BD队列通知数据传输装置获取该第二数据信息。其中,该BD队列所在的内存即BD内存为该用户态和加速器之间所共享的内存,即该用户态和该加速器均可访问该BD内存空间。
进一步的,在获取得到该第二数据信息之后,数据传输装置即可将其传输给Java应用程序,Java应用程序即可根据该第二数据信息获取该目标数据对应的结果数据。
在本发明实施例中,可在接收到Java应用程序的内存申请请求时,通过为该Java应用程序分配物理地址连续的内存,使得Java应用程序通过将需要计算的目标数据写入该内存,在确定出包括该目标数据的内存地址及长度信息的数据信息之后将该数据信息传输给加速器,以使加速器根据该数据信息提取出目标数据,并对该目标数据进行计算,得到该目标数据对应的结果数据,从而能够通过提升Java应用程序与加速器之间的数据传输效率,实现提升数据的加速性能。
进一步的,请参见图3,图3是本发明实施例提供的一种数据传输方法的交互示意图,具体的,如图3所示,本发明实施例的所述数据传输方法可包括以下步骤:
201、发送内存申请请求。
具体实施例中,在用户态下,需要对Java应用程序中的待计算数据进行加速时,Java应用程序即可通过Java本地接口即JNI向userlibrary发送内存申请请求,以请求userlibrary(即对应上述的数据传输装置)根据为该Java应用程序分配内存。可选的,该内存申请请求中可携带需要计算的数据即目标数据的长度信息。
202、为Java应用程序分配第一内存,并将该第一内存封装为ByteBuffer。
203、返回ByteBuffer。
具体的,请一并结合图4,userlibrary可在Linux内核引导阶段进行内存预留(预留大内存),该预留的内存可以不受系统管理且物理地址连续,通过将该段内存映射到userlibrary,可对该部分内存进行自行管理。当userlibrary接收到Java应用程序发送的内存申请请求时,userlibrary即可从该预留的内存中为该Java应用程序分配内存,即第一内存,并可进一步以共享内存的方式将该第一内存封装为缓冲区ByteBuffer对象,如通过Java的新输入输出(NewInputOutput,简称为“NIO”)机制将该第一内存封装为ByteBuffer对象(简称ByteBuffer),并将该ByteBuffer返回给所述Java应用程序。也就是说,所述第一内存是所述Java应用程序和所述userlibrary均能访问的物理地址连续的内存空间。应理解,将内存封装成ByteBuffer对象的目的是实现C程序语言(userlibrary使用的程序语言)及java程序语言之间内存的共享,因在java程序中,其内存的访问是通过Java虚拟机(JavaVirtualMachine,简称为“JVM”)来实现的。
可选的,所述第一内存可以是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,所述第一内存还可以是预设的固定长度的内存空间,本发明实施例不做限定。
204、将需要计算的目标数据写入ByteBuffer。
205、返回写入了目标数据的ByteBuffer以及该目标数据的长度信息。
具体实施例中,Java应用程序在接收到userlibrary响应该内存申请请求返回的ByteBuffer之后,即可将需要计算的目标数据依次写入该ByteBuffer,具体可通过Java的NIOAPI写入该ByteBuffer。进一步的,在写入该目标数据之后,Java应用程序还可确定出该目标数据的内存地址以及该目标数据的长度信息等等,并可通过JNI将写入了该目标数据的ByteBuffer及其长度信息传输给userlibrary,即以“传对象+传参数”的形式将ByteBuffer及其长度信息传输到userlibrary,从而实现了该阶段的数据零拷贝。userlibrary根据该Java应用程序返回的ByteBuffer及其长度信息确定出目标数据的内存地址和该目标数据的长度信息。
进一步可选的,若该分配的第一内存较大,则还可等待将该第一内存即ByteBuffer写满后,再通过JNI将该ByteBuffer及其长度信息传输给userlibrary。
206、为该Java应用程序分配第二内存,并将包括目标数据的内存地址和长度、第二内存的地址和长度的第一数据信息写入第三内存。
具体的,userlibrary确定出该目标数据的内存地址及长度信息之后,还可为该目标数据也即为该Java应用程序分配第二内存。该第二内存同样从该预留的内存中分配得到,用于存放加速器如FPGA加速器对目标数据进行计算后得到的结果数据。该FPGA加速器通过硬件并行运算的方式,使得在每个时钟周期内能够完成更多的处理任务,且具有良好的可编辑性,因此,通过该FPGA加速器进行加速的方式是一个高效且具备编程灵活性的硬件加速方案。
进一步的,还可在内核态申请第三内存,该第三内存为所述userlibrary和所述加速器均能访问的内存空间。则userlibrary可根据协议格式将包括该目标数据的内存地址、该目标数据的长度、该第二内存的地址(又称“结果地址”)以及该第二内存的长度的第一数据信息写入该第三内存中,并将该第三内存的地址信息配置到加速器,如通过将该第三内存的地址加入发送队列如BD队列来通知加速器该第三内存的地址,从而实现该第三内存在userlibrary与加速器之间实现内存共享。如图5所示,图5为一种基于BD内存的发送队列的结构示意图。其中,Operand即对应上述的第三内存,即可将目标数据(即对应图5中的Src_data)的地址和长度、第二内存(即对应图5中的Result_data)的地址和长度写入Operand。此外,Operand里面还可能还包括一些运算的配置信息,此处不再赘述,从而可将Operand即第三内存的地址和长度写入到BD中去。该BD为队列内存的一部分,其队列内存为物理地址连续的内存空间。
207、移动发送队列写指针。
208、轮询发送队列写指针及发送队列读指针,获取目标数据并计算得到结果数据,将该结果数据写入第二内存,将包括结果数据的内存地址和长度的第二数据信息写入第三内存。
具体的,如图6所示,该userlibrary对应的中央处理器(CentralProcessingUnit,CPU)及加速器如FPGA加速器共同维护四个指针,包括发送队列写指针、发送队列读指针、接收队列写指针及接收队列读指针。其中,CPU维护发送队列写指针及接收队列读指针;加速器维护发送队列读指针及接收队列写指针。可选的,该移动发送队列写指针可以具体指增加该发送队列写指针的值,如每次增加1,以通知加速器从BD队列获取需要计算的目标数据。
进一步的,加速器如FPGA加速器可轮询发送队列写指针及发送队列读指针,并比较所述接收队列读指针的值和所述接收队列写指针的值是否相同。当二者值不相同时,即可表明发送队列(即上述的第一队列)中含有可用的BD数据(即该写入了第一数据信息的第三内存的地址),则可从发送队列首地址进行相应的内存偏移,获取封装有第一数据信息的队列内存部分,从而获取得到该第三内存的地址,即上述图5的Operand的地址,并根据该第三内存的地址从该第三内存中获取得到该第一数据信息,继而可将该目标数据的内存地址、该目标数据的长度信息、该第二内存的地址以及该第二内存的长度信息解析出来。从而FPGA加速器可根据该目标数据的内存地址以及该目标数据的长度信息提取出该目标数据,并对该目标数据进行计算,得到所述计算后的结果数据,并根据该第二内存的地址以及该第二内存的长度信息将所述结果数据写入该第二内存中。进一步的,将结果数据写入该第二内存后,还可更新结果数据长度域,也即,重新获取该结果数据的内存地址(可与该第二内存的地址相同)和结果数据的长度。其中,该目标数据可以是以直接内存访问(DirectMemoryAccess,简称为“DMA”)传输方式获取得到的。其中,该提取目标数据的方式可以是通过在PCIE(PeripheralComponentInterfaceExpress)总线执行DMA读操作实现的。
209、移动接收队列写指针。
210、轮询接收队列写指针及接收队列读指针,获取第二数据信息。
进一步的,FPGA加速器在确定出该结果数据的内存地址和该结果数据的长度信息之后,即可向userlibrary返回包括该结果数据的内存地址和该结果数据的长度信息的第二数据信息,以根据所述第二数据信息获取所述结果数据。具体的,该FPGA加速器可将该第二数据信息以协议格式写入该第三内存(或者加速器与userlibrary协商的其他内存中),并加入接收队列,增加接收队列写指针的值,以通知userlibrary从该接收队列中获取该第三内存的地址,从而从该第三内存中获取该第二数据信息,该阶段也实现了数据的零拷贝。
具体的,userlibrary可轮询接收队列读指针及写指针,并比较所述接收队列读指针的值和所述接收队列写指针的值是否相同。当二者值不相同时,即可表明接收队列(即上述的第二队列)中含有可用的BD数据即写入了该第二数据信息的第三内存的地址,则可从接收队列首地址进行相应的内存偏移,从而从该接收队列中获取得到该第三内存的地址,并从该第三内存的地址中获取该第二数据信息,继而可解析得到该结果数据的内存地址和该结果数据的长度信息。
211、返回该第二数据信息。
212、根据第二数据信息获取结果数据。
具体实施例中,userlibrary获取得到该第二数据信息之后,即可将该第二数据信息传输给该Java应用程序。具体的,如图4所示,userlibrary可通过将该第二数据信息封装为ByteBuffer对象,通过JNI接口将该ByteBuffer对象传输给Java应用程序,以将该第二数据信息传输给该Java应用程序。
进一步的,该Java应用程序在获取该第二数据信息之后,即可根据该结果数据的内存地址和该结果数据的长度信息,从用于存放结果数据的第二内存中获取该目标数据对应的结果数据,即该加速器对该目标数据进行计算后得到的数据。该阶段同样实现了数据的零拷贝。
在本发明实施例中,userlibrary可通过预留物理地址连续的内存,使得在接收到Java应用程序的内存申请请求时,能够从该预留的内存中为该Java应用程序分配第一内存,并通过共享内存方式将该第一内存封装为ByteBuffer对象给Java应用层使用,使得Java应用程序能够将需要计算的目标数据写入该ByteBuffer对象中,并以“传对象(地址)+传长度”的方式将该ByteBuffer对象即目标数据的地址及其长度信息返回给userlibrary。此外,userlibrary还可为该Java应用程序分配用于存放结果数据的第二内存,并将包括该目标数据的地址及长度、第二内存的地址和长度的数据信息传输给加速器,以使加速器根据数据信息获取目标数据并计算出结果数据,并将该结果数据的信息返回给userlibrary,以根据该结果数据的信息获取该结果数据,从而实现了该Java应用程序到加速器之间的数据零拷贝,使得提升了Java应用程序与加速器之间的数据传输效率,并提升了数据的加速性能。
请参见图7,图7是本发明实施例提供的一种数据传输装置的结构示意图,具体的,如图7所示,本发明实施例的所述数据传输装置可包括内存管理单元11、信息确定单元12、发送单元13以及获取单元14。其中,
所述内存管理单元11,用于在接收Java应用程序的内存申请请求时,为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存。
其中,该第一内存是Java应用程序和该数据传输装置均能访问的物理地址连续的内存空间。该第一内存可以是在Linux内核引导阶段预留的内存,该部分预留的内存不受系统管理且物理地址连续。
可选的,所述第一内存可以是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,所述第一内存还可以是预设的固定长度的内存空间。其中,所述第一内存为该数据传输装置和该Java应用程序均能访问的物理地址连续的内存空间。
所述信息确定单元12,用于确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息。
其中,所述第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度。
所述发送单元13,用于向加速器发送所述信息确定单元12确定出的所述第一数据信息,以使所述加速器根据所述第一数据信息提取所述目标数据。
所述获取单元14,用于接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。
具体的,发送单元13向加速器发送该第一数据信息之后,即可通知获取单元14准备接收该加速器针对该第一数据信息返回的第二数据信息。
进一步的,在本发明实施例中,所述装置还可包括(图中未示出):
封装单元15,用于以共享内存的方式将所述第一内存封装为缓冲区ByteBuffer对象,并将所述ByteBuffer对象返回给所述Java应用程序。
具体的,该为Java应用程序分配的第一内存还可通过封装单元15封装为ByteBuffer对象并返回给该Java应用程序。其中,该ByteBuffer对象为Java应用程序能够识别的对象,从而Java应用程序能够访问该ByteBuffer对象,并通过该ByteBuffer对象访问到该第一内存,以便于该Java应用程序将需要计算的目标数据写入该第一内存中。
进一步的,在本发明实施例中,
所述内存管理单元11,还用于为所述Java应用程序分配第二内存,所述第二内存用于存放加速器对所述目标数据进行计算后得到的结果数据;
所述第一数据信息还包括所述第二内存的地址以及所述第二内存的长度;所述发送单元13可具体用于:
将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,以使所述加速器根据所述第三内存的地址从所述第三内存中获取所述第一数据信息;
所述获取单元14可具体用于:
从所述第三内存获取所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述结果数据。
其中,该第三内存该数据传输装置和所述加速器均能访问的内存空间。
进一步可选的,在本发明实施例中,所述发送单元13可具体用于:
将所述第一数据信息写入第三内存,并将所述第三内存的地址加入第一队列,以使所述加速器通过所述第一队列获取所述第三内存的地址;
所述获取单元14可具体用于:
轮询第二队列读指针和第二队列写指针,并比较所述第二队列读指针的值和所述第二队列写指针的值是否相同;
若不同,则从所述第二队列读指针或所述第二队列写指针所在的第二队列中获取所述第三内存的地址,并根据所述第三内存的地址从所述第三内存中获取第二数据信息,所述第二数据信息包括所述结果数据的内存地址以及所述结果数据的长度;
将所述第二数据信息传输给所述Java应用程序,以使所述Java应用程序根据所述第二数据信息获取所述结果数据。
进一步的,获取单元14在获取得到该第二数据信息之后,即可将其传输给Java应用程序,比如可通过将该第二数据信息封装为ByteBuffer对象,通过JNI接口将该ByteBuffer对象传输给Java应用程序,以将该第二数据信息传输给该Java应用程序。Java应用程序即可根据该第二数据信息获取该目标数据对应的结果数据。
请参见图8,图8是本发明实施例提供的一种加速器的结构示意图,具体的,如图8所示,本发明实施例的所述数据传输装置可包括信息接收单元21、数据获取单元22、计算单元23以及信息发送单元24。其中,
所述信息接收单元21,用于接收数据传输装置发送的第一数据信息,所述第一数据信息包括需要计算的目标数据的内存地址、所述目标数据的长度、用于存放所述目标数据对应的结果数据的第二内存的地址以及所述第二内存的长度,且所述目标数据的内存地址对应的第一内存和所述第二内存为物理地址连续的内存空间;
所述数据获取单元22,用于根据所述信息接收单元21接收到的所述第一数据信息中的所述目标数据的内存地址以及所述目标数据的长度提取所述目标数据;
所述计算单元23,用于对所述目标数据进行计算,得到所述计算后的结果数据,并根据所述第二内存的地址以及所述第二内存的长度将所述结果数据写入所述第二内存;
所述信息发送单元24,用于获取所述结果数据的内存地址和所述结果数据的长度,并向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,以根据所述第二数据信息获取所述结果数据。
其中,本发明实施例的所述加速器可以是FPGA加速器或其他加速器,本发明实施例不做限定。
可选的,在本发明实施例中,所述信息接收单元21可具体用于:
接收数据传输装置发送的第三内存的地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息,所述第三内存为所述数据传输装置和所述加速器均能访问的内存空间;
所述信息发送单元24可具体用于:
获取所述结果数据的内存地址和所述结果数据的长度,将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中,并通过所述第三内存将所述第二数据信息传输给所述数据传输装置。
进一步可选的,在本发明实施例中,所述信息接收单元21可具体用于:
轮询第一队列写指针及第一队列读指针,并比较所述第一队列写指针的值和所述第一队列读指针的值是否相同;
若不同,则从所述第一队列写指针或所述第一队列读指针所在的第一队列中获取所述第三内存地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息;
所述信息发送单元24可具体用于:
获取所述结果数据的内存地址和所述结果数据的长度,并将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中;
将所述第三内存的地址加入第二队列,以使所述数据传输装置通过所述第二队列获取所述第三内存的地址。
具体的,加速器如FPGA加速器可通过信息接收单元21轮询发送队列写指针及发送队列读指针,并比较所述接收队列读指针的值和所述接收队列写指针的值是否相同。当二者值不相同时,即可表明发送队列(即上述的第一队列)中含有可用的BD数据(即该写入了第一数据信息的第三内存的地址),则可从发送队列中获取得到该第三内存的地址,并从该第三内存中获取得到该第一数据信息,继而可将该目标数据的内存地址、该目标数据的长度信息、该第二内存的地址以及该第二内存的长度信息解析出来。从而数据获取单元22可根据该目标数据的内存地址以及该目标数据的长度信息提取出该目标数据,并通过计算单元23对该目标数据进行计算,得到所述计算后的结果数据。信息发送单元24则可根据该第二内存的地址以及该第二内存的长度信息将所述结果数据写入该第二内存中。进一步的,信息发送单元24将结果数据写入该第二内存后,还可更新结果数据长度域,也即,重新获取该结果数据的内存地址(可与该第二内存的地址相同)和结果数据的长度,并可向数据传输装置返回包括该结果数据的内存地址和该结果数据的长度信息的第二数据信息,以根据所述第二数据信息获取所述结果数据。
在本发明实施例中,userlibrary可通过预留物理地址连续的内存,使得在接收到Java应用程序的内存申请请求时,能够从该预留的内存中为该Java应用程序分配第一内存,并通过共享内存方式将该第一内存封装为ByteBuffer对象给Java应用层使用,使得Java应用程序能够将需要计算的目标数据写入该ByteBuffer对象中,并以“传对象(地址)+传长度”的方式将该ByteBuffer对象即目标数据的地址及其长度信息返回给userlibrary。此外,userlibrary还可为该Java应用程序分配用于存放结果数据的第二内存,并将包括该目标数据的地址及长度、第二内存的地址和长度的数据信息传输给加速器,以使加速器根据数据信息获取目标数据并计算出结果数据,并将该结果数据的信息返回给userlibrary,以根据该结果数据的信息获取该结果数据,从而实现了该Java应用程序到加速器之间的数据零拷贝,使得提升了Java应用程序与加速器之间的数据传输效率,并提升了数据的加速性能。
请参见图9,是本发明实施例提供的一种数据传输设备的结构示意图,具体的,本发明实施例的所述数据传输设备用于执行上述的数据传输方法,操作系统如Linux系统可运行于该数据传输设备中。如图9所示,本发明实施例的所述数据传输设备包括:通信接口300、存储器200和处理器100,所述处理器100分别与所述通信接口300及所述存储器200连接。所述存储器200可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。所述通信接口300、存储器200以及处理器100之间可以通过总线进行数据连接,也可以通过其他方式数据连接。本实施例中以总线连接进行说明。该数据传输设备与上述的数据传输装置相对应。其中,
所述存储器200用于存储驱动软件;
所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件的作用下执行:
通过所述通信接口300接收Java应用程序的内存申请请求;
响应所述内存申请请求,为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存,所述第一内存为物理地址连续的内存空间;
确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息,所述第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度;
通过所述通信接口300向加速器发送所述第一数据信息,以使所述加速器根据所述第一数据信息提取所述目标数据;
通过所述通信接口300接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。
可选的,所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件下执行所述为所述Java应用程序分配第一内存之后,还用于执行以下步骤:
以共享内存的方式将所述第一内存封装为缓冲区ByteBuffer对象,并将所述ByteBuffer对象返回给所述Java应用程序。
可选的,所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件下执行所述向加速器发送所述第一数据信息之前,还用于执行以下步骤:
为所述Java应用程序分配第二内存,所述第二内存用于存放加速器对所述目标数据进行计算后得到的结果数据;
所述第一数据信息还包括所述第二内存的地址以及所述第二内存的长度;所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件下执行所述向加速器发送所述第一数据信息,具体执行以下步骤:
将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,以使所述加速器根据所述第三内存的地址从所述第三内存中获取所述第一数据信息;
所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件下执行所述接收所述加速器返回的第二数据信息,具体执行以下步骤:
从所述第三内存获取所述加速器返回的第二数据信息。
进一步可选的,所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件下执行所述将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,具体执行以下步骤:
将所述第一数据信息写入第三内存,并将所述第三内存的地址加入第一队列,以使所述加速器通过所述第一队列获取所述第三内存的地址;
所述处理器100从所述存储器200读取所述驱动软件并在所述驱动软件下执行所述从所述第三内存获取所述加速器返回的第二数据信息,具体执行以下步骤:
轮询第二队列读指针和第二队列写指针,并比较所述第二队列读指针的值和所述第二队列写指针的值是否相同;
若不同,则从所述第二队列读指针或所述第二队列写指针所在的第二队列中获取所述第三内存的地址,并根据所述第三内存的地址从所述第三内存中获取第二数据信息,所述第二数据信息包括所述结果数据的内存地址以及所述结果数据的长度;
将所述第二数据信息传输给所述Java应用程序,以使所述Java应用程序根据所述第二数据信息获取所述结果数据。
可选的,所述第一内存是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,
所述第一内存是预设的固定长度的内存空间。
该数据传输设备与上述的数据传输装置相对应,具体请参见图1-8中对应实施例的相关描述,此处不再赘述。
进一步的,请参见图10,图10是本发明实施例提供的另一种加速器的结构示意图,具体的,如图10所示,本发明实施例的所述加速器包括:通信接口600、存储器500和处理器400,所述处理器400分别与所述通信接口600及所述存储器500连接。所述存储器500可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。所述通信接口600、存储器500以及处理器400之间可以通过总线进行数据连接,也可以通过其他方式数据连接。本实施例中以总线连接进行说明。其中,
所述存储器500用于存储驱动软件;
所述处理器400从所述存储器500读取所述驱动软件并在所述驱动软件的作用下执行:
通过所述通信接口600接收数据传输装置发送的第一数据信息,所述第一数据信息包括需要计算的目标数据的内存地址、所述目标数据的长度、用于存放所述目标数据对应的结果数据的第二内存的地址以及所述第二内存的长度,且所述目标数据的内存地址对应的第一内存和所述第二内存为物理地址连续的内存空间;
根据所述目标数据的内存地址以及所述目标数据的长度提取所述目标数据;
对所述目标数据进行计算,得到所述计算后的结果数据,并根据所述第二内存的地址以及所述第二内存的长度将所述结果数据写入所述第二内存;
获取所述结果数据的内存地址和所述结果数据的长度,并通过所述通信接口600向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,以根据所述第二数据信息获取所述结果数据。
可选的,所述处理器400从所述存储器500读取所述驱动软件并在所述驱动软件的作用下执行所述接收数据传输装置发送的第一数据信息,具体执行以下步骤:
通过所述通信接口600接收数据传输装置发送的第三内存的地址,并根据所述第三内存的地址从所述第三内存获取所述数据传输装置发送的第一数据信息,所述第三内存为所述数据传输装置和所述加速器均能访问的内存空间;
所述处理器400从所述存储器500读取所述驱动软件并在所述驱动软件的作用下执行所述向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,具体执行以下步骤:
将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中,并通过所述第三内存将所述第二数据信息传输给所述数据传输装置。
进一步可选的,所述处理器400从所述存储器500读取所述驱动软件并在所述驱动软件的作用下执行所述接收数据传输装置发送的第三内存的地址,具体执行以下步骤:
轮询第一队列写指针及第一队列读指针,并比较所述第一队列写指针的值和所述第一队列读指针的值是否相同;
若不同,则从所述第一队列写指针或所述第一队列读指针所在的第一队列中获取所述第三内存地址;
所述处理器400从所述存储器500读取所述驱动软件并在所述驱动软件的作用下执行所述通过所述第三内存将所述第二数据信息传输给所述数据传输装置,具体执行以下步骤:
将所述第三内存的地址加入第二队列,以使所述数据传输装置通过所述第二队列获取所述第三内存的地址。
具体的,该加速器的描述可具体参照图1-8中对应实施例的相关描述,此处不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述该作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(RandomAccessMemory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能单元的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元完成,即将装置的内部结构划分成不同的功能单元,以完成以上描述的全部或者部分功能。上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (16)
1.一种数据传输方法,其特征在于,包括:
接收Java应用程序的内存申请请求;
响应所述内存申请请求,为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存,所述第一内存为物理地址连续的内存空间;
确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息,所述第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度;
向加速器发送所述第一数据信息,以使所述加速器根据所述第一数据信息提取所述目标数据;
接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。
2.根据权利要求1所述的方法,其特征在于,在所述为所述Java应用程序分配第一内存之后,所述方法还包括:
以共享内存的方式将所述第一内存封装为缓冲区ByteBuffer对象,并将所述ByteBuffer对象返回给所述Java应用程序。
3.根据权利要求1或2所述的方法,其特征在于,在所述向加速器发送所述第一数据信息之前,所述方法还包括:
为所述Java应用程序分配第二内存,所述第二内存用于存放加速器对所述目标数据进行计算后得到的结果数据;
所述第一数据信息还包括所述第二内存的地址以及所述第二内存的长度;所述向加速器发送所述第一数据信息,包括:
将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,以使所述加速器根据所述第三内存的地址从所述第三内存中获取所述第一数据信息;
所述接收所述加速器返回的第二数据信息,包括:
从所述第三内存获取所述加速器返回的第二数据信息。
4.根据权利要求3所述的方法,其特征在于,所述将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,包括:
将所述第一数据信息写入第三内存,并将所述第三内存的地址加入第一队列,以使所述加速器通过所述第一队列获取所述第三内存的地址;
所述从所述第三内存获取所述加速器返回的第二数据信息,包括:
轮询第二队列读指针和第二队列写指针,并比较所述第二队列读指针的值和所述第二队列写指针的值是否相同;
若不同,则从所述第二队列读指针或所述第二队列写指针所在的第二队列中获取所述第三内存的地址,并根据所述第三内存的地址从所述第三内存中获取第二数据信息,所述第二数据信息包括所述结果数据的内存地址以及所述结果数据的长度;
将所述第二数据信息传输给所述Java应用程序,以使所述Java应用程序根据所述第二数据信息获取所述结果数据。
5.根据权利要求1所述的方法,其特征在于,
所述第一内存是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,
所述第一内存是预设的固定长度的内存空间。
6.一种数据传输方法,其特征在于,应用于加速器中,包括:
接收数据传输装置发送的第一数据信息,所述第一数据信息包括需要计算的目标数据的内存地址、所述目标数据的长度、用于存放所述目标数据对应的结果数据的第二内存的地址以及所述第二内存的长度,且所述目标数据的内存地址对应的第一内存和所述第二内存为物理地址连续的内存空间;
根据所述目标数据的内存地址以及所述目标数据的长度提取所述目标数据;
对所述目标数据进行计算,得到所述计算后的结果数据,并根据所述第二内存的地址以及所述第二内存的长度将所述结果数据写入所述第二内存;
获取所述结果数据的内存地址和所述结果数据的长度,并向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,以根据所述第二数据信息获取所述结果数据。
7.根据权利要求6所述的方法,其特征在于,所述接收数据传输装置发送的第一数据信息,包括:
接收数据传输装置发送的第三内存的地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息,所述第三内存为所述数据传输装置和所述加速器均能访问的内存空间;
所述向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,包括:
将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中,并通过所述第三内存将所述第二数据信息传输给所述数据传输装置。
8.根据权利要求7所述的方法,其特征在于,所述接收数据传输装置发送的第三内存的地址,包括:
轮询第一队列写指针及第一队列读指针,并比较所述第一队列写指针的值和所述第一队列读指针的值是否相同;
若不同,则从所述第一队列写指针或所述第一队列读指针所在的第一队列中获取所述第三内存地址;
所述通过所述第三内存将所述第二数据信息传输给所述数据传输装置,包括:
将所述第三内存的地址加入第二队列,以使所述数据传输装置通过所述第二队列获取所述第三内存的地址。
9.一种数据传输装置,其特征在于,包括:
内存管理单元,用于在接收Java应用程序的内存申请请求时,为所述Java应用程序分配第一内存,以使所述Java应用程序将需要计算的目标数据写入所述第一内存,所述第一内存为物理地址连续的内存空间;
信息确定单元,用于确定所述Java应用程序将所述目标数据写入所述第一内存后的第一数据信息,所述第一数据信息包括所述目标数据的内存地址以及所述目标数据的长度;
发送单元,用于向加速器发送所述信息确定单元确定出的所述第一数据信息,以使所述加速器根据所述第一数据信息提取所述目标数据;
获取单元,用于接收所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述加速器对所述目标数据计算后得到的结果数据。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括:
封装单元,用于以共享内存的方式将所述第一内存封装为缓冲区ByteBuffer对象,并将所述ByteBuffer对象返回给所述Java应用程序。
11.根据权利要求9或10所述的装置,其特征在于,
所述内存管理单元,还用于为所述Java应用程序分配第二内存,所述第二内存用于存放加速器对所述目标数据进行计算后得到的结果数据;
所述第一数据信息还包括所述第二内存的地址以及所述第二内存的长度;所述发送单元具体用于:
将所述第一数据信息写入第三内存,并向加速器发送所述第三内存的地址,以使所述加速器根据所述第三内存的地址从所述第三内存中获取所述第一数据信息;
所述获取单元具体用于:
从所述第三内存获取所述加速器返回的第二数据信息,并根据所述第二数据信息获取所述结果数据。
12.根据权利要求11所述的装置,其特征在于,所述发送单元具体用于:
将所述第一数据信息写入第三内存,并将所述第三内存的地址加入第一队列,以使所述加速器通过所述第一队列获取所述第三内存的地址;
所述获取单元具体用于:
轮询第二队列读指针和第二队列写指针,并比较所述第二队列读指针的值和所述第二队列写指针的值是否相同;
若不同,则从所述第二队列读指针或所述第二队列写指针所在的第二队列中获取所述第三内存的地址,并根据所述第三内存的地址从所述第三内存中获取第二数据信息,所述第二数据信息包括所述结果数据的内存地址以及所述结果数据的长度;
将所述第二数据信息传输给所述Java应用程序,以使所述Java应用程序根据所述第二数据信息获取所述结果数据。
13.根据权利要求9所述的装置,其特征在于,
所述第一内存是根据所述目标数据的长度信息分配的与所述长度信息指示的长度相匹配的内存空间;或者,
所述第一内存是预设的固定长度的内存空间。
14.一种加速器,其特征在于,包括:
信息接收单元,用于接收数据传输装置发送的第一数据信息,所述第一数据信息包括需要计算的目标数据的内存地址、所述目标数据的长度、用于存放所述目标数据对应的结果数据的第二内存的地址以及所述第二内存的长度,且所述目标数据的内存地址对应的第一内存和所述第二内存为物理地址连续的内存空间;
数据获取单元,用于根据所述目标数据的内存地址以及所述目标数据的长度提取所述目标数据;
计算单元,用于对所述目标数据进行计算,得到所述计算后的结果数据,并根据所述第二内存的地址以及所述第二内存的长度将所述结果数据写入所述第二内存;
信息发送单元,用于获取所述结果数据的内存地址和所述结果数据的长度,并向所述数据传输装置返回包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息,以根据所述第二数据信息获取所述结果数据。
15.根据权利要求14所述的加速器,其特征在于,所述信息接收单元具体用于:
接收数据传输装置发送的第三内存的地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息,所述第三内存为所述数据传输装置和所述加速器均能访问的内存空间;
所述信息发送单元具体用于:
获取所述结果数据的内存地址和所述结果数据的长度,将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中,并通过所述第三内存将所述第二数据信息传输给所述数据传输装置。
16.根据权利要求15所述的加速器,其特征在于,所述信息接收单元具体用于:
轮询第一队列写指针及第一队列读指针,并比较所述第一队列写指针的值和所述第一队列读指针的值是否相同;
若不同,则从所述第一队列写指针或所述第一队列读指针所在的第一队列中获取所述第三内存地址,并根据所述第三内存的地址从所述第三内存获取第一数据信息;
所述信息发送单元具体用于:
获取所述结果数据的内存地址和所述结果数据的长度,并将包括所述结果数据的内存地址和所述结果数据的长度的第二数据信息写入所述第三内存中;
将所述第三内存的地址加入第二队列,以使所述数据传输装置通过所述第二队列获取所述第三内存的地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201511032093.7A CN105677491B (zh) | 2015-12-31 | 2015-12-31 | 一种数据传输方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201511032093.7A CN105677491B (zh) | 2015-12-31 | 2015-12-31 | 一种数据传输方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105677491A true CN105677491A (zh) | 2016-06-15 |
CN105677491B CN105677491B (zh) | 2019-07-23 |
Family
ID=56298435
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201511032093.7A Active CN105677491B (zh) | 2015-12-31 | 2015-12-31 | 一种数据传输方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105677491B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110022341A (zh) * | 2018-01-10 | 2019-07-16 | 腾讯科技(深圳)有限公司 | 一种数据传输方法及相关设备 |
CN110033780A (zh) * | 2019-04-07 | 2019-07-19 | 西安电子科技大学 | 基于FFmpeg和EMIF驱动的音视频数据传输方法 |
CN111813713A (zh) * | 2020-09-08 | 2020-10-23 | 苏州浪潮智能科技有限公司 | 数据加速运算处理方法、装置及计算机可读存储介质 |
WO2021164452A1 (zh) * | 2020-02-21 | 2021-08-26 | 苏州浪潮智能科技有限公司 | 一种主机端与fpga加速器之间的数据同步方法 |
CN116955219A (zh) * | 2023-09-13 | 2023-10-27 | 新华三信息技术有限公司 | 一种数据镜像方法、装置、主机及存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1266512A (zh) * | 1997-05-08 | 2000-09-13 | 艾瑞迪公司 | 适用于面向对象编程语言的硬件加速器 |
CN101950273A (zh) * | 2010-09-26 | 2011-01-19 | 中国人民解放军海军工程大学 | 一种dsp数据区动态管理方法 |
CN102521184A (zh) * | 2011-12-20 | 2012-06-27 | 北京遥测技术研究所 | 一种在pci总线上实现数据高速传输的方法 |
CN102750131A (zh) * | 2012-06-07 | 2012-10-24 | 中国科学院计算机网络信息中心 | 一种面向gpu的双调归并排序方法 |
US8654136B1 (en) * | 2010-02-19 | 2014-02-18 | Steve Rosenbluth | Memory paging system for real time motion data recording, editing, and playback |
CN104572205A (zh) * | 2015-01-12 | 2015-04-29 | 安一恒通(北京)科技有限公司 | 一种用于软件加速的方法和装置 |
-
2015
- 2015-12-31 CN CN201511032093.7A patent/CN105677491B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1266512A (zh) * | 1997-05-08 | 2000-09-13 | 艾瑞迪公司 | 适用于面向对象编程语言的硬件加速器 |
US8654136B1 (en) * | 2010-02-19 | 2014-02-18 | Steve Rosenbluth | Memory paging system for real time motion data recording, editing, and playback |
CN101950273A (zh) * | 2010-09-26 | 2011-01-19 | 中国人民解放军海军工程大学 | 一种dsp数据区动态管理方法 |
CN102521184A (zh) * | 2011-12-20 | 2012-06-27 | 北京遥测技术研究所 | 一种在pci总线上实现数据高速传输的方法 |
CN102750131A (zh) * | 2012-06-07 | 2012-10-24 | 中国科学院计算机网络信息中心 | 一种面向gpu的双调归并排序方法 |
CN104572205A (zh) * | 2015-01-12 | 2015-04-29 | 安一恒通(北京)科技有限公司 | 一种用于软件加速的方法和装置 |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110022341A (zh) * | 2018-01-10 | 2019-07-16 | 腾讯科技(深圳)有限公司 | 一种数据传输方法及相关设备 |
CN110022341B (zh) * | 2018-01-10 | 2022-01-25 | 腾讯科技(深圳)有限公司 | 一种数据传输方法及相关设备 |
CN110033780A (zh) * | 2019-04-07 | 2019-07-19 | 西安电子科技大学 | 基于FFmpeg和EMIF驱动的音视频数据传输方法 |
WO2021164452A1 (zh) * | 2020-02-21 | 2021-08-26 | 苏州浪潮智能科技有限公司 | 一种主机端与fpga加速器之间的数据同步方法 |
JP2022554039A (ja) * | 2020-02-21 | 2022-12-27 | ▲蘇▼州浪潮智能科技有限公司 | ホスト側とfpgaアクセラレータと間のデータ同期方法 |
JP7270113B2 (ja) | 2020-02-21 | 2023-05-09 | ▲蘇▼州浪潮智能科技有限公司 | ホスト側とfpgaアクセラレータと間のデータ同期方法 |
US11762790B2 (en) | 2020-02-21 | 2023-09-19 | Inspur Suzhou Intelligent Technology Co., Ltd. | Method for data synchronization between host side and FPGA accelerator |
CN111813713A (zh) * | 2020-09-08 | 2020-10-23 | 苏州浪潮智能科技有限公司 | 数据加速运算处理方法、装置及计算机可读存储介质 |
CN116955219A (zh) * | 2023-09-13 | 2023-10-27 | 新华三信息技术有限公司 | 一种数据镜像方法、装置、主机及存储介质 |
CN116955219B (zh) * | 2023-09-13 | 2024-01-19 | 新华三信息技术有限公司 | 一种数据镜像方法、装置、主机及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN105677491B (zh) | 2019-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10411953B2 (en) | Virtual machine fault tolerance method, apparatus, and system | |
CN108959127B (zh) | 地址转换方法、装置及系统 | |
CN105677491A (zh) | 一种数据传输方法及装置 | |
US11755513B2 (en) | Data processing and writing method based on virtual machine memory identification field and devise | |
KR102077149B1 (ko) | 메모리 관리 방법 및 장치 | |
US10565131B2 (en) | Main memory including hardware accelerator and method of operating the same | |
WO2019127191A1 (zh) | 一种多操作系统共享文件系统的方法、装置和电子设备 | |
CN111813713B (zh) | 数据加速运算处理方法、装置及计算机可读存储介质 | |
WO2019028682A1 (zh) | 一种多系统共享内存的管理方法及装置 | |
CN110119304B (zh) | 一种中断处理方法、装置及服务器 | |
CN111858457B (zh) | 一种数据处理方法、装置、系统和fpga | |
CN103927193A (zh) | Java应用程序函数迁移运行时的加载方法、服务端虚拟机 | |
US11023825B2 (en) | Platform as a service cloud server and machine learning data processing method thereof | |
US20170018050A1 (en) | Communication between integrated graphics processing units | |
US11042394B2 (en) | Method for processing input and output on multi kernel system and apparatus for the same | |
WO2022032990A1 (zh) | 一种命令信息传输方法、系统、装置及可读存储介质 | |
CN116257471A (zh) | 一种业务处理方法及装置 | |
EP3113015B1 (en) | Method and apparatus for data communication in virtualized environment | |
Shim et al. | Design and implementation of initial OpenSHMEM on PCIe NTB based cloud computing | |
US20200371827A1 (en) | Method, Apparatus, Device and Medium for Processing Data | |
CN110659143B (zh) | 一种容器间的通讯方法、装置及电子设备 | |
US20230153153A1 (en) | Task processing method and apparatus | |
EP4390646A1 (en) | Data processing method in distributed system, and related system | |
EP3913488B1 (en) | Data processing method and device | |
US20220358049A1 (en) | Memory access handling for peripheral component interconnect devices |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20200421 Address after: 518129 Bantian HUAWEI headquarters office building, Longgang District, Guangdong, Shenzhen Patentee after: HUAWEI TECHNOLOGIES Co.,Ltd. Address before: 301, A building, room 3, building 301, foreshore Road, No. 310053, Binjiang District, Zhejiang, Hangzhou Patentee before: Huawei Technologies Co.,Ltd. |