本公開的實施例涉及一種代碼編譯方法、電子設(shè)備和存儲介質(zhì)。
背景技術(shù):
1、底層虛擬機(low-level?virtual?machine,llvm)是一個開源的編譯器框架,它被設(shè)計為一種模塊化、可重用的編譯器及工具鏈技術(shù)的集合。llvm支持線程本地存儲(threadlocal?storage,tls)模型,可以定義線程本地存儲變量,使得每個線程都有獨立的變量副本,從而避免線程間的數(shù)據(jù)競爭問題。
技術(shù)實現(xiàn)思路
1、本公開至少一實施例提供一種代碼編譯方法,其中,所述代碼包括至少一個線程本地存儲變量,所述代碼編譯方法包括:獲取所述代碼中每個第一函數(shù)所使用的線程本地存儲變量的記錄,并將所述記錄傳遞給驅(qū)動器,以使所述驅(qū)動器在運行時根據(jù)所述記錄將每個線程本地存儲變量分配至線程本地內(nèi)存;根據(jù)所述代碼對應(yīng)的中間表示生成所述代碼對應(yīng)的機器碼,其中,所述機器碼包括加載指令,所述加載指令在被執(zhí)行時用于基于所述驅(qū)動器的分配結(jié)果獲取每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址。
2、在本公開至少一實施例提供的代碼編譯方法中,所述根據(jù)所述代碼對應(yīng)的中間表示生成所述代碼對應(yīng)的機器碼,包括:將所述代碼對應(yīng)的中間表示中用于獲取線程本地存儲變量的地址的指令轉(zhuǎn)換為所述加載指令。
3、本公開至少一實施例提供的代碼編譯方法還包括:在所述代碼對應(yīng)的中間表示中插入對每個第一函數(shù)所使用的線程本地存儲變量進行初始化的指令。
4、在本公開至少一實施例提供的代碼編譯方法中,獲取所述代碼中每個第一函數(shù)所使用的線程本地存儲變量的記錄,包括:對于每個線程本地存儲變量,確定使用所述線程本地存儲變量的第一函數(shù),以構(gòu)建線程本地存儲變量-第一函數(shù)映射關(guān)系;對所述映射關(guān)系進行反向映射,得到所述代碼中每個第一函數(shù)所使用的線程本地存儲變量的記錄。
5、在本公開至少一實施例提供的代碼編譯方法中,所述第一函數(shù)直接使用所述線程本地存儲變量,或者通過調(diào)用第二函數(shù)以使用所述線程本地存儲變量。
6、在本公開至少一實施例提供的代碼編譯方法中,所述第一函數(shù)是由主機端調(diào)用且由設(shè)備端執(zhí)行的函數(shù),所述第二函數(shù)是由設(shè)備端調(diào)用且由設(shè)備端執(zhí)行的函數(shù)。
7、本公開至少一實施例提供的代碼編譯方法還包括:針對未被使用的線程本地存儲變量,從所述代碼對應(yīng)的中間表示中移除用于獲取所述未被使用的線程本地存儲變量的地址的指令。
8、本公開至少一實施例提供的代碼編譯方法還包括:從所述代碼對應(yīng)的中間表示中移除重復(fù)的用于獲取線程本地存儲變量的地址的指令,使得對每個第一函數(shù)內(nèi)的每個線程本地存儲變量僅獲取一次地址。
9、在本公開至少一實施例提供的代碼編譯方法中,所述加載指令進一步用于:針對每個第一函數(shù),從所述第一函數(shù)對應(yīng)的寄存器中讀取所述第一函數(shù)所使用的線程本地存儲變量的地址表;基于所述地址表獲取所述第一函數(shù)所使用的每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址,其中,所述地址表由所述驅(qū)動器在運行時、根據(jù)地址分配結(jié)果在所述第一函數(shù)對應(yīng)的寄存器中創(chuàng)建。
10、在本公開至少一實施例提供的代碼編譯方法中,所述基于所述地址表獲取所述第一函數(shù)所使用的每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址,包括:根據(jù)所述第一函數(shù)對應(yīng)的記錄中每個線程本地存儲變量的順序和所述第一函數(shù)所使用的每個線程本地存儲變量的地址占用大小,計算所述第一函數(shù)所使用的每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址在所述地址表中對應(yīng)的偏移量;基于所述偏移量確定所述第一函數(shù)所使用的每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址。
11、在本公開至少一實施例提供的代碼編譯方法中,所述寄存器包括常量標(biāo)量寄存器。
12、本公開至少一實施例提供一種代碼編譯裝置,其中,所述代碼包括至少一個線程本地存儲變量,所述代碼編譯裝置包括:獲取模塊,被配置為獲取所述代碼中每個第一函數(shù)所使用的線程本地存儲變量的記錄,并將所述記錄傳遞給驅(qū)動器,以使所述驅(qū)動器在運行時根據(jù)所述記錄將每個線程本地存儲變量分配至線程本地內(nèi)存;生成模塊,被配置為根據(jù)所述代碼對應(yīng)的中間表示生成所述代碼對應(yīng)的機器碼,其中所述機器碼包括加載指令,所述加載指令在被執(zhí)行時用于基于所述驅(qū)動器的分配結(jié)果獲取每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址。
13、本公開至少一實施例提供一種電子設(shè)備,該電子設(shè)備包括:至少一個處理器;至少一個存儲器,包括一個或多個計算機程序模塊;其中,所述一個或多個計算機程序模塊被存儲在所述至少一個存儲器中并被配置為由所述至少一個處理器執(zhí)行,所述一個或多個計算機程序模塊用于實現(xiàn)本公開至少一實施例提供的代碼編譯方法。
14、本公開至少一實施例提供一種非瞬時計算機可讀存儲介質(zhì),其上存儲有計算機指令,其中,所述計算機指令被至少一個處理器執(zhí)行時執(zhí)行本公開至少一實施例提供的代碼編譯方法。
15、本公開至少一實施例提供的代碼編譯方法、代碼編譯裝置、電子設(shè)備和非瞬時計算機可讀存儲介質(zhì),采用運行時動態(tài)分配地址空間的機制,核函數(shù)使用了多少線程本地存儲變量,驅(qū)動器就會對應(yīng)為其分配多少線程本地內(nèi)存空間,不會造成線程本地內(nèi)存空間的浪費,提高了線程本地內(nèi)存空間的利用率。
1.一種代碼編譯方法,其中,所述代碼包括至少一個線程本地存儲變量,所述代碼編譯方法包括:
2.根據(jù)權(quán)利要求1所述的代碼編譯方法,其中,所述根據(jù)所述代碼對應(yīng)的中間表示生成所述代碼對應(yīng)的機器碼,包括:
3.根據(jù)權(quán)利要求1所述的代碼編譯方法,還包括:
4.根據(jù)權(quán)利要求1所述的代碼編譯方法,其中,所述獲取所述代碼中每個第一函數(shù)所使用的線程本地存儲變量的記錄,包括:
5.根據(jù)權(quán)利要求4所述的代碼編譯方法,其中,所述第一函數(shù)直接使用所述線程本地存儲變量,或者通過調(diào)用第二函數(shù)以使用所述線程本地存儲變量。
6.根據(jù)權(quán)利要求5所述的代碼編譯方法,其中,所述第一函數(shù)是由主機端調(diào)用且由設(shè)備端執(zhí)行的函數(shù),所述第二函數(shù)是由設(shè)備端調(diào)用且由設(shè)備端執(zhí)行的函數(shù)。
7.根據(jù)權(quán)利要求1所述的代碼編譯方法,還包括:
8.根據(jù)權(quán)利要求1所述的代碼編譯方法,還包括:
9.根據(jù)權(quán)利要求1所述的代碼編譯方法,其中,所述加載指令進一步用于:
10.根據(jù)權(quán)利要求9所述的代碼編譯方法,其中,所述基于所述地址表獲取所述第一函數(shù)所使用的每個線程本地存儲變量對應(yīng)的線程本地內(nèi)存地址,包括:
11.根據(jù)權(quán)利要求9所述的代碼編譯方法,其中,所述寄存器包括常量標(biāo)量寄存器。
12.一種電子設(shè)備,包括:
13.一種非瞬時計算機可讀存儲介質(zhì),其上存儲有計算機指令,其中,所述計算機指令被至少一個處理器執(zhí)行時執(zhí)行權(quán)利要求1-11任一項所述的代碼編譯方法。