本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種硬件加速方法、編譯器以及設(shè)備。
背景技術(shù):
源代碼有時(shí)也稱為源程序。源代碼是指未編譯的按照一定的程序設(shè)計(jì)語言規(guī)范書寫的程序指令序列。因此,源代碼是一系列人類可讀的計(jì)算機(jī)語言指令。在現(xiàn)代程序語言中,計(jì)算機(jī)源代碼的最終目的是將人類可讀的程序指令序列翻譯成為計(jì)算機(jī)可以執(zhí)行的二進(jìn)制指令,這種過程叫做編譯,通過編譯器完成。
基于以上說明,目前代碼編譯以及執(zhí)行流程如下:編譯器在獲得源代碼后,將源代碼編譯為目標(biāo)代碼,然后將目標(biāo)代碼發(fā)送給執(zhí)行代碼的硬件如CPU(Central Processing Unit,中央處理器),由CPU執(zhí)行目標(biāo)代碼獲得執(zhí)行結(jié)果。
但是以上方案代碼執(zhí)行效率仍然較低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種硬件加速方法、編譯器以及設(shè)備,用于提高代碼執(zhí)行效率從而實(shí)現(xiàn)硬件加速。
本發(fā)明實(shí)施例一方面提供了一種硬件加速方法,包括:
編譯器獲取編譯策略信息以及源代碼;所述編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
所述編譯器根據(jù)所述編譯策略信息分析所述源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
所述編譯器將第一代碼段編譯為第一可執(zhí)行代碼,將所述第一可執(zhí)行代碼發(fā)往所述第一處理器;將第二代碼段編譯為第二可執(zhí)行代碼,將所述第二可執(zhí)行代碼發(fā)往所述第二處理器。
結(jié)合一方面的實(shí)現(xiàn)方式,在第一種可選的實(shí)現(xiàn)方式中,所述將所述第二 可執(zhí)行代碼發(fā)往所述第二處理器包括:
所述編譯器通過調(diào)度管理器將所述第二可執(zhí)行代碼發(fā)送給所述第二處理器;或者,
所述編譯器在所述第二可執(zhí)行代碼中添加調(diào)用第二處理器的指示信息,通過調(diào)度管理器將所述第二可執(zhí)行代碼發(fā)送給所述第一處理器,使所述第一處理器獲取到所述指示信息后將所述第二可執(zhí)行代碼發(fā)往所述第二處理器。
結(jié)合一方面的實(shí)現(xiàn)方式,在第二種可選的實(shí)現(xiàn)方式中,所述第一處理器為CPU,第二處理器為FPGA;所述編譯器根據(jù)所述編譯策略信息分析所述源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段包括:
所述編譯器統(tǒng)計(jì)所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間,若統(tǒng)計(jì)得到的參數(shù)超過第一預(yù)定閾值,則確定該代碼段屬于第二代碼段,否則確定該代碼段屬于第一代碼段;或者,
所述編譯器將所述源代碼中的代碼段與所述第二代碼段的特征規(guī)則進(jìn)行比較,若與所述第二代碼段的特征規(guī)則匹配,則確定該代碼段為第二代碼段,否則,確定該代碼段為第一代碼段;或者,
所述編譯器讀取所述源代碼中的加速標(biāo)識(shí)信息,依據(jù)所述加速標(biāo)識(shí)信息的指示確定所述源代碼中的代碼屬于第一代碼段或第二代碼段。
結(jié)合一方面的第二種可選的實(shí)現(xiàn)方式,在第三種可選的實(shí)現(xiàn)方式中,所述編譯器統(tǒng)計(jì)所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間包括:
所述編譯器調(diào)用統(tǒng)計(jì)指令集通過所述源代碼中的功能代碼確定所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;或者,所述編譯器獲取定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表確定所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間。
結(jié)合一方面、一方面的第一種、第二種或者第三種可選的實(shí)現(xiàn)方式,在第四種可選的實(shí)現(xiàn)方式中,若所述第二代碼段對(duì)應(yīng)進(jìn)程的優(yōu)先級(jí)高于正在所述第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的進(jìn)程的優(yōu)先級(jí),在將所述第二可執(zhí)行代碼發(fā)往所述第二處理器之前,所述方法還包括:
若所述第二處理器的繁忙度高于第二預(yù)定閾值,則停止正在所述第二處理器中執(zhí)行的可執(zhí)行代碼;將正在所述第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼,發(fā)送給所述第一處理器。
結(jié)合一方面、一方面的第一種、第二種或者第三種可選的實(shí)現(xiàn)方式,在第五種可選的實(shí)現(xiàn)方式中,若第一代碼段屬于主代碼段,所述第二代碼段從屬所述主代碼段,則所述方法還包括:
在所述第一可執(zhí)行代碼以及所述第二可執(zhí)行代碼中添加交互指令,使所述第二處理器向所述第一處理器返回所述第二可執(zhí)行代碼的執(zhí)行結(jié)果。
本發(fā)明實(shí)施例二方面提供了一種硬件加速方法,包括:
編譯器獲取編譯策略信息以及源代碼;所述編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
所述編譯器根據(jù)所述編譯策略信息將所述源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼,將所述第一可執(zhí)行代碼發(fā)往所述第一處理器;
若接收到所述第一處理器統(tǒng)計(jì)的所述第一可執(zhí)行代碼的第一執(zhí)行信息,并依據(jù)所述第一執(zhí)行信息確定所述第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配,則將所述第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼,將所述第二可執(zhí)行代碼發(fā)往第二處理器。
結(jié)合二方面的實(shí)現(xiàn)方式,在第一種可選的實(shí)現(xiàn)方式中,在將所述第二可執(zhí)行代碼發(fā)往第二處理器之后,所述方法還包括:
接收來自所述第二處理器執(zhí)行所述第二可執(zhí)行代碼的第二執(zhí)行信息,若依據(jù)所述第二執(zhí)行信息確定所述第二可執(zhí)行代碼對(duì)應(yīng)的代碼段與所述第二處理器匹配度低于期望值,則在所述第二處理器卸載所述第二可執(zhí)行代碼,將所述第二可執(zhí)行代碼對(duì)應(yīng)的代碼段對(duì)應(yīng)的第一可執(zhí)行代碼發(fā)往所述第一處理器。
本發(fā)明實(shí)施例三方面還提供了一種編譯器,包括:
獲取單元,用于獲取編譯策略信息以及源代碼;所述編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
確定單元,用于根據(jù)所述編譯策略信息分析所述源代碼中的代碼段,確 定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
編譯單元,用于將第一代碼段編譯為第一可執(zhí)行代碼,將第二代碼段編譯為第二可執(zhí)行代碼;
發(fā)送單元,用于將所述第一可執(zhí)行代碼發(fā)往所述第一處理器,將所述第二可執(zhí)行代碼發(fā)往所述第二處理器。
結(jié)合三方面的實(shí)現(xiàn)方式,在第一種可選的實(shí)現(xiàn)方式中,所述發(fā)送單元用于通過調(diào)度管理器將所述第二可執(zhí)行代碼發(fā)送給所述第二處理器;或者,
所述編譯單元還用于在所述第二可執(zhí)行代碼中添加調(diào)用第二處理器的指示信息;
所述發(fā)送單元還用于將所述第二可執(zhí)行代碼發(fā)送給調(diào)度管理器,通過調(diào)度管理器將所述第二可執(zhí)行代碼發(fā)送給所述第一處理器,使所述第一處理器獲取到所述指示信息后將所述第二可執(zhí)行代碼發(fā)往所述第二處理器。
結(jié)合三方面的實(shí)現(xiàn)方式,在第二種可選的實(shí)現(xiàn)方式中,所述第一處理器為CPU,第二處理器為FPGA;所述確定單元用于統(tǒng)計(jì)所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間,若統(tǒng)計(jì)得到的參數(shù)超過第一預(yù)定閾值,則確定該代碼段屬于第二代碼段,否則確定該代碼段屬于第一代碼段;或者,
所述確定單元用于將所述源代碼中的代碼段與所述第二代碼段的特征規(guī)則進(jìn)行比較,若與所述第二代碼段的特征規(guī)則匹配,則確定該代碼段為第二代碼段,否則,確定該代碼段為第一代碼段;或者,
所述確定單元用于讀取所述源代碼中的加速標(biāo)識(shí)信息,依據(jù)所述加速標(biāo)識(shí)信息的指示確定所述源代碼中的代碼屬于第一代碼段或第二代碼段。
結(jié)合三方面的第二種可選的實(shí)現(xiàn)方式,在第三種可選的實(shí)現(xiàn)方式中,所述確定單元用于調(diào)用統(tǒng)計(jì)指令集通過所述源代碼中的功能代碼確定所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;或者,
所述確定單元用于獲取定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表確定所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間。
結(jié)合三方面、三方面的第一種、第二種或者第三種可選的實(shí)現(xiàn)方式,在第四種可選的實(shí)現(xiàn)方式中,若所述第二代碼段對(duì)應(yīng)進(jìn)程的優(yōu)先級(jí)高于正在所 述第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的進(jìn)程的優(yōu)先級(jí),所述設(shè)備還包括:
第一處理單元,用于若所述第二處理器的繁忙度高于第二預(yù)定閾值,則停止正在所述第二處理器中執(zhí)行的可執(zhí)行代碼;
第二處理單元,用于將正在所述第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼,發(fā)送給所述第一處理器。
結(jié)合三方面、三方面的第一種、第二種或者第三種可選的實(shí)現(xiàn)方式,在第五種可選的實(shí)現(xiàn)方式中,若第一代碼段屬于主代碼段,所述第二代碼段從屬所述主代碼段,所述編譯器還包括:
第三處理單元,用于在所述第一可執(zhí)行代碼以及所述第二可執(zhí)行代碼中添加交互指令,使所述第二處理器向所述第一處理器返回所述第二可執(zhí)行代碼的執(zhí)行結(jié)果。
本發(fā)明實(shí)施例四方面提供了一種編譯器,包括:
獲取單元,用于獲取編譯策略信息以及源代碼;所述編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
第一編譯單元,用于根據(jù)所述編譯策略信息將所述源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼;
第一發(fā)送單元,用于將所述第一可執(zhí)行代碼發(fā)往所述第一處理器;
第一接收單元,用于接收所述第一處理器統(tǒng)計(jì)的所述第一可執(zhí)行代碼的第一執(zhí)行信息;
第一處理單元,用于依據(jù)所述第一執(zhí)行信息確定所述第一可執(zhí)行代碼對(duì)應(yīng)的代碼段是否與第二處理器匹配;
第二編譯單元,用于所述第一處理單元依據(jù)所述第一執(zhí)行信息確定所述第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配,則將所述第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼;
第二發(fā)送單元,用于將所述第二可執(zhí)行代碼發(fā)往第二處理器。
結(jié)合四方面的實(shí)現(xiàn)方式,在第一種可選的實(shí)現(xiàn)方式中,所述編譯器還包括:
第二接收單元,用于接收來自所述第二處理器執(zhí)行所述第二可執(zhí)行代碼的第二執(zhí)行信息;
第二處理單元,用于若依據(jù)所述第二執(zhí)行信息確定所述第二可執(zhí)行代碼對(duì)應(yīng)的代碼段與所述第二處理器匹配度低于期望值,則在所述第二處理器卸載所述第二可執(zhí)行代碼,將所述第二可執(zhí)行代碼對(duì)應(yīng)的代碼段對(duì)應(yīng)的第一可執(zhí)行代碼發(fā)往所述第一處理器。
本發(fā)明實(shí)施例五方面提供了一種設(shè)備,包括:
編譯器和調(diào)度管理器,所述編譯器包括:
獲取單元、確定單元、編譯單元以及發(fā)送單元;
所述獲取單元,用于獲取編譯策略信息以及源代碼;所述編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
所述確定單元,用于根據(jù)所述編譯策略信息分析所述源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
所述編譯單元,用于將第一代碼段編譯為第一可執(zhí)行代碼,將第二代碼段編譯為第二可執(zhí)行代碼;
所述發(fā)送單元,用于將所述第一可執(zhí)行代碼和所述第二可執(zhí)行代碼發(fā)送給調(diào)度管理器;
所述調(diào)度管理器,用于將所述第一可執(zhí)行代碼發(fā)往所述第一處理器,將所述第二可執(zhí)行代碼發(fā)往所述第二處理器。
結(jié)合五方面的實(shí)現(xiàn)方式,在第一種可選的實(shí)現(xiàn)方式中,所述調(diào)度管理器,還用于配置編譯策略信息,將所述編譯策略信息發(fā)送給所述編譯器。
結(jié)合五方面的實(shí)現(xiàn)方式,在第二種可選的實(shí)現(xiàn)方式中,若所述第一處理器為CPU,所述第二處理器為FPGA,
所述確定單元,還用于調(diào)用統(tǒng)計(jì)指令集通過所述源代碼中的功能代碼確定所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;或者
所述調(diào)度管理器,還用于獲取定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表,將所述定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表發(fā)送給所述編譯器;
所述確定單元,還用于依據(jù)所述代碼執(zhí)行統(tǒng)計(jì)報(bào)表確定所述源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;
所述確定單元用于確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段包括:若所述循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間超過第一 預(yù)定閾值,則確定該代碼段屬于第二代碼段,否則確定該代碼段屬于第一代碼段。
結(jié)合五方面的實(shí)現(xiàn)方式,在第三種可選的實(shí)現(xiàn)方式中,所述調(diào)度管理器,還用于若所述第二處理器的繁忙度高于第二預(yù)定閾值,在所述編譯器停止正在所述第二處理器中執(zhí)行的可執(zhí)行代碼,將正在所述第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼后,接收來自所述與第一處理器匹配的可執(zhí)行代碼,并發(fā)送給第一處理器。
從以上技術(shù)方案可以看出,本發(fā)明實(shí)施例具有以下優(yōu)點(diǎn):編譯器將源代碼中與第一處理器匹配的代碼段編譯成第一處理器可以執(zhí)行的第一可執(zhí)行代碼,將源代碼中與第二處理器匹配的代碼段編譯成第二處理器可以執(zhí)行的第二可執(zhí)行代碼;第一可執(zhí)行代碼被發(fā)往了第一處理器,第二可執(zhí)行代碼被發(fā)往了第二處理器,因此源代碼中的代碼段對(duì)應(yīng)的可執(zhí)行代碼被分配到匹配度較高的硬件來執(zhí)行,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例中系統(tǒng)架構(gòu)示意圖;
圖2為本發(fā)明實(shí)施例方法流程示意圖;
圖3為本發(fā)明實(shí)施例方法流程示意圖;
圖4為本發(fā)明實(shí)施例方法流程示意圖;
圖5為本發(fā)明實(shí)施例方法流程示意圖;
圖6為本發(fā)明實(shí)施例方法流程示意圖;
圖7為本發(fā)明實(shí)施例方法流程示意圖;
圖8為本發(fā)明實(shí)施例方法流程示意圖;
圖9為本發(fā)明實(shí)施例編譯器結(jié)構(gòu)示意圖;
圖10為本發(fā)明實(shí)施例編譯器結(jié)構(gòu)示意圖;
圖11為本發(fā)明實(shí)施例編譯器結(jié)構(gòu)示意圖;
圖12為本發(fā)明實(shí)施例編譯器結(jié)構(gòu)示意圖;
圖13為本發(fā)明實(shí)施例設(shè)備結(jié)構(gòu)示意圖;
圖14為本發(fā)明實(shí)施例設(shè)備結(jié)構(gòu)示意圖;
圖15為本發(fā)明實(shí)施例服務(wù)器結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部份實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明實(shí)施例提供了一種硬件加速方法、編譯器以及設(shè)備,用于提高代碼執(zhí)行效率從而實(shí)現(xiàn)硬件加速。
為了方便理解本發(fā)明實(shí)施例,下面介紹本發(fā)明實(shí)施例中的系統(tǒng)架構(gòu)。
請(qǐng)參閱圖1,該系統(tǒng)架構(gòu)包括編譯器、調(diào)度管理器、第一處理器、第二處理器以及程序庫(kù)。
其中調(diào)度管理器負(fù)責(zé)管理和調(diào)度一片或多片第一處理器和第二處理器;把可執(zhí)行文件加載到第一處理器和第二處理器上,把可執(zhí)行文件從第一處理器和第二處理器上卸載;負(fù)責(zé)向編譯器提供編譯策略和硬件信息。
編譯器用于編譯源代碼、生成中間代碼和可執(zhí)行代碼。
第一處理器為CPU、GPU(Graphics Processing Unit,圖形處理器)、NP(Network Processor,網(wǎng)絡(luò)處理器)等芯片。
第二處理器為FPGA(Field Programmable Gate Array,現(xiàn)場(chǎng)可編程門陣列)、CPLD(Complex Programmable Logic Device,復(fù)雜可編程邏輯器件)、PAL(Programmable Array Logic,可編程化陣列邏輯)和GAL(Generic Array Logic,通用陣列邏輯)等可編程邏輯器件。
程序庫(kù)中包括:源代碼,中間代碼和可執(zhí)行代碼。
在上述系統(tǒng)架構(gòu)的基礎(chǔ)上,對(duì)硬件加速方法通過以下實(shí)施例進(jìn)行說明:
請(qǐng)參閱圖2,本發(fā)明實(shí)施例中一種硬件加速方法包括:
101、編譯器獲取編譯策略信息以及源代碼;該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
本實(shí)施例中,編譯器可以通過多種方法獲取編譯策略信息,例如:從本地存儲(chǔ)器中獲取預(yù)配置的編譯策略信息,或者,接收調(diào)度管理器下發(fā)的編譯策略信息。
在本實(shí)施例中,本地存儲(chǔ)器中可以存儲(chǔ)編譯策略信息,也可以存儲(chǔ)編譯策略信息的指示信息,例如:指示如何獲取編譯策略信息的信息;或者編譯策略信息的地址信息等。
該編譯策略信息包括:編譯檢測(cè)出可以用FPGA進(jìn)行加速時(shí)采用的策略,編譯FPGA加速效果閾值,編譯最長(zhǎng)時(shí)間閾值(指由于FPGA的編譯有時(shí)候花費(fèi)的時(shí)間比較長(zhǎng),設(shè)置一個(gè)編譯最長(zhǎng)時(shí)間),編譯異常策略(指在FPGA編譯過程中和CPU編譯過程中可能會(huì)產(chǎn)生一系列的異常,通過設(shè)置異常策略來處理這些異常)。
上述CPU用于指代第一處理器,上述FPGA用于指代第二處理器。
代碼類型包括:可加速代碼以及普通代碼。其中可加速代碼可以為:CPU指令,代碼塊,函數(shù)(模塊)以及源文件。
第一處理器和第二處理器分別為:CPU、FPGA、GPU(Graphics Processing Unit,圖形處理器)、NP(Network Processor,網(wǎng)絡(luò)處理器)、ASIC(Application Specific Integrated Circuit,專用集成電路)、CPLD(Complex Programmable Logic Device,復(fù)雜可編程邏輯器件)、PAL(Programmable Array Logic,可編程化陣列邏輯)和GAL(Generic Array Logic,通用陣列邏輯)中的任意兩項(xiàng)??梢岳斫獾氖?,CPU,GPU,NP為具有軟件編程能力的芯片,F(xiàn)PGA,ASIC,PAL,GAL,CPLD為可編程邏輯器件。
源代碼可以由一個(gè)或多個(gè)文件組成,源代碼所使用的編程語言可以是匯編語言,C語言以及腳本編程語言,還包括其他類型的語言,此處不再贅述。
102、該編譯器根據(jù)該編譯策略信息分析該源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
在獲取編譯策略信息以及源代碼后,編譯器分析該源代碼中的代碼段, 確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
其中,該編譯器會(huì)根據(jù)編譯策略信息檢測(cè)源代碼中是否有可以加速的代碼,根據(jù)檢測(cè)結(jié)果將源代碼中的普通代碼生成中間源代碼。中間源代碼可以理解為源代碼中的普通代碼的另一種形式存在的源代碼。
當(dāng)?shù)谝惶幚砥鳛镃PU,第二處理器為FPGA時(shí),可選的,該編譯器統(tǒng)計(jì)該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間,若統(tǒng)計(jì)得到的參數(shù)超過第一預(yù)定閾值,則確定該代碼段屬于第二代碼段,否則確定該代碼段屬于第一代碼段;或者,該編譯器將該源代碼中的代碼段與該第二代碼段的特征規(guī)則進(jìn)行比較,若與該第二代碼段的特征規(guī)則匹配,則確定該代碼段為第二代碼段,否則,確定該代碼段為第一代碼段;或者,該編譯器讀取該源代碼中的加速標(biāo)識(shí)信息,依據(jù)該加速標(biāo)識(shí)信息的指示確定該源代碼中的代碼屬于第一代碼段或第二代碼段。其中該編譯器統(tǒng)計(jì)該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間具體為:該編譯器調(diào)用統(tǒng)計(jì)指令集通過該源代碼中的功能代碼確定該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;或者,該編譯器獲取定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表確定該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間。統(tǒng)計(jì)指令集可以由CPU擴(kuò)展,統(tǒng)計(jì)指令集可以對(duì)執(zhí)行代碼進(jìn)行統(tǒng)計(jì),編譯器在編譯時(shí)自動(dòng)調(diào)用統(tǒng)計(jì)指令集,定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表可以通過外部程序?qū)崿F(xiàn),或者人工干預(yù)代碼實(shí)現(xiàn)。
需要說明的是,上述第一預(yù)定閾值是與統(tǒng)計(jì)得到的參數(shù)對(duì)應(yīng)的,若統(tǒng)計(jì)得到的參數(shù)很多,那么第一預(yù)定閾值可以是一組參數(shù)值;例如:統(tǒng)計(jì)得到的是循環(huán)執(zhí)行次數(shù),那么上述第一預(yù)定閾值可以是諸如100次、50次等參數(shù),那么只要循環(huán)執(zhí)行次數(shù)超過這個(gè)第一預(yù)定閾值指定的次數(shù),那么表示需要將代碼段編譯為FPGA的可執(zhí)行代碼;若統(tǒng)計(jì)得到的是循環(huán)執(zhí)行次數(shù)和CPU執(zhí)行時(shí)間,那么可以是一組參數(shù)值,例如:100次、2S;那么循環(huán)執(zhí)行次數(shù)超過100次,CPU執(zhí)行時(shí)間超過2S都會(huì)出現(xiàn)超過閾值的情況,此種情況下,可以認(rèn)為超過任一參數(shù)都認(rèn)為超過第一預(yù)定閾值,也可以必須滿足超過了以上兩個(gè)參數(shù)才認(rèn)為超過第一預(yù)定閾值?;诮y(tǒng)計(jì)得到的參數(shù)不同,第一預(yù)定閾值還可以有其他參數(shù)類型,第一預(yù)定閾值的具體參數(shù)值可以按照經(jīng)驗(yàn)或者加速 需求進(jìn)行確定,以上舉例不應(yīng)理解為對(duì)本發(fā)明實(shí)施例的唯一性限定。
另外,上述特征規(guī)則指的是編譯器預(yù)先設(shè)置一個(gè)可加速代碼描述特征庫(kù),可加速代碼描述特征庫(kù)中包含著特征規(guī)則。
進(jìn)一步的,上述加速標(biāo)識(shí)信息指的是編程人員在源代碼中選取目標(biāo)代碼,給目標(biāo)代碼添加標(biāo)識(shí),用來表示該目標(biāo)代碼可被加速。
103、該編譯器將第一代碼段編譯為第一可執(zhí)行代碼,將該第一可執(zhí)行代碼發(fā)往上述第一處理器;將第二代碼段編譯為第二可執(zhí)行代碼,將該第二可執(zhí)行代碼發(fā)往上述第二處理器。
該編碼器將該第一代碼編譯為第一處理器可執(zhí)行代碼,即第一可執(zhí)行代碼,將該第一可執(zhí)行代碼發(fā)往上述第一處理器;將該第二代碼段編譯為第二處理器可執(zhí)行代碼,即第二可執(zhí)行代碼,將該第二可執(zhí)行代碼發(fā)往上述第二處理器。在本發(fā)明實(shí)施例中,編譯器將可執(zhí)行代碼“發(fā)往”處理器,不應(yīng)狹隘的理解為以數(shù)據(jù)包的方式進(jìn)行發(fā)送,應(yīng)廣義理解其含義為數(shù)據(jù)傳遞方式;數(shù)據(jù)傳遞方式除了以數(shù)據(jù)包的方式發(fā)送外,在編譯器和處理器之間通??梢允褂玫臄?shù)據(jù)傳遞方式還有很多,例如:將可執(zhí)行代碼存到存儲(chǔ)空間內(nèi),例如:磁盤內(nèi),然后由CPU讀取該執(zhí)行代碼;或者,將可執(zhí)行代碼存儲(chǔ)到磁盤內(nèi),然后下載到FPGA芯片中。具體的數(shù)據(jù)傳遞方式可以依硬件的需求進(jìn)行選用,本發(fā)明實(shí)施例對(duì)此不進(jìn)行限定。
另外,若第一或者第二可執(zhí)行代碼的執(zhí)行量很多,并且存在多個(gè)第一硬件或第二硬件的情況下,可以在同類硬件之間進(jìn)行負(fù)載均衡處理。負(fù)載均衡的方式可以參考各種已經(jīng)存在的負(fù)載均衡算法,本發(fā)明實(shí)施例不再贅述。
可以理解的是,在第一處理器和第二處理器分別接收到第一可執(zhí)行代碼和第二可執(zhí)行代碼后,第一處理器和第二處理器通過交互指令完成代碼的交互。
可選的,在將該第二可執(zhí)行代碼發(fā)往該第二處理器之前,若該第二代碼段對(duì)應(yīng)進(jìn)程的優(yōu)先級(jí)高于正在該第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的進(jìn)程的優(yōu)先級(jí),則有:若該第二處理器的繁忙度高于第二預(yù)定閾值,則停止正在該第二處理器中執(zhí)行的可執(zhí)行代碼;將正在該第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼,發(fā)送給該第一處理 器。
需要說明的是,上述繁忙度指的是第二處理器的數(shù)據(jù)處理資源被占用的程度,占用得越多則表示繁忙度越高;如果出現(xiàn)擁塞排隊(duì)等情況,則排隊(duì)等待時(shí)間越長(zhǎng)繁忙度越高。第二預(yù)定閾值是繁忙程度的臨界值,例如資源占用率超過某一閾值或者排隊(duì)時(shí)間超過某一閾值等,這時(shí)可以確定第二處理器處于繁忙狀態(tài)。另外,上述優(yōu)先級(jí)指的是為不同的執(zhí)行邏輯(任務(wù)、進(jìn)程或線程等)分配不同的優(yōu)先級(jí)。
可選的,若第一代碼段屬于主代碼段,該第二代碼段從屬該主代碼段,則有:在該第一可執(zhí)行代碼以及該第二可執(zhí)行代碼中添加交互指令,使該第二處理器向該第一處理器返回該第二可執(zhí)行代碼的執(zhí)行結(jié)果。
上述主代碼段可以理解為普通代碼段,從代碼段可以理解為可加速代碼段。
另外,編譯器可以通過多種方法將第二可執(zhí)行代碼發(fā)往該第二處理器,例如:通過調(diào)度管理器將該第二可執(zhí)行代碼發(fā)送給該第二處理器;或者,在該第二可執(zhí)行代碼中添加調(diào)用第二處理器的指示信息,通過調(diào)度管理器將該第二可執(zhí)行代碼發(fā)送給該第一處理器,使該第一處理器獲取到該指示信息后將該第二可執(zhí)行代碼發(fā)往該第二處理器。
本實(shí)施例中,編譯器將源代碼中與第一處理器匹配的代碼段編譯成第一處理器可以執(zhí)行的第一可執(zhí)行代碼,將源代碼中與第二處理器匹配的代碼段編譯成第二處理器可以執(zhí)行的第二可執(zhí)行代碼;第一可執(zhí)行代碼被發(fā)往了第一處理器,第二可執(zhí)行代碼被發(fā)往了第二處理器,因此源代碼中的代碼段對(duì)應(yīng)的可執(zhí)行代碼被分配到匹配度較高的硬件來執(zhí)行,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
請(qǐng)參閱圖3,本發(fā)明實(shí)施例中一種硬件加速方法包括:
201、編譯器獲取編譯策略信息以及源代碼;該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
本實(shí)施例中,步驟201和步驟101類似,此處不再贅述。
202、該編譯器根據(jù)該編譯策略信息將該源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼,將該第一可執(zhí)行代碼發(fā)往該第一處理器;
該編譯器通過編譯器中的編譯單元將該源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼,將該第一可執(zhí)行代碼發(fā)往該第一處理器。
可以理解的是,編譯器可以根據(jù)編譯策略信息,生成中間源代碼,再對(duì)中間源代碼中的代碼段進(jìn)行編譯。
203、若接收到該第一處理器統(tǒng)計(jì)的該第一可執(zhí)行代碼的第一執(zhí)行信息,并依據(jù)該第一執(zhí)行信息確定該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配,則將該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼,將該第二可執(zhí)行代碼發(fā)往第二處理器。
第一處理器接收到第一可執(zhí)行代碼后,生成了第一執(zhí)行信息,并將該第一執(zhí)行信息發(fā)往編譯器,編譯器依據(jù)該第一執(zhí)行信息確定該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配,則編譯器通過調(diào)度管理器修改編譯策略信息,將該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼,并通過調(diào)度管理器將該第二可執(zhí)行代碼發(fā)往第二處理器。
上述第一執(zhí)行信息是用來確定可執(zhí)行代碼與處理器之間是否匹配的參數(shù),基于前述舉例,這里的執(zhí)行信息可以是第一可執(zhí)行代碼在第一處理器中的執(zhí)行次數(shù)或執(zhí)行時(shí)間,還可以是其他信息,在此處不再一一舉例說明。
可選的,步驟203之后,還可以包括:
接收來自該第二處理器執(zhí)行該第二可執(zhí)行代碼的第二執(zhí)行信息,若依據(jù)該第二執(zhí)行信息確定該第二可執(zhí)行代碼對(duì)應(yīng)的代碼段與該第二處理器匹配度低于期望值,則在該第二處理器卸載該第二可執(zhí)行代碼,將該第二可執(zhí)行代碼對(duì)應(yīng)的代碼段對(duì)應(yīng)的第一可執(zhí)行代碼發(fā)往該第一處理器。
需要說明的是,第二可執(zhí)行代碼對(duì)應(yīng)的代碼段對(duì)應(yīng)的第一可執(zhí)行代碼指的是將第二可執(zhí)行代碼對(duì)應(yīng)的代碼段重新編譯,生成第一可執(zhí)行代碼,將第一可執(zhí)行代碼發(fā)往第一處理器。
在本實(shí)施例中,第二執(zhí)行信息也是用來確定可執(zhí)行代碼與處理器之間是否匹配的參數(shù),可以參考第一執(zhí)行信息選用的參數(shù)舉例說明。
本實(shí)施例中,將源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼,當(dāng)確定第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配時(shí),將第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼,通過第二處理器接收第二 可執(zhí)行代碼,因此源代碼中的代碼段對(duì)應(yīng)的可執(zhí)行代碼被分配到匹配度較高的硬件來執(zhí)行,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
此外,當(dāng)?shù)诙蓤?zhí)行代碼在第二處理器執(zhí)行效率不高時(shí),則在第二處理器上卸載該第二可執(zhí)行代碼,并對(duì)第二可執(zhí)行代碼對(duì)應(yīng)的代碼段重新編譯,通過第一處理器來執(zhí)行。
為了便于理解,下面對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行詳細(xì)描述,請(qǐng)參閱圖4,本發(fā)明實(shí)施例中一種硬件加速方法包括:
301、編譯器接收調(diào)度管理器下發(fā)的編譯策略信息和硬件信息;
本實(shí)施例中,調(diào)度管理器配置編譯策略信息和硬件信息,調(diào)度管理器將該編譯策略信息和硬件信息發(fā)送給編譯器。
本實(shí)施例中的編譯策略信息為將可加速代碼直接編譯成FPGA可執(zhí)行代碼并在FPGA中加載運(yùn)行。
硬件信息包括:CPU的型號(hào)和數(shù)量、CPU上的操作系統(tǒng)類型和版本號(hào)、CPU可使用的內(nèi)存信息、FPGA型號(hào)和數(shù)量、與FPGA相連的外圍芯片信息以及CPU和FPGA之間的交互方式。
302、編譯器接收源代碼;
源代碼可以由一個(gè)或多個(gè)文件組成,源代碼所使用的編程語言可以是匯編語言,C語言以及腳本編程語言,還包括其他類型的語言,此處不再贅述。以C語言為例,假設(shè)本實(shí)施例中的源代碼為:
303、編譯器分析該源代碼,確定可加速代碼;
編譯器中預(yù)先設(shè)置一個(gè)可加速代碼描述特征庫(kù),編譯器將源代碼與該可加速代碼描述特征庫(kù)中的特征規(guī)則進(jìn)行比較,如果源代碼中有某段代碼能匹 配上,則表明上述某段代碼可以用FPGA來加速。
需要說明的是,還可以采用其他方法,例如:編程人員可以在源代碼中設(shè)置需要加速的代碼,比如:
用#program fpga_acc_func來表明該函數(shù)需要被加速。又比如:
用#program fpga_acc_begin和#program fpga_acc_end來表明該對(duì)之間的代碼需要被加速。
304、編譯器將源代碼中的普通代碼轉(zhuǎn)換為中間源代碼;
編譯器根據(jù)可加速代碼描述特征庫(kù)、編譯策略和硬件信息來檢測(cè)源代碼 中是否有可以加速的代碼,然后根據(jù)檢測(cè)結(jié)果將源代碼中的普通代碼轉(zhuǎn)換為中間源代碼,中間源代碼可以為:
305、編譯器將中間源代碼編譯成CPU可執(zhí)行代碼,并向調(diào)度管理器發(fā)送CPU可執(zhí)行代碼;
編譯器通過CPU編譯單元將中間源代碼編譯成CPU可執(zhí)行代碼,CPU編譯單元位于編譯器中。
306、編譯器將可加速代碼編譯成FPGA可執(zhí)行代碼,并向調(diào)度管理器發(fā)送FPGA可執(zhí)行代碼;
編譯器通過FPGA編譯單元將可加速代碼編譯成FPGA可執(zhí)行代碼,并向調(diào)度管理器發(fā)送FPGA可執(zhí)行代碼,F(xiàn)PGA編譯單元位于編譯器中。
需要說明的是,可加速代碼在FPGA中的執(zhí)行效率高于在CPU中的執(zhí)行效率。
另外,也可以將可加速代碼轉(zhuǎn)換為邏輯語言代碼,在將轉(zhuǎn)換后的邏輯語言代碼編譯成FPGA可執(zhí)行代碼。
307、調(diào)度管理器將CPU可執(zhí)行代碼加載到CPU上執(zhí)行;
調(diào)度管理器接收來自編譯器的CPU可執(zhí)行代碼,調(diào)度管理器將CPU可執(zhí)行代碼加載到CPU上執(zhí)行。
308、調(diào)度管理器將FPGA可執(zhí)行代碼加載到FPGA上執(zhí)行;
調(diào)度管理器接收來自編譯器的FPGA可執(zhí)行代碼,調(diào)度管理器將FPGA可執(zhí)行代碼加載到FPGA上執(zhí)行。
需要說明的是,步驟307可以位于步驟308后面,步驟307與步驟308 之間的順序可以調(diào)換。
309、CPU和FPGA執(zhí)行代碼的交互。
可以通過預(yù)配置的互操作協(xié)議來實(shí)現(xiàn)CPU可執(zhí)行代碼和FPGA可執(zhí)行代碼的交互,具體地,可以定義互操作原語:
Handshake,握手。
Negotiate,協(xié)商能力,包括各自支持的能力和規(guī)格,使用的互操作協(xié)議版本和特性等。
WriteData,直接向?qū)Ψ綄憯?shù)據(jù)。
ReadData,直接向?qū)Ψ阶x數(shù)據(jù)。
WriteDataAddress,通過地址向?qū)Ψ綄憯?shù)據(jù)。比如在DMA方式下,通過對(duì)方告訴的一個(gè)內(nèi)存地址和長(zhǎng)度,向該地址中寫內(nèi)容。
ReadDataAddress,通過地址向?qū)Ψ阶x數(shù)據(jù)。比如在DMA方式下,通過對(duì)方告訴的一個(gè)內(nèi)存地址和長(zhǎng)度,向該地址中讀內(nèi)容。
Call,調(diào)用對(duì)方的功能。
Callback,調(diào)用對(duì)方的功能,該功能執(zhí)行后的返回值或者功能回調(diào)。
本實(shí)施例中,編譯器將源代碼中與FPGA匹配的代碼段編譯成FPGA可執(zhí)行代碼,將源代碼中與CPU匹配的代碼段編譯成CPU可執(zhí)行代碼;FPGA可執(zhí)行代碼被發(fā)往了FPGA,CPU可執(zhí)行代碼被發(fā)往了CPU,因此源代碼中的代碼段對(duì)應(yīng)的可執(zhí)行代碼被分配到匹配度較高的硬件來執(zhí)行,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
為了便于理解,下面對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行詳細(xì)描述,請(qǐng)參閱圖5,本發(fā)明實(shí)施例中一種硬件加速方法包括:
401、編譯器接收調(diào)度管理器下發(fā)的編譯策略信息和硬件信息;
本實(shí)施例中,編譯策略信息為:統(tǒng)計(jì)源代碼中的可加速代碼在CPU中的執(zhí)行次數(shù),當(dāng)執(zhí)行次數(shù)達(dá)到第一預(yù)定閾值(本實(shí)施例假設(shè)第一預(yù)定閾值為100)后,將可加速代碼編譯成FPGA可執(zhí)行代碼并在FPGA中加載運(yùn)行。
402、編譯器接收源代碼;
假設(shè)本實(shí)施例中的源代碼為:
403、編譯器分析該源代碼,確定可加速代碼;
步驟403與步驟303類似,此處不再贅述。
404、編譯器將源代碼中的普通代碼轉(zhuǎn)換為中間源代碼;
中間源代碼可以為:
405、編譯器將中間源代碼編譯成CPU可執(zhí)行代碼,并向調(diào)度管理器發(fā) 送CPU可執(zhí)行代碼;
406、編譯器將可加速代碼編譯成FPGA可執(zhí)行代碼,并向調(diào)度管理器發(fā)送FPGA可執(zhí)行代碼,F(xiàn)PGA可執(zhí)行代碼攜帶調(diào)用FPGA的指示信息;
步驟405、步驟406與步驟305、步驟306類似,此處不再贅述。
另外,步驟405可以位于步驟406后面,步驟405與步驟406之間的順序可以調(diào)換。
此外,編譯器在FPGA可執(zhí)行代碼中添加調(diào)用FPGA的指示信息。其中指示信息表示:當(dāng)FPGA可執(zhí)行代碼在CPU中的執(zhí)行次數(shù)大于100次(說明執(zhí)行效率過低),則將FPGA可執(zhí)行代碼發(fā)往FPGA。
407、調(diào)度管理器將CPU可執(zhí)行代碼加載到CPU上執(zhí)行,將FPGA可執(zhí)行代碼加載到CPU上執(zhí)行;
408、CPU根據(jù)指示信息將FPGA可執(zhí)行代碼發(fā)往FPGA;
在確定FPGA可執(zhí)行代碼在CPU中的執(zhí)行次數(shù)大于100次后,CPU根據(jù)指示信息將FPGA可執(zhí)行代碼發(fā)往FPGA。
409、CPU和FPGA執(zhí)行代碼的交互。
本實(shí)施例中,首先將FPGA可執(zhí)行代碼和CPU可執(zhí)行代碼發(fā)送給CPU,CPU根據(jù)FPGA可執(zhí)行代碼攜帶的指示信息以及FPGA可執(zhí)行代碼在CPU中的執(zhí)行次數(shù)大于第一預(yù)定閾值,將FPGA可執(zhí)行代碼發(fā)往FPGA,由于FPGA可執(zhí)行代碼在FPGA中執(zhí)行效率更高,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
為了便于理解,下面對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行詳細(xì)描述,請(qǐng)參閱圖6,本發(fā)明實(shí)施例中一種硬件加速方法包括:
501、編譯器接收調(diào)度管理器下發(fā)的編譯策略信息和硬件信息;
502、編譯器接收源代碼;
503、編譯器分析該源代碼,確定可加速代碼;
504、編譯器將源代碼中的普通代碼轉(zhuǎn)換為中間源代碼;
505、編譯器將中間源代碼編譯成第一CPU可執(zhí)行代碼,并向調(diào)度管理器發(fā)送第一CPU可執(zhí)行代碼;
506、編譯器將可加速代碼編譯成第一FPGA可執(zhí)行代碼,并向調(diào)度管理 器發(fā)送第一FPGA可執(zhí)行代碼;
步驟501至步驟506與步驟401至步驟406類似,此處不再贅述。
507、調(diào)度管理器將第一CPU可執(zhí)行代碼加載到CPU上執(zhí)行;
508、調(diào)度管理器將第一FPGA可執(zhí)行代碼加載到FPGA上執(zhí)行;
需要說明的是,步驟507可以位于步驟508后面,步驟507與步驟508之間的順序可以調(diào)換。
509、CPU確定第一CPU可執(zhí)行代碼中各代碼的執(zhí)行次數(shù);
第一CPU可執(zhí)行代碼中可能存在執(zhí)行效率較低的代碼,這些執(zhí)行效率低的代碼執(zhí)行次數(shù)也就高,故可以通過執(zhí)行次數(shù)找出可加速代碼。
510、CPU向調(diào)度管理器上報(bào)執(zhí)行次數(shù)的統(tǒng)計(jì)信息;
當(dāng)?shù)谝籆PU可執(zhí)行代碼中存在代碼的執(zhí)行次數(shù)大于100次時(shí),說明該代碼可以被加速,可以由FPGA來執(zhí)行該代碼,因此CPU向調(diào)度管理器上報(bào)統(tǒng)計(jì)信息,統(tǒng)計(jì)信息為該代碼的執(zhí)行次數(shù);需要說明的是,F(xiàn)PGA也有可能向調(diào)度管理器上報(bào)統(tǒng)計(jì)信息(此時(shí)在FPGA中存在執(zhí)行效率低的代碼)。
511、調(diào)度管理器修改編譯策略信息,并將修改后的編譯策略信息發(fā)往編譯器;
調(diào)度管理器接收到統(tǒng)計(jì)信息后,確定執(zhí)行次數(shù)大于100次,調(diào)度管理器修改編譯策略信息,并將修改后的編譯策略信息發(fā)往編譯器。
512、編譯器根據(jù)編譯策略信息重新編譯,生成第二CPU可執(zhí)行代碼和第二FPGA可執(zhí)行代碼,向調(diào)度管理器發(fā)送第二CPU可執(zhí)行代碼和第二FPGA可執(zhí)行代碼;
可以理解的是,編譯器將源代碼重新編譯生成中間源代碼,顯然,此處的中間源代碼和步驟404中的源代碼是不同的。
513、調(diào)度管理器將第二CPU可執(zhí)行代碼加載到CPU上執(zhí)行;
514、調(diào)度管理器將第二FPGA可執(zhí)行代碼加載到FPGA上執(zhí)行;
515、CPU和FPGA執(zhí)行代碼的交互。
步驟513至步驟515與步驟307至步驟309類似,此處不再贅述。
本實(shí)施例中,當(dāng)CPU可執(zhí)行代碼中存在代碼的執(zhí)行次數(shù)大于第一預(yù)定閾值時(shí),說明執(zhí)行速度過慢,所以通過調(diào)度管理器修改編譯策略信息,使編譯 器重新編譯,生成新的CPU可執(zhí)行代碼和新的FPGA可執(zhí)行代碼,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
為了便于理解,下面對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行詳細(xì)描述,請(qǐng)參閱圖7,本發(fā)明實(shí)施例中一種硬件加速方法包括:
601、編譯器接收調(diào)度管理器下發(fā)的編譯策略信息和硬件信息;
602、編譯器接收源代碼;
603、編譯器分析該源代碼,確定可加速代碼;
604、編譯器將源代碼轉(zhuǎn)換為中間源代碼;
605、編譯器將中間源代碼編譯成第一CPU可執(zhí)行代碼,并向調(diào)度管理器發(fā)送第一CPU可執(zhí)行代碼;
步驟601至步驟605與步驟401至步驟405類似,此處不再贅述。
另外,可以理解的是,源代碼中的可加速代碼也被編譯成第一CPU可執(zhí)行代碼。
606、調(diào)度管理器將第一CPU可執(zhí)行代碼加載到CPU上執(zhí)行;
607、CPU確定可加速代碼在CPU中的執(zhí)行次數(shù);
可加速代碼也被編譯成第一CPU可執(zhí)行代碼,顯然,可加速代碼在CPU中的執(zhí)行效率不高,也就是執(zhí)行次數(shù)會(huì)比普通代碼執(zhí)行次數(shù)更多。
608、CPU向調(diào)度管理器上報(bào)執(zhí)行次數(shù)的統(tǒng)計(jì)信息;
當(dāng)執(zhí)行次數(shù)大于100時(shí),說明該可加速代碼可以由FPGA來執(zhí)行,來提高執(zhí)行效率,因此CPU向調(diào)度管理器上報(bào)執(zhí)行次數(shù)的統(tǒng)計(jì)信息。
609、調(diào)度管理器修改編譯策略信息,并將修改后的編譯策略信息發(fā)往編譯器;
當(dāng)調(diào)度管理器通過統(tǒng)計(jì)信息確定可加速代碼在CPU中的執(zhí)行效率不高時(shí),調(diào)度管理器修改編譯策略信息,并將修改后的編譯策略信息發(fā)往編譯器。
610、編譯器根據(jù)修改后的編譯策略信息將源代碼中的普通代碼重新生成中間源代碼;
611、編譯器將重新生成的中間源代碼編譯成第二CPU可執(zhí)行代碼,并發(fā)送給調(diào)度管理器;
612、編譯器將可加速代碼編譯成FPGA可執(zhí)行代碼,并發(fā)送給調(diào)度管理 器;
613、調(diào)度管理器將第二CPU可執(zhí)行代碼加載到CPU上執(zhí)行;
614、調(diào)度管理器將FPGA可執(zhí)行代碼加載到FPGA上執(zhí)行;
615、CPU和FPGA執(zhí)行代碼的交互。
本實(shí)施例中,編譯器將源代碼轉(zhuǎn)換為中間源代碼,再將中間源代碼編譯為CPU可執(zhí)行代碼(同時(shí),未編譯FPGA可執(zhí)行代碼),當(dāng)CPU可執(zhí)行代碼中存在代碼的執(zhí)行次數(shù)大于第一預(yù)定閾值時(shí),說明該代碼可以由FPGA來執(zhí)行,來提高執(zhí)行效率,通過重新編譯的方法,生成FPGA可執(zhí)行代碼和新的CPU可執(zhí)行代碼,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
需要說明的是,上述各實(shí)施例中,編譯策略信息還可以為:
一定時(shí)間內(nèi)代碼在CPU中的執(zhí)行次數(shù)達(dá)到第一預(yù)定閾值,則編譯成FPGA可執(zhí)行代碼并加載運(yùn)行。或者統(tǒng)計(jì)代碼的執(zhí)行時(shí)間,當(dāng)執(zhí)行時(shí)間超過第一預(yù)定閾值,則編譯成FPGA可執(zhí)行代碼并加載運(yùn)行。
另外,統(tǒng)計(jì)源代碼中的代碼在CPU中的執(zhí)行次數(shù)可以在編譯階段由編譯器智能插入統(tǒng)計(jì)功能代碼,也可以在CPU中擴(kuò)展統(tǒng)計(jì)指令集,通過統(tǒng)計(jì)指令集對(duì)代碼進(jìn)行統(tǒng)計(jì),編譯器在編譯時(shí)自動(dòng)調(diào)用擴(kuò)展統(tǒng)計(jì)指令集。進(jìn)一步的,也可以通過外部程序或人工干預(yù)的方法。
進(jìn)一步的,當(dāng)FPGA接收到FPGA可執(zhí)行代碼,但是FPGA中沒有足夠的資源來執(zhí)行加速,則判斷該FPGA可執(zhí)行代碼對(duì)應(yīng)的進(jìn)程1的優(yōu)先級(jí)是否高于正在FPGA中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的進(jìn)程2的優(yōu)先級(jí)(優(yōu)先級(jí)可以根據(jù)進(jìn)程預(yù)先設(shè)置),若判斷是,則將進(jìn)程2在FPGA中加速的功能占用的資源釋放出來,由進(jìn)程1來使用。
為了便于理解,下面對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行詳細(xì)描述,請(qǐng)參閱圖8,本發(fā)明實(shí)施例中另一種硬件加速方法包括:
701、CPU確定FPGA中FPGA可執(zhí)行代碼的執(zhí)行次數(shù);
需要說明的是,F(xiàn)PGA可執(zhí)行代碼的執(zhí)行次數(shù)還可以由FPGA本身統(tǒng)計(jì)得到。
步驟701之前,已經(jīng)有可執(zhí)行代碼分別在CPU和FPGA中運(yùn)行,并且原編譯策略信息為:在一段時(shí)間內(nèi)統(tǒng)計(jì)FPGA可執(zhí)行代碼在FPGA中的執(zhí)行次 數(shù),當(dāng)執(zhí)行次數(shù)小于第一預(yù)定閾值(100)時(shí),將FPGA可執(zhí)行代碼對(duì)應(yīng)的代碼重新編譯為CPU可執(zhí)行代碼并在CPU中加載運(yùn)行。
702、CPU向調(diào)度管理器上報(bào)執(zhí)行次數(shù)的統(tǒng)計(jì)信息;
703、調(diào)度管理器修改編譯策略信息,并將修改后的編譯策略信息發(fā)往編譯器;
當(dāng)統(tǒng)計(jì)信息中的執(zhí)行次數(shù)小于100時(shí),修改編譯策略信息,修改的編譯策略信息為:不使用FPGA加速,重新編譯和加載。
704、編譯器根據(jù)修改后的編譯策略信息重新將FPGA可執(zhí)行代碼對(duì)應(yīng)的源代碼轉(zhuǎn)換為新的中間源代碼;
假設(shè)源代碼為:void func2(bool c,FILE*file1,FILE*file2)
步驟701之前,源代碼轉(zhuǎn)換的中間源代碼可以為:
則編譯器根據(jù)修改后的編譯策略信息,重新生成的中間源代碼可以為:
705、編譯器將新的中間源代碼編譯成CPU可執(zhí)行代碼,并發(fā)送給調(diào)度管理器;
706、調(diào)度管理器將CPU可執(zhí)行代碼加載到CPU上執(zhí)行;
707、調(diào)度管理器將FPGA可執(zhí)行代碼從FPGA中卸載。
本實(shí)施例中,當(dāng)FPGA中執(zhí)行的代碼在一定時(shí)間內(nèi)執(zhí)行次數(shù)小于第一預(yù)定閾值時(shí),說明此時(shí)FPGA執(zhí)行效率不高,故重新編譯,通過CPU來執(zhí)行,因此能夠提高執(zhí)行效率,實(shí)現(xiàn)硬件加速。
為了便于理解,下面以一實(shí)際的應(yīng)用場(chǎng)景對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行描述:
調(diào)度管理器配置編譯策略信息以及硬件信息(CPU和FPGA),調(diào)度管理機(jī)將該編譯策略信息以及硬件信息發(fā)送給編譯器,編譯器接收源代碼,編譯器預(yù)先設(shè)置一個(gè)可加速代碼特征庫(kù),將源代碼和該可加速代碼特征庫(kù)中的特征規(guī)則進(jìn)行比較,該特征規(guī)則為:如果源代碼中存在匹配的代碼段,則表明該代碼段可以用FPGA加速。在編譯器通過特征規(guī)則確定了屬于普通代碼類型的第一代碼段,以及屬于可加速代碼類型的第二代碼段后,將該第一代碼段編譯為CPU可執(zhí)行代碼,通過調(diào)度管理器發(fā)送給CPU,將該第二代碼段編譯為FPGA可執(zhí)行代碼,通過調(diào)度管理器發(fā)送給FPGA。
上面對(duì)本發(fā)明實(shí)施例中的硬件加速方法進(jìn)行了描述,下面對(duì)本發(fā)明實(shí)施例中的編譯器進(jìn)行描述,請(qǐng)參閱圖9,本發(fā)明實(shí)施例編譯器包括:
獲取單元801,用于獲取編譯策略信息以及源代碼;該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
確定單元802,用于根據(jù)該編譯策略信息分析該源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
編譯單元803,用于將第一代碼段編譯為第一可執(zhí)行代碼,將第二代碼段編譯為第二可執(zhí)行代碼;
發(fā)送單元804,用于將該第一可執(zhí)行代碼發(fā)往該第一處理器,將該第二可執(zhí)行代碼發(fā)往該第二處理器。
可選的,上述獲取單元801,用于從本地存儲(chǔ)器中獲取預(yù)配置的編譯策略信息;或者,獲取單元801,用于接收調(diào)度管理器下發(fā)的編譯策略信息。
其中第一處理器和第二處理器分別為:CPU,F(xiàn)PGA,GPU,NP,ASIC,CPLD,PAL和GAL中的任意兩項(xiàng)。可以理解的是,CPU,GPU,NP為具有軟件編程能力的芯片,F(xiàn)PGA,ASIC,PAL,GAL,CPLD為可編程邏輯器件。
若該第二代碼段對(duì)應(yīng)進(jìn)程的優(yōu)先級(jí)高于正在該第二處理器中執(zhí)行的可執(zhí) 行代碼對(duì)應(yīng)的進(jìn)程的優(yōu)先級(jí),可選的,本實(shí)施例還包括:
第一處理單元805,用于若該第二處理器的繁忙度高于第二預(yù)定閾值,則停止正在該第二處理器中執(zhí)行的可執(zhí)行代碼;
第二處理單元806,用于將正在該第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼,發(fā)送給該第一處理器。
可選的,上述發(fā)送單元804,用于通過調(diào)度管理器將該第二可執(zhí)行代碼發(fā)送給該第二處理器;或者,編譯單元803還用于在該第二可執(zhí)行代碼中添加調(diào)用第二處理器的指示信息;發(fā)送單元804還用于將第二可執(zhí)行代碼發(fā)送給調(diào)度管理器,通過調(diào)度管理器將該第二可執(zhí)行代碼發(fā)送給該第一處理器,使該第一處理器獲取到該指示信息后將該第二可執(zhí)行代碼發(fā)往該第二處理器。
當(dāng)?shù)谝惶幚砥鳛镃PU,第二處理器為FPGA時(shí),可選的,確定單元802用于統(tǒng)計(jì)該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間,若統(tǒng)計(jì)得到的參數(shù)超過第一預(yù)定閾值,則確定該代碼段屬于第二代碼段,否則確定該代碼段屬于第一代碼段;或者,
確定單元802用于將該源代碼中的代碼段與第二代碼段的特征規(guī)則進(jìn)行比較,若與該第二代碼段的特征規(guī)則匹配,則確定該代碼段為第二代碼段,否則,確定該代碼段為第一代碼段;或者,
確定單元802用于讀取該源代碼中的加速標(biāo)識(shí)信息,依據(jù)該加速標(biāo)識(shí)信息的指示確定該源代碼中的代碼屬于第一代碼段或第二代碼段;或者,
確定單元802用于調(diào)用統(tǒng)計(jì)指令集通過該源代碼中的功能代碼確定該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;或者,
確定單元802用于獲取定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表確定該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間。
可選的,本實(shí)施例還包括:第三處理單元807,用于在該第一可執(zhí)行代碼以及該第二可執(zhí)行代碼中添加交互指令,使該第二處理器向該第一處理器返回該第二可執(zhí)行代碼的執(zhí)行結(jié)果。
本實(shí)施例中,編譯器將源代碼中與第一處理器匹配的代碼段編譯成第一處理器可以執(zhí)行的第一可執(zhí)行代碼,將源代碼中與第二處理器匹配的代碼段編譯成第二處理器可以執(zhí)行的第二可執(zhí)行代碼;第一可執(zhí)行代碼被發(fā)往了第 一處理器,第二可執(zhí)行代碼被發(fā)往了第二處理器,因此源代碼中的代碼段對(duì)應(yīng)的可執(zhí)行代碼被分配到匹配度較高的硬件來執(zhí)行,因此執(zhí)行效率會(huì)更高,實(shí)現(xiàn)了硬件加速。
請(qǐng)參閱圖10,本發(fā)明實(shí)施例中編譯器包括:
獲取單元901,用于獲取編譯策略信息以及源代碼;該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
第一編譯單元902,用于根據(jù)該編譯策略信息將該源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼;
第一發(fā)送單元903,用于將該第一可執(zhí)行代碼發(fā)往該第一處理器;
第一接收單元904,用于接收第一處理器統(tǒng)計(jì)的第一可執(zhí)行代碼的第一執(zhí)行信息;
第一處理單元905,用于依據(jù)該第一執(zhí)行信息確定該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段是否與第二處理器匹配;
第二編譯單元906,用于該第一處理單元905依據(jù)該第一執(zhí)行信息確定該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配,則將該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼;
第二發(fā)送單元907,用于將該第二可執(zhí)行代碼發(fā)往第二處理器。
可選的,本實(shí)施例還包括:
第二接收單元908,用于接收來自該第二處理器執(zhí)行該第二可執(zhí)行代碼的第二執(zhí)行信息;
第二處理單元909,用于若依據(jù)該第二執(zhí)行信息確定該第二可執(zhí)行代碼對(duì)應(yīng)的代碼段與該第二處理器匹配度低于期望值,則在該第二處理器卸載該第二可執(zhí)行代碼,將該第二可執(zhí)行代碼對(duì)應(yīng)的代碼段對(duì)應(yīng)的第一可執(zhí)行代碼發(fā)往該第一處理器。
本實(shí)施例中,將源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼,當(dāng)確定第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配時(shí),將第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼,通過第二處理器接收第二可執(zhí)行代碼,通過不同的硬件執(zhí)行不同的代碼類型,提高了執(zhí)行效率。
此外,當(dāng)?shù)诙蓤?zhí)行代碼在第二處理器執(zhí)行效率不高時(shí),則在第二處理 器上卸載該第二可執(zhí)行代碼,并對(duì)第二可執(zhí)行代碼對(duì)應(yīng)的代碼段重新編譯,通過第一處理器來執(zhí)行。
為了便于理解,下面以一實(shí)際的應(yīng)用場(chǎng)景對(duì)本實(shí)施例中設(shè)備各單元間的交互進(jìn)行描述:
調(diào)度管理器配置編譯策略信息,調(diào)度管理器將該編譯策略信息發(fā)送給獲取單元801,同時(shí),獲取單元801接收源代碼。其中該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配。代碼類型包括:可加速代碼以及普通代碼。其中可加速代碼可以為:CPU指令,代碼塊,函數(shù)(模塊)以及源文件。在獲取編譯策略信息以及源代碼后,確定單元802根據(jù)該編譯策略信息分析該源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段。
編譯單元803通過編譯器中的編譯單元將第一代碼段編譯為第一可執(zhí)行代碼,發(fā)送單元804將該第一可執(zhí)行代碼通過調(diào)度管理器發(fā)往上述第一處理器。同理,編譯單元803將第二代碼段編譯為第二可執(zhí)行代碼,由于不同的執(zhí)行邏輯(任務(wù),進(jìn)程,線程等)具有不同的優(yōu)先級(jí),因此存在一種可能,即上述第二代碼段對(duì)應(yīng)進(jìn)程的優(yōu)先級(jí)高于正在該第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的進(jìn)程的優(yōu)先級(jí)。當(dāng)?shù)诙幚砥髦袥]有足夠的資源來執(zhí)行第二可執(zhí)行代碼時(shí)(也即是通過第一處理單元805說明第二處理器的繁忙度高于預(yù)設(shè)閾值),則將第二處理器中正在執(zhí)行的可執(zhí)行代碼占用的資源釋放出來(也即是停止正在該第二處理器中執(zhí)行的可執(zhí)行代碼);第二處理單元806將正在第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼,發(fā)送給該第一處理器;這樣第二處理器就有足夠的資源來執(zhí)行第二可執(zhí)行代碼,將該第二可執(zhí)行代碼發(fā)往上述第二處理器。
請(qǐng)參閱圖11,本發(fā)明實(shí)施例中編譯器包括:
輸入單元1001、編譯單元1002和輸出單元1003;
其中輸入單元1001,用于接收源代碼、編譯策略信息、硬件信息以及可加速代碼描述特征庫(kù);
編譯單元1002,用于編譯CPU可執(zhí)行代碼以及FPGA可執(zhí)行代碼;
輸出單元1003,用于將CPU可執(zhí)行代碼和FPGA可執(zhí)行代碼發(fā)送出去。
其中編譯單元1002有三個(gè)核心的功能組件,可參考圖12,分別是:編譯控制單元、CPU編譯單元以及FPGA編譯單元。
編譯策略信息和硬件信息可以通過外部程序輸入,也可以由編譯控制單元進(jìn)行操作。
編譯控制單元識(shí)別并執(zhí)行編譯策略信息,識(shí)別和處理可加速代碼描述特征庫(kù),增減和修改規(guī)則,還可以根據(jù)可加速代碼描述特征庫(kù)、編譯側(cè)羅和硬件信息來檢測(cè)源代碼中是否有可加速的代碼,然后根據(jù)檢測(cè)結(jié)果生成中間源代碼。
CPU編譯單元用來編譯生成CPU可執(zhí)行代碼,F(xiàn)PGA編譯單元用來編譯生成FPGA可執(zhí)行代碼。FPGA編譯單元可以直接根據(jù)源代碼或中間源代碼來編譯,也可以將可加速代碼或者中間源代碼翻譯轉(zhuǎn)換成邏輯語言代碼,再將邏輯語言代碼編譯成FPGA可執(zhí)行代碼。
需要說明的是,一個(gè)編譯控制單元可以管理一個(gè)或多個(gè)CPU編譯單元,一個(gè)編譯控制單元可以管理一個(gè)或多個(gè)FPGA編譯單元,一個(gè)CPU編譯單元或FPGA編譯單元可以受一個(gè)或多個(gè)編譯控制單元管理。
本發(fā)明實(shí)施例還提供一種設(shè)備,請(qǐng)參閱圖13,本發(fā)明實(shí)施例中設(shè)備包括:
編譯器和調(diào)度管理器,該編譯器包括:
獲取單元1101、確定單元1102、編譯單元1103以及發(fā)送單元1104;
獲取單元1101,用于獲取編譯策略信息以及源代碼;該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
確定單元1102,用于根據(jù)該編譯策略信息分析該源代碼中的代碼段,確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段;
編譯單元1103,用于將第一代碼段編譯為第一可執(zhí)行代碼,將第二代碼段編譯為第二可執(zhí)行代碼;
發(fā)送單元1104,用于將該第一可執(zhí)行代碼和該第二可執(zhí)行代碼發(fā)送給調(diào)度管理器;
調(diào)度管理器,用于將該第一可執(zhí)行代碼發(fā)往該第一處理器,將該第二可執(zhí)行代碼發(fā)往該第二處理器。
可選的,調(diào)度管理器,還用于配置編譯策略信息,將編譯策略信息發(fā)送 給編譯器。
調(diào)度管理器,還用于若該第二處理器的繁忙度高于第二預(yù)定閾值,在該編譯器停止正在該第二處理器中執(zhí)行的可執(zhí)行代碼,將正在該第二處理器中執(zhí)行的可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為與第一處理器匹配的可執(zhí)行代碼后,接收來自該與第一處理器匹配的可執(zhí)行代碼,并發(fā)送給第一處理器。
進(jìn)一步可選的,若第一處理器為CPU,第二處理器為FPGA,確定單元1102,還用于調(diào)用統(tǒng)計(jì)指令集通過該源代碼中的功能代碼確定該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;或者
調(diào)度管理器,還用于獲取定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表,將該定時(shí)統(tǒng)計(jì)的代碼執(zhí)行統(tǒng)計(jì)報(bào)表發(fā)送給該編譯器;
確定單元1102,還用于依據(jù)該代碼執(zhí)行統(tǒng)計(jì)報(bào)表確定該源代碼中的代碼段的循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間;
確定單元1102用于確定屬于第一代碼類型的第一代碼段或?qū)儆诘诙a類型的第二代碼段包括:若該循環(huán)執(zhí)行次數(shù)和/或CPU的執(zhí)行時(shí)間超過第一預(yù)定閾值,則確定該代碼段屬于第二代碼段,否則確定該代碼段屬于第一代碼段。
本發(fā)明實(shí)施例還提供一種設(shè)備,請(qǐng)參閱圖14,本發(fā)明實(shí)施例中設(shè)備包括:
編譯器和調(diào)度管理器,該編譯器包括:
獲取單元1201、編譯單元1202、發(fā)送單元1203、接收單元1204以及處理單元1205;
獲取單元1201,用于獲取編譯策略信息以及源代碼;該編譯策略信息指示第一代碼類型與第一處理器匹配,第二代碼類型與第二處理器匹配;
編譯單元1202,用于根據(jù)該編譯策略信息將該源代碼中的代碼段編譯為與第一處理器匹配的第一可執(zhí)行代碼;
發(fā)送單元1203,用于將該第一可執(zhí)行代碼發(fā)送給第一處理器;
接收單元1204,用于接收第一處理器統(tǒng)計(jì)的第一可執(zhí)行代碼的第一執(zhí)行信息;
處理單元1205,用于依據(jù)該第一執(zhí)行信息確定該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段是否與第二處理器匹配;
編譯單元1202,還用于該處理單元1205依據(jù)該第一執(zhí)行信息確定第一可執(zhí)行代碼對(duì)應(yīng)的代碼段與第二處理器匹配,則將該第一可執(zhí)行代碼對(duì)應(yīng)的代碼段編譯為第二可執(zhí)行代碼;
發(fā)送單元1203,還用于將該第二可執(zhí)行代碼發(fā)送給調(diào)度管理器;
調(diào)度管理器,用于將第二可執(zhí)行代碼發(fā)往該第二處理器。
可選的,調(diào)度管理器,還用于接收來自該第二處理器執(zhí)行該第二可執(zhí)行代碼的第二執(zhí)行信息,依據(jù)該第二執(zhí)行信息確定該第二可執(zhí)行代碼對(duì)應(yīng)的代碼段與該第二處理器匹配度低于期望值,則在該第二處理器卸載該第二可執(zhí)行代碼;將該第二可執(zhí)行代碼對(duì)應(yīng)的代碼段對(duì)應(yīng)的第一可執(zhí)行代碼發(fā)往該第一處理器。
本發(fā)明實(shí)施例還提供一種服務(wù)器,請(qǐng)參閱圖15,本發(fā)明實(shí)施例中服務(wù)器包括:
該服務(wù)器1300可因配置或性能不同而產(chǎn)生比較大的差異,可以包括編譯器1301、調(diào)度管理器1302、FPGA1303、一個(gè)或一個(gè)以上中央處理器(central processing units,CPU)1304(例如,一個(gè)或一個(gè)以上處理器)和存儲(chǔ)器1305,一個(gè)或一個(gè)以上存儲(chǔ)應(yīng)用程序1306或數(shù)據(jù)1307的存儲(chǔ)介質(zhì)1308(例如一個(gè)或一個(gè)以上海量存儲(chǔ)設(shè)備)。其中,存儲(chǔ)器1305和存儲(chǔ)介質(zhì)1308可以是短暫存儲(chǔ)或持久存儲(chǔ)。存儲(chǔ)在存儲(chǔ)介質(zhì)1308的程序可以包括一個(gè)或一個(gè)以上模塊(圖示沒標(biāo)出),每個(gè)模塊可以包括對(duì)服務(wù)器中的一系列指令操作。更進(jìn)一步地,中央處理器1304可以設(shè)置為與存儲(chǔ)介質(zhì)1308通信,在服務(wù)器1301上執(zhí)行存儲(chǔ)介質(zhì)1305中的一系列指令操作。
服務(wù)器1300還可以包括一個(gè)或一個(gè)以上電源1309,一個(gè)或一個(gè)以上有線或無線網(wǎng)絡(luò)接口1310,一個(gè)或一個(gè)以上輸入輸出接口1311,和/或,一個(gè)或一個(gè)以上操作系統(tǒng)1312,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,F(xiàn)reeBSDTM等等。
值得注意的是,上述設(shè)備和編譯器實(shí)施例中,所包括的各個(gè)單元只是按照功能邏輯進(jìn)行劃分的,但并不局限于上述的劃分,只要能夠?qū)崿F(xiàn)相應(yīng)的功能即可;另外,各功能單元的具體名稱也只是為了便于相互區(qū)分,并不用于限制本發(fā)明的保護(hù)范圍。
另外,本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述各方法實(shí)施例中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件完成,相應(yīng)的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。
以上僅為本發(fā)明較佳的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明實(shí)施例揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。