一種數據傳輸方法及裝置的制造方法
【技術領域】
[0001 ]本發明涉及通信技術領域,尤其涉及一種數據傳輸方法及裝置。
【背景技術】
[0002]Java是一種可編寫跨平臺應用程序的面向對象的程序設計語言,其具有平臺無關性、安全性、網絡移動性等特性,極大地提升了編程效率,由此在不同領域獲得了較為廣泛的應用。與此同時,通過Java應用程序編寫的具體算法,存在執行效率低的問題,并不能滿足目前日益增長的數據計算需求,目前可采用硬件方式或軟件方式來進行加速,即通過硬件或軟件來計算Java應用程序需要計算的數據。其中,硬件方式包括通過加速器如現場可編程門陣列(Field-Programmable Gate Array,簡稱為“FPGA”)加速器來實現加速。
[0003]目前,在將Java應用程序中的待計算數據下發到加速器如FPGA加速器進行加速計算時,即在通過加速器實現硬件加速的過程中,存在較大的數據傳輸開銷。如圖1所示,是現有技術中的一種硬件加速方式的示意圖,將Java應用程序中的待計算數據下發到FPGA加速器進行計算,需要經過①_>②_>③_>④_>⑤_>⑥6個階段,包括待計算數據對應的數據下發過程①->②->③和結果數據對應的數據返回過程④->⑤->⑥。其中,該數據下發過程需要進行三次拷貝,包括用戶態下Java數據傳輸到用戶程序庫user library時一次數據拷貝、user library傳輸到內核態時一次拷貝、內核態傳輸到FPGA加速器時一次拷貝。結果數據返回過程與數據下發過程類似。這就使得Java應用程序與加速器之間的數據傳輸開銷較大,由此降低了數據傳輸效率。而且,在加速器的計算速度足夠快的情況下,該硬件加速過程中的多次數據拷貝則會導致加速性能降低。
【發明內容】
[0004]本發明實施例所要解決的技術問題在于,提供一種數據傳輸方法及裝置,能夠提升Java應用程序與加速器之間的數據傳輸效率,從而提升了數據的加速性能。
[0005]第一方面,本發明實施例提供了一種數據傳輸方法,包括:
[0006]Java應用程序向數據傳輸裝置發送內存申請請求;數據傳輸裝置接收Java應用程序的內存申請請求,為所述Java應用程序分配第一內存,以使Java應用程序將需要計算的目標數據寫入所述第一內存;數據傳輸裝置確定所述Java應用程序將所述目標數據寫入所述第一內存后的第一數據信息,該第一數據信息包括所述目標數據的內存地址以及所述目標數據的長度;數據傳輸裝置向加速器發送所述第一數據信息;加速器根據所述第一數據信息提取所述目標數據,并對所述目標數據進行計算,得到結果數據并存儲該結果數據,向數據傳輸裝置返回用于指示該結果數據的存儲位置的第二數據信息;數據傳輸裝置接收加速器返回的第二數據信息,并根據該第二數據信息獲取該目標數據對應的結果數據。
[0007]其中,所述第一內存是所述Java應用程序和所述數據傳輸裝置均能訪問的物理地址連續的內存空間。可選的,所述第一內存可以是根據所述目標數據的長度信息分配的與所述長度信息指示的長度相匹配的內存空間;或者,所述第一內存還可以是預設的固定長度的內存空間。該數據傳輸裝置可通過調用位于操作系統如Linux系統中的用戶程序庫user library中的程序指令來進行操作。該user library為Java應用程序提供了具體的應用程序編程接口(Applicat1n Programming Interface,簡稱為“API” ),用來實現申請內存、傳輸數據、接收結果等,該API接口基于Java本地接口(Java Native Interface,簡稱為“JNI”)實現。
[0008]在一些實施例中,在所述為所述Java應用程序分配第一內存之后,數據傳輸裝置還可以以共享內存的方式將所述第一內存封裝為緩沖區ByteBuffer對象,并將所述ByteBuffer對象返回給所述Java應用程序。以使Java應用程序根據該ByteBuffer對象將需要計算的目標數據寫入該第一內存中,并向數據傳輸裝置返回寫入了目標數據后的ByteBuffer對象及該目標數據的長度。數據傳輸裝置根據Java應用程序返回的ByteBuffer對象確定出該目標數據的內存地址,得到包括該目標數據的內存地址及該目標數據的長度的第一數據信息。
[0009]在一些實施例中,所述向加速器發送所述第一數據信息之前,所述數據傳輸裝置還可以為所述Java應用程序分配第二內存,所述第二內存用于存放加速器對所述目標數據進行計算后得到的結果數據;
[0010]所述第一數據信息還包括所述第二內存的地址以及所述第二內存的長度;所述向加速器發送所述第一數據信息,包括:
[0011]將所述第一數據信息寫入第三內存,并向加速器發送所述第三內存的地址,以使所述加速器根據所述第三內存的地址從所述第三內存中獲取所述第一數據信息;
[0012]所述接收所述加速器返回的第二數據信息,包括:
[0013]從所述第三內存獲取所述加速器返回的第二數據信息。
[0014]進一步的,在一些實施例中,所述將所述第一數據信息寫入第三內存,并向加速器發送所述第三內存的地址,包括:
[0015]將所述第一數據信息寫入第三內存,并將所述第三內存的地址加入第一隊列,以使所述加速器通過所述第一隊列獲取所述第三內存的地址;
[0016]所述從所述第三內存獲取所述加速器返回的第二數據信息,包括:
[0017]輪詢第二隊列讀指針和第二隊列寫指針,并比較所述第二隊列讀指針的值和所述第二隊列寫指針的值是否相同;若不同,則從所述第二隊列讀指針或所述第二隊列寫指針所在的第二隊列中獲取所述第三內存的地址,并根據所述第三內存的地址從所述第三內存中獲取第二數據信息,所述第二數據信息包括所述結果數據的內存地址以及所述結果數據的長度;將所述第二數據信息傳輸給所述Java應用程序,以使所述Java應用程序根據所述第二數據信息獲取所述結果數據。
[0018]其中,所述將所述第二數據信息傳輸給所述Java應用程序,可以具體為:將所述第二數據信息封裝為ByteBuf fer對象,并將該ByteBuf fer對象傳輸給所述Java應用程序,以使所述Java應用程序根據所述ByteBufTer對象獲取所述結果數據。
[0019]第二方面,本發明實施例還提供了一種數據傳輸方法,應用于加速器中,包括:
[0020]加速器接收數據傳輸裝置發送的第一數據信息,所述第一數據信息包括需要計算的目標數據的內存地址及所述目標數據的長度,且所述目標數據的內存地址對應的第一內存為物理地址連續的內存空間;根據所述目標數據的內存地址以及所述目標數據的長度提取所述目標數據;對所述目標數據進行計算,得到所述計算后的結果數據,并存儲所述結果數據,向所述數據傳輸裝置返回用于指示所述結果數據的存儲位置的第二數據信息。
[0021 ]進一步的,該第一數據信息中還包括用于存放所述目標數據對應的結果數據的第二內存的地址以及所述第二內存的長度;則所述存儲所述結果數據,向所述數據傳輸裝置返回用于指示所述結果數據的存儲位置的第二數據信息,可以具體為:根據所述第二內存的地址以及所述第二內存的長度將所述結果數據寫入所述第二內存;獲取所述結果數據的內存地址和所述結果數據的長度,并向所述數據傳輸裝置返回包括所述結果數據的內存地址和所述結果數據的長度的第二數據信息,以根據所述第二數據信息獲取所述結果數據。
[0022]在一些實施例中,所述接收數據傳輸裝置發送的第一數據信息,包括:
[0023]接收數據傳輸裝置發送的第三內存的地址,并根據所述第三內存的地址從所述第三內存獲取所述數據傳輸裝置發送的第一數據信息,所述第三內存為所述數據傳輸裝置和所述加速器均能訪問的內存空間;
[0024]所述向所述數據傳輸裝置返回包括所述結果數據的內存地址和所述結果數據的長度的第二數據信息,包括:
[0025]將包括所述結果數據的內存地址和所述結果數據的長度的第二數據信息寫入所述第三內存中,并通過所述第三內存將所述第二數據信息傳輸給所述數據傳輸裝置。
[0026]進一步的,在一些實施例中,所述接收數據傳輸裝置發送的第三內存的地址,包括:
[0027]輪詢第一隊列寫指針及第一隊列讀指針,并比較所述第一隊列寫指針的值和所述第一隊列讀指針的值是否相同;若不同,則從所述第一隊列寫指針或所述第一隊列讀指針所在的第一隊列中獲取所述第三內存地址;
[0028]所述通過所述第三內存將所述第二數據信息傳輸給所述數據傳輸裝置,包括:
[0029]將所述第三內存的地址加入第二隊列,以使所述數據傳輸裝置通過所述第二隊列獲取所述第三內存的地址。
[0030]第三方面,本發明實施例提供了一種數據傳輸裝置,包括:內存管理單元、信息確定單元、發送單元以及獲取單元;其中,
[0031]內存管理單元,用于在接收Java應用程序的內存申請請求時,為所述Java應用程序分配第一內存,以使所述Java應用程序將需要計算的目標數據寫入所述第一內存,所述第一內存為物理地址連續的內存空間;
[0032]信息確定單元,用于確定所述Java應用程序將所述目標數據寫入所述第一內存后的第一數據信息,所述第一數據信息包括所述目標數據的內存地址以及所述目標數據的長度;
[0033]發送單元,用于向加速器發送所述信息確定單元確定出的所述第一數據信息,以使所述加速器根據所述第一數據信息提取所述目標數據;
[0034]獲取單元,用于接收所述加速器返回的第二數據信息,并根據所述第二數據信息獲取所述加速器對所述目標數據計算后得到的結果數據。
[0035]其中,所述第一內存是所述Java應用程序和所述數據傳輸裝置均能訪問的物理地址連續的內存空間。可選的,所述第一內存可以是根據所述目標數據的長度信息分配的與所述長度信息指示的長度相匹配的內存空間;或者,所述第一內存還可以是預設的固定長度的內存空間。該數據傳輸裝置可通過調用操作系統如Linux系統中的用戶程序庫userI ibrary中的程序指令來進行操作。
[0036]在一些實施例中,所述裝置還包括:
[0037]封裝單元,用于以共享內存的方式將所述第一內存封裝為緩沖區ByteBuffer對象,并將所述ByteBuffer對象返回給所述Java應用程序。以使Java應用程序根據該ByteBuffer對象將需要計算的目標數據寫入該第一內存中,并向數據傳輸裝置返回寫入了目標數據后的ByteBuffer對象及該目標數據的長度。信息確定單元根據Java應用程序返回的ByteBuffer對象確定出該目標數據的內存地址,得到包括該目標數據的內存地址及該目標數據的長度的第一數據信息。
[0038]在一些實施例中,所述內存管理單元,還用于為所述Java應用程序分配第二內存,所述第二內存用于存放加速器對所述目標數據進行計算后得到的結果數