本發(fā)明屬于數(shù)據(jù)管理領(lǐng)域,尤其涉及一種數(shù)據(jù)獲取方法及裝置。
背景技術(shù):
目前已有一些工具可以進(jìn)行cuda(computeunifieddevicearchitecture,并行計(jì)算架構(gòu))程序性能分析,但都存在一些不足,比如papi、tau,都需要修改待測(cè)程序源代碼,并多次啟動(dòng)待測(cè)程序,這一方面增加了性能測(cè)試工作的難度和繁瑣程度;另外,tau只能收集單純的硬件計(jì)數(shù)器值,不能收集或計(jì)算綜合性能指標(biāo),而獨(dú)立的硬件計(jì)數(shù)器值難以直接反應(yīng)程序的性能特征,這使得其性能分析結(jié)果難以引導(dǎo)開(kāi)發(fā)者進(jìn)行性能優(yōu)化。
因此,迫切需要一種高效、準(zhǔn)確的數(shù)據(jù)獲取方案來(lái)解決上述技術(shù)問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種數(shù)據(jù)獲取方法及裝置,以解決上述問(wèn)題。
本發(fā)明實(shí)施例提供一種數(shù)據(jù)獲取方法。上述方法包括以下步驟:獲取核函數(shù)參數(shù)即kernel函數(shù)參數(shù)并備份全局變量;通過(guò)調(diào)用對(duì)應(yīng)的庫(kù)函數(shù),執(zhí)行核函數(shù)代碼,讀取事件組信息;根據(jù)所述事件組信息,獲得性能數(shù)據(jù)值。
本發(fā)明實(shí)施例提供一種數(shù)據(jù)獲取裝置,包括備份模塊、讀取模塊、處理模塊;其中,所述備份模塊通過(guò)所述讀取模塊與所述處理模塊相連;
所述備份模塊,用于獲取核函數(shù)參數(shù)即kernel函數(shù)參數(shù)并備份全局變量;
所述讀取模塊,用于通過(guò)調(diào)用對(duì)應(yīng)的庫(kù)函數(shù),執(zhí)行從所述備份模塊中獲取的核函數(shù)代碼,讀取事件組信息;
所述處理模塊,用于根據(jù)從所述讀取模塊中獲取的所述事件組信息,獲得性能數(shù)據(jù)值。
本發(fā)明實(shí)施例提供以下技術(shù)方案:獲取核函數(shù)參數(shù)即kernel函數(shù)參數(shù)并備份全局變量;通過(guò)調(diào)用對(duì)應(yīng)的庫(kù)函數(shù),執(zhí)行所述核函數(shù)代碼,讀取事件組信息;根據(jù)所述事件組信息,獲得性能數(shù)據(jù)值。
上述技術(shù)方案通過(guò)執(zhí)行核函數(shù)代碼,讀取全部事件組信息,獲取性能數(shù)據(jù)值,實(shí)現(xiàn)了高效、準(zhǔn)確的性能數(shù)據(jù)獲取途徑,避免需要修改待測(cè)程序源碼及多次啟動(dòng)待測(cè)程序的繁瑣方式,大大提升了用戶體驗(yàn)。
本發(fā)明實(shí)施例提供以下技術(shù)方案:執(zhí)行核函數(shù)代碼,并讀取事件組信息,判斷是否還有事件組待讀取,若有,則恢復(fù)備份的全局變量和kernel函數(shù)參數(shù)為初始值
上述技術(shù)方案通過(guò)循環(huán)讀取,將事件組信息全部讀取,實(shí)現(xiàn)了整個(gè)程序只需要運(yùn)行一次,即可得到需要的所有性能指標(biāo),實(shí)現(xiàn)了高效、準(zhǔn)確的性能數(shù)據(jù)獲取途徑。
附圖說(shuō)明
此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā)明的示意性實(shí)施例及其說(shuō)明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中:
圖1所示為本發(fā)明實(shí)施例1的數(shù)據(jù)獲取方法處理流程圖;
圖2所示為本發(fā)明實(shí)施例2的對(duì)庫(kù)函數(shù)插樁的具體實(shí)施步驟流程示意圖;
圖3所示為本發(fā)明實(shí)施例3的對(duì)庫(kù)函數(shù)進(jìn)行插樁后kernel函數(shù)的執(zhí)行流程示意圖;
圖4所示為本發(fā)明實(shí)施例4的數(shù)據(jù)獲取裝置結(jié)構(gòu)圖。
具體實(shí)施方式
下文中將參考附圖并結(jié)合實(shí)施例來(lái)詳細(xì)說(shuō)明本發(fā)明。需要說(shuō)明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相互組合。
圖1所示為本發(fā)明實(shí)施例1的數(shù)據(jù)獲取方法處理流程圖,包括以下步驟:
步驟101:獲取核函數(shù)參數(shù)即kernel函數(shù)參數(shù)并備份全局變量;
進(jìn)一步地,建立一個(gè)全局鏈表,用于備份全局變量及kernel函數(shù)參數(shù)。
為了實(shí)現(xiàn)變量的備份與同步更新,本發(fā)明實(shí)施例采用了一個(gè)全局鏈表來(lái)實(shí)現(xiàn),全局鏈表中的每一個(gè)節(jié)點(diǎn)對(duì)應(yīng)于一個(gè)全局內(nèi)存變量,節(jié)點(diǎn)保存了被備份變量的內(nèi)存地址及備份值,通過(guò)對(duì)cudamalloc庫(kù)函數(shù)進(jìn)行插樁,每當(dāng)調(diào)用該函數(shù)時(shí),在鏈表中增加一個(gè)節(jié)點(diǎn),記錄該內(nèi)存地址,通過(guò)對(duì)cudamemcpy庫(kù)函數(shù)進(jìn)行插樁,每當(dāng)調(diào)用該函數(shù)改變內(nèi)存變量的值時(shí),根據(jù)該變量地址搜索鏈接找到該節(jié)點(diǎn),更新節(jié)點(diǎn)備份的值,從而實(shí)現(xiàn)備份值的同步更新。
步驟102:通過(guò)調(diào)用對(duì)應(yīng)的庫(kù)函數(shù),執(zhí)行核函數(shù)代碼,讀取事件組信息;
進(jìn)一步地,通過(guò)執(zhí)行所述核函數(shù)代碼,并讀取事件組信息,判斷是否還有事件組待讀取,若有,則恢復(fù)備份的全局變量和kernel函數(shù)參數(shù)為初始值。
進(jìn)一步地,所述庫(kù)函數(shù)包括cudaconfigurecall庫(kù)函數(shù)、cudasetupargument庫(kù)函數(shù)、cudamalloc庫(kù)函數(shù)、cudamemcpy庫(kù)函數(shù)、cudalauch庫(kù)函數(shù)。
進(jìn)一步地,重寫(xiě)cudaconfigurecall庫(kù)函數(shù)、cudasetupargument庫(kù)函數(shù);其中,通過(guò)所述全局鏈表,記錄kernel函數(shù)參數(shù)。
進(jìn)一步地,重寫(xiě)cudamalloc庫(kù)函數(shù)并向所述全局鏈表增加節(jié)點(diǎn),記錄所述cudamalloc庫(kù)函數(shù)分配的全局變量?jī)?nèi)存地址。
進(jìn)一步地,重寫(xiě)cudamemcpy庫(kù)函數(shù),遍歷所述全局鏈表,獲得備份的全局變量所在節(jié)點(diǎn),同步更新變量值。
進(jìn)一步地,重寫(xiě)cudalauch庫(kù)函數(shù),在執(zhí)行所述核函數(shù)代碼前,遍歷所述全局鏈表,將所述全局鏈表中各個(gè)節(jié)點(diǎn)的備份值更新為對(duì)應(yīng)全局變量的初始值。
優(yōu)選地,將重寫(xiě)的庫(kù)函數(shù)封裝為動(dòng)態(tài)文件庫(kù)。
通過(guò)執(zhí)行kernel函數(shù)代碼(通過(guò)調(diào)用cudalauch函數(shù)),并讀取需要的事件組,判斷是否還有事件組需要獲取,如果有,則恢復(fù)步驟101備份的全局變量和kernel函數(shù)參數(shù)。
為得到需要的性能數(shù)據(jù)即metric值,而必須首先得到較多的事件值,而由于硬件計(jì)數(shù)器數(shù)量限制,每次kernel函數(shù)運(yùn)行時(shí)可以收集到的事件值數(shù)量有限,因此需要多次執(zhí)行kernel函數(shù),分多次收集事件值。
為此,本發(fā)明通過(guò)對(duì)庫(kù)函數(shù)插樁而改變了kernel函數(shù)的發(fā)射過(guò)程,使得原先一次執(zhí)行的kernel函數(shù)被多次發(fā)射,從而在每次執(zhí)行時(shí)求得一部分硬件計(jì)數(shù)器值,最終求出所有需要的硬件計(jì)數(shù)器值,進(jìn)而求得所需要的所有metric值。
其中,kernel函數(shù)執(zhí)行過(guò)程中可能修改部分全局內(nèi)存變量的值,此時(shí)原先只執(zhí)行一次的kernel函數(shù)被修改為多次執(zhí)行后會(huì)導(dǎo)致部分全局內(nèi)存變量被累計(jì)修改多次,從而導(dǎo)致錯(cuò)誤,為避免出現(xiàn)這樣的錯(cuò)誤,需要提前備份可能被修改的變量值,并在每次調(diào)用cudalauch庫(kù)函數(shù)前將上次執(zhí)行時(shí)被改變的變量恢復(fù)為正確的初始值,從而使kernel函數(shù)的多次執(zhí)行是在同樣的初始條件下進(jìn)行。為此本發(fā)明實(shí)施例備份了程序中的所有全局變量,通過(guò)對(duì)cudamalloc庫(kù)函數(shù),cudamemcpy等庫(kù)函數(shù)進(jìn)行插樁,進(jìn)而實(shí)現(xiàn)了備份值跟隨原變量值的同步更新。
步驟103:根據(jù)所述事件組信息,獲得性能數(shù)據(jù)值即metric值。
圖2所示為本發(fā)明實(shí)施例2的對(duì)庫(kù)函數(shù)插樁的具體實(shí)施步驟流程示意圖;
步驟201:備份kernel函數(shù)參數(shù)和全局變量?jī)?nèi)存初始值;
步驟202:執(zhí)行kernel函數(shù)并讀取一部分事件組;
步驟203:判斷是否還有事件組沒(méi)有讀取,若是,則恢復(fù)備份的全局內(nèi)存變量和kernel函數(shù)參數(shù)為初始值;若否,則執(zhí)行步驟204;
步驟204:根據(jù)獲取到的事件組,計(jì)算性能數(shù)據(jù)值即metric值。
圖3所示為本發(fā)明實(shí)施例3的對(duì)庫(kù)函數(shù)進(jìn)行插樁后kernel函數(shù)的執(zhí)行流程示意圖;
a:建立一個(gè)全局鏈表,用于備份全局變量及kernel函數(shù)參數(shù);
b:重寫(xiě)cudaconfigurecall,cudasetupargument庫(kù)函數(shù),在其中通過(guò)步驟a建立的全局鏈表,增加節(jié)點(diǎn),記錄kernel函數(shù)參數(shù),隨后繼續(xù)調(diào)用原來(lái)的cudaconfigurecall,cudasetupargument庫(kù)函數(shù);
c:重寫(xiě)cudamalloc庫(kù)函數(shù),向步驟a中建立的全局鏈表增加節(jié)點(diǎn),記錄cudamalloc分配的全局變量?jī)?nèi)存地址,隨后繼續(xù)調(diào)用原來(lái)的cudamalloc庫(kù)函數(shù)
d:重寫(xiě)cudamemcpy庫(kù)函數(shù),遍歷步驟a中建立的全局鏈表,找到步驟c備份的全局變量所在節(jié)點(diǎn),同步更新該變量值,隨后繼續(xù)調(diào)用原來(lái)的cudamemcpy函數(shù);
e:重寫(xiě)cudalauch庫(kù)函數(shù),在調(diào)用kernel函數(shù)前,遍歷鏈表,將鏈表中各個(gè)節(jié)點(diǎn)的備份值更新為對(duì)應(yīng)全局變量的初始值,隨后繼續(xù)調(diào)用原來(lái)的cudalauch庫(kù)函數(shù);
f:執(zhí)行完e后,根據(jù)需要的metric讀取需要的事件組,如果所有事件組全部獲取到,調(diào)用cuda庫(kù)函數(shù)進(jìn)而計(jì)算出metric值,如果沒(méi)有獲取到,繼續(xù)執(zhí)行e步驟
最后將以上步驟重寫(xiě)的庫(kù)函數(shù)封裝為動(dòng)態(tài)庫(kù)文件,并通過(guò)設(shè)置ld_preload環(huán)境變量使得gpu程序在調(diào)用庫(kù)函數(shù)時(shí)鏈接并執(zhí)行本發(fā)明實(shí)施例重新實(shí)現(xiàn)的版本,進(jìn)而采集到所需要的metric值,實(shí)現(xiàn)gpu程序的透明化操作。
圖4所示為本發(fā)明實(shí)施例4的性能數(shù)據(jù)獲取裝置結(jié)構(gòu)圖,包括備份模塊、讀取模塊、處理模塊;其中,所述備份模塊通過(guò)所述讀取模塊與所述處理模塊相連;
所述備份模塊,用于獲取核函數(shù)參數(shù)即kernel函數(shù)參數(shù)并備份全局變量;
所述讀取模塊,用于通過(guò)調(diào)用對(duì)應(yīng)的庫(kù)函數(shù),執(zhí)行所述核函數(shù)代碼,讀取事件組信息;
所述處理模塊,用于根據(jù)所述事件組信息,獲得性能數(shù)據(jù)值。
進(jìn)一步地,所述備份模塊,還用于建立一個(gè)全局鏈表,用于備份全局變量及kernel函數(shù)參數(shù)。
本發(fā)明實(shí)施例提供以下技術(shù)方案:獲取核函數(shù)參數(shù)即kernel函數(shù)參數(shù)并備份全局變量;通過(guò)調(diào)用對(duì)應(yīng)的庫(kù)函數(shù),執(zhí)行所述核函數(shù)代碼,讀取事件組信息;根據(jù)所述事件組信息,獲得性能數(shù)據(jù)值。
上述技術(shù)方案通過(guò)執(zhí)行核函數(shù)代碼,讀取全部事件組信息,獲取性能數(shù)據(jù)值,實(shí)現(xiàn)了高效、準(zhǔn)確的性能數(shù)據(jù)獲取途徑,避免需要修改待測(cè)程序源碼及多次啟動(dòng)待測(cè)程序的繁瑣方式,大大提升了用戶體驗(yàn)。
本發(fā)明實(shí)施例提供以下技術(shù)方案:執(zhí)行核函數(shù)代碼,并讀取事件組信息,判斷是否還有事件組待讀取,若有,則恢復(fù)備份的全局變量和kernel函數(shù)參數(shù)為初始值
上述技術(shù)方案通過(guò)循環(huán)讀取,將事件組信息全部讀取,實(shí)現(xiàn)了整個(gè)程序只需要運(yùn)行一次,即可得到需要的所有性能指標(biāo),實(shí)現(xiàn)了高效、準(zhǔn)確的性能數(shù)據(jù)獲取途徑。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。