本技術(shù)涉及計算機,特別是涉及一種設(shè)備隊列的執(zhí)行方法、裝置、計算機設(shè)備、計算機可讀存儲介質(zhì)和計算機程序產(chǎn)品。
背景技術(shù):
1、開放式的計算語言平臺opencl(open?computing?language)可以編寫核函數(shù)kernel,類似于c語言,并且還提供了控制平臺的應用程序編程接口(applicationprogramming?interface,api)。opencl是一個跨系統(tǒng)的異構(gòu)平臺,可以支持windows、linux、android等各種操作系統(tǒng)。通過opencl編譯器編譯源代碼生成主機程序和內(nèi)核調(diào)用程序,從而實現(xiàn)對隊列中多個內(nèi)核的調(diào)用。
2、傳統(tǒng)技術(shù)中,當主機程序啟動設(shè)備程序工作時,由主機程序進入隊列,然后按照隊列中的內(nèi)核順序執(zhí)行,每執(zhí)行完一個內(nèi)核,則返回到主機程序,然后由主機程序調(diào)用隊列中的下一個內(nèi)核。
3、然而,上述傳統(tǒng)的方式不適用于頻繁調(diào)用內(nèi)核的場景,內(nèi)核調(diào)用效率低。
技術(shù)實現(xiàn)思路
1、基于此,有必要針對上述技術(shù)問題,提供一種能夠適用于頻繁調(diào)用內(nèi)核的場景,并且能夠顯著提高內(nèi)核調(diào)用效率的設(shè)備隊列的執(zhí)行方法、裝置、計算機設(shè)備、計算機可讀存儲介質(zhì)和計算機程序產(chǎn)品。
2、第一方面,本技術(shù)提供了一種設(shè)備隊列的執(zhí)行方法,包括:
3、從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口,并確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序;
4、根據(jù)所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,將各個子內(nèi)核的設(shè)備隊列接口寫入到所述設(shè)備隊列緩存中,得到更新后的設(shè)備隊列緩存;
5、根據(jù)所述父內(nèi)核的設(shè)備隊列接口,生成父內(nèi)核的啟動指令,并通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序;
6、通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口,并根據(jù)所述子內(nèi)核的設(shè)備隊列接口生成子內(nèi)核的啟動指令;
7、通過所述子內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述子內(nèi)核的內(nèi)核程序。
8、在其中一個實施例中,在從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口之前,所述方法還包括:
9、通過驅(qū)動程序調(diào)用opencl編譯器編譯源代碼,生成設(shè)備隊列的可執(zhí)行程序;
10、對所述設(shè)備隊列的可執(zhí)行程序進行解析,判斷所述設(shè)備隊列的可執(zhí)行程序中是否存在設(shè)備隊列特性,其中,所述設(shè)備隊列特性是指:允許父內(nèi)核的內(nèi)核程序在設(shè)備隊列中增加子內(nèi)核,并允許父內(nèi)核的內(nèi)核程序調(diào)用子內(nèi)核的內(nèi)核程序;
11、若存在設(shè)備隊列特性,則在顯存中構(gòu)建設(shè)備隊列緩存,其中,所述設(shè)備隊列緩存用于存儲設(shè)備隊列接口。
12、在其中一個實施例中,所述父內(nèi)核的設(shè)備隊列接口中包含啟動內(nèi)核的信息,所述啟動內(nèi)核的信息包括:子內(nèi)核的地址信息,事件信息,內(nèi)核函數(shù),以及執(zhí)行內(nèi)核程序的時間戳。
13、在其中一個實施例中,所述通過驅(qū)動程序調(diào)用opencl編譯器編譯源代碼,生成設(shè)備隊列的可執(zhí)行程序,包括:
14、根據(jù)設(shè)備隊列的內(nèi)核函數(shù),建立設(shè)備隊列接口表,其中,所述設(shè)備隊列接口表中存儲的信息包括:設(shè)備隊列接口在設(shè)備隊列緩存中的大小,啟動索引,共享內(nèi)存大小,事件偏移,全局工作組,工作組大小,全局工作偏移,工作組偏移,參數(shù)信息,共享內(nèi)存偏移中的任一種或者兩種及以上組合;
15、根據(jù)所述設(shè)備隊列接口表,收集不同內(nèi)核之間的依賴信息;
16、根據(jù)事件信息對所述依賴信息進行分析,并根據(jù)分析結(jié)果更新所述依賴信息,得到更新后的依賴信息;
17、根據(jù)更新后的依賴信息,建立不同內(nèi)核之間的依賴關(guān)系,其中,所述依賴關(guān)系包括:父內(nèi)核與子內(nèi)核之間的關(guān)系,同一父內(nèi)核下子內(nèi)核與子內(nèi)核之間的關(guān)系;
18、根據(jù)不同內(nèi)核之間的依賴關(guān)系和設(shè)備隊列接口表中存儲的信息,生成設(shè)備隊列的可執(zhí)行程序。
19、在其中一個實施例中,確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,包括:
20、根據(jù)不同內(nèi)核之間的依賴關(guān)系設(shè)置各個子內(nèi)核對應的標識,其中,所述標識用于指示父內(nèi)核和子內(nèi)核的執(zhí)行方式,所述執(zhí)行方式包括:子內(nèi)核與父內(nèi)核并行,子內(nèi)核等待父內(nèi)核執(zhí)行完畢后再執(zhí)行,子內(nèi)核等待父內(nèi)核下的子內(nèi)核工作組執(zhí)行完畢后再執(zhí)行;
21、根據(jù)所述標識來確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序。
22、在其中一個實施例中,在通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口之前,所述方法還包括:
23、在所述父內(nèi)核的內(nèi)核程序執(zhí)行過程中,根據(jù)事件信息確定需要調(diào)用的子內(nèi)核。
24、在其中一個實施例中,在通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序的過程中,所述方法還包括:
25、更新所述子內(nèi)核的設(shè)備隊列接口,其中,所述子內(nèi)核的設(shè)備隊列接口中的信息包括:子內(nèi)核的指令位置,子內(nèi)核的參數(shù)。
26、第二方面,本技術(shù)還提供了一種設(shè)備隊列的執(zhí)行裝置,所述裝置包括:
27、確定模塊,用于從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口,并確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序;
28、寫入模塊,用于根據(jù)所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,將各個子內(nèi)核的設(shè)備隊列接口寫入到所述設(shè)備隊列緩存中,得到更新后的設(shè)備隊列緩存;
29、執(zhí)行模塊,用于根據(jù)所述父內(nèi)核的設(shè)備隊列接口,生成父內(nèi)核的啟動指令,并通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序;
30、讀取模塊,用于通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口,并根據(jù)所述子內(nèi)核的設(shè)備隊列接口生成子內(nèi)核的啟動指令;
31、執(zhí)行模塊,還用于通過所述子內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述子內(nèi)核的內(nèi)核程序。
32、第三方面,本技術(shù)還提供了一種計算機設(shè)備,包括存儲器和處理器,所述存儲器存儲有計算機程序,所述處理器執(zhí)行所述計算機程序時實現(xiàn)以下步驟:
33、從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口,并確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序;
34、根據(jù)所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,將各個子內(nèi)核的設(shè)備隊列接口寫入到所述設(shè)備隊列緩存中,得到更新后的設(shè)備隊列緩存;
35、根據(jù)所述父內(nèi)核的設(shè)備隊列接口,生成父內(nèi)核的啟動指令,并通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序;
36、通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口,并根據(jù)所述子內(nèi)核的設(shè)備隊列接口生成子內(nèi)核的啟動指令;
37、通過所述子內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述子內(nèi)核的內(nèi)核程序。
38、第四方面,本技術(shù)還提供了一種計算機可讀存儲介質(zhì),其上存儲有計算機程序,所述計算機程序被處理器執(zhí)行時實現(xiàn)以下步驟:
39、從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口,并確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序;
40、根據(jù)所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,將各個子內(nèi)核的設(shè)備隊列接口寫入到所述設(shè)備隊列緩存中,得到更新后的設(shè)備隊列緩存;
41、根據(jù)所述父內(nèi)核的設(shè)備隊列接口,生成父內(nèi)核的啟動指令,并通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序;
42、通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口,并根據(jù)所述子內(nèi)核的設(shè)備隊列接口生成子內(nèi)核的啟動指令;
43、通過所述子內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述子內(nèi)核的內(nèi)核程序。
44、第五方面,本技術(shù)還提供了一種計算機程序產(chǎn)品,包括計算機程序,該計算機程序被處理器執(zhí)行時實現(xiàn)以下步驟:
45、從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口,并確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序;
46、根據(jù)所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,將各個子內(nèi)核的設(shè)備隊列接口寫入到所述設(shè)備隊列緩存中,得到更新后的設(shè)備隊列緩存;
47、根據(jù)所述父內(nèi)核的設(shè)備隊列接口,生成父內(nèi)核的啟動指令,并通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序;
48、通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口,并根據(jù)所述子內(nèi)核的設(shè)備隊列接口生成子內(nèi)核的啟動指令;
49、通過所述子內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述子內(nèi)核的內(nèi)核程序。
50、上述設(shè)備隊列的執(zhí)行方法、裝置、計算機設(shè)備、計算機可讀存儲介質(zhì)和計算機程序產(chǎn)品,通過該從設(shè)備隊列緩存中提取父內(nèi)核的設(shè)備隊列接口,并確定所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序;從而可以使用緩存來存儲內(nèi)核的設(shè)備隊列接口信息,靈活地變更父內(nèi)核與子內(nèi)核之間的執(zhí)行順序,適用于頻繁調(diào)用內(nèi)核的場景。根據(jù)所述父內(nèi)核和所述父內(nèi)核下各個子內(nèi)核的執(zhí)行順序,將各個子內(nèi)核的設(shè)備隊列接口寫入到所述設(shè)備隊列緩存中,得到更新后的設(shè)備隊列緩存;從而可以利用緩存來記錄子內(nèi)核的設(shè)備隊列接口信息,以便于后續(xù)由父內(nèi)核的內(nèi)核程序自由調(diào)度子內(nèi)核,無需返回主程序,提升了內(nèi)核調(diào)度的效率。根據(jù)所述父內(nèi)核的設(shè)備隊列接口,生成父內(nèi)核的啟動指令,并通過所述父內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述父內(nèi)核的內(nèi)核程序;從而使得異構(gòu)設(shè)備可以快速地啟動父內(nèi)核的內(nèi)核程序。通過所述父內(nèi)核的內(nèi)核程序,從所述更新后的設(shè)備隊列緩存中讀取子內(nèi)核的設(shè)備隊列接口,并根據(jù)所述子內(nèi)核的設(shè)備隊列接口生成子內(nèi)核的啟動指令;從而可以由父內(nèi)核靈活調(diào)取其下子內(nèi)核的內(nèi)核程序。通過所述子內(nèi)核的啟動指令指示異構(gòu)設(shè)備中的執(zhí)行單元執(zhí)行所述子內(nèi)核的內(nèi)核程序。從而在不增加硬件的基礎(chǔ)上,很好地適配了opencl2.0的設(shè)備隊列特性,能夠適用于頻繁調(diào)用內(nèi)核的場景,并且能夠顯著提高內(nèi)核調(diào)用效率,易于在不同的異構(gòu)設(shè)備中進行擴展使用。