在FPGA的(de)(de)(de)很多加速場景(jing)比如計(ji)算(suan)密集(ji)型場景(jing)往往需要對單筆計(ji)算(suan)的(de)(de)(de)原(yuan)始數據收(shou)集(ji)完(wan)全后才能啟動(dong)計(ji)算(suan)流(liu)程(cheng),并(bing)在計(ji)算(suan)流(liu)程(cheng)處(chu)理完(wan)成后才能釋放。如果(guo)使用(yong)單Buffer來接(jie)收(shou)原(yuan)始數據,那么(me)在計(ji)算(suan)處(chu)理過程(cheng)中,數據接(jie)收(shou)鏈路(lu)是閑(xian)置的(de)(de)(de),假設原(yuan)始數據的(de)(de)(de)接(jie)收(shou)時(shi)間是t1,計(ji)算(suan)處(chu)理時(shi)間是t2,那么(me)整個鏈路(lu)的(de)(de)(de)處(chu)理效率(lv)是1/(t1+t2),可以看出(chu)此時(shi)鏈路(lu)處(chu)理能力即未達到數據傳輸的(de)(de)(de)瓶(ping)頸,也未達到計(ji)算(suan)處(chu)理的(de)(de)(de)瓶(ping)頸,鏈路(lu)利用(yong)度不高。

圖(tu)一 單buffer鏈路處理
本(ben)文采(cai)用一(yi)(yi)種乒(ping)乓(pang)buffer設計(ji)(ji)方法,開辟兩片Buffer用于原始(shi)數(shu)據存(cun)儲,輪流(liu)交(jiao)替服務于原始(shi)數(shu)據接收和(he)計(ji)(ji)算,這樣可以(yi)充(chong)分利用計(ji)(ji)算的(de)時(shi)間去接收下一(yi)(yi)波原始(shi)數(shu)據,從而提高(gao)整個鏈路的(de)處(chu)理效率。值得注意的(de)是為(wei)了保證計(ji)(ji)算數(shu)據的(de)一(yi)(yi)致性,必須保證在計(ji)(ji)算和(he)數(shu)據包的(de)接收均完成后(hou),才能進行(xing)Buffer功(gong)能的(de)交(jiao)替。
圖二是t1<t2的(de)(de)情(qing)況,此(ci)時當計(ji)(ji)(ji)算(suan)處理(li)Buffer1的(de)(de)數據時,Buffer2開始接收(shou)(shou)原(yuan)始數據,當其接收(shou)(shou)完(wan)一(yi)個(ge)完(wan)整的(de)(de)用于計(ji)(ji)(ji)算(suan)的(de)(de)原(yuan)始數據后(hou),由于計(ji)(ji)(ji)算(suan)還未完(wan)成(cheng),需等待計(ji)(ji)(ji)算(suan)完(wan)成(cheng)后(hou),Buffer1和Buffer2的(de)(de)功能(neng)進行交換,此(ci)時Buffer1開始接收(shou)(shou)原(yuan)始數據,計(ji)(ji)(ji)算(suan)處理(li)Buffer2的(de)(de)數據。可以(yi)看出,兩個(ge)Buffer功能(neng)交換的(de)(de)周期是t2,計(ji)(ji)(ji)算(suan)處理(li)效率是瓶(ping)頸點,此(ci)時鏈路(lu)的(de)(de)處理(li)效率是1/t2。

圖二(er) 雙Buffer鏈(lian)路處理(t1<t2)
圖三是(shi)(shi)(shi)t1>t2的(de)(de)情況,此(ci)時當(dang)計算(suan)處(chu)理Buffer1的(de)(de)數(shu)(shu)據(ju)(ju)(ju)時,Buffer2開始(shi)(shi)(shi)接收(shou)原(yuan)始(shi)(shi)(shi)數(shu)(shu)據(ju)(ju)(ju),當(dang)計算(suan)處(chu)理完(wan)成Buffer1的(de)(de)數(shu)(shu)據(ju)(ju)(ju)后(hou),由(you)于(yu)Buffer2還未完(wan)成原(yuan)始(shi)(shi)(shi)數(shu)(shu)據(ju)(ju)(ju)的(de)(de)接收(shou),需等待Buffer2接收(shou)完(wan)一(yi)個完(wan)整的(de)(de)用于(yu)計算(suan)的(de)(de)原(yuan)始(shi)(shi)(shi)數(shu)(shu)據(ju)(ju)(ju)后(hou),Buffer1和Buffer2的(de)(de)功能進(jin)行交換,此(ci)時Buffer1開始(shi)(shi)(shi)接收(shou)原(yuan)始(shi)(shi)(shi)數(shu)(shu)據(ju)(ju)(ju),計算(suan)處(chu)理Buffer2的(de)(de)數(shu)(shu)據(ju)(ju)(ju)。可以看出,兩個Buffer功能交換的(de)(de)周期(qi)是(shi)(shi)(shi)t1,數(shu)(shu)據(ju)(ju)(ju)傳輸效率是(shi)(shi)(shi)瓶頸點,此(ci)時鏈路(lu)的(de)(de)處(chu)理效率是(shi)(shi)(shi)1/t1。

圖三 雙Buffer鏈路處理(t1>t2)
本文的乒(ping)乓Buffer方案(an),可以達(da)到的鏈路(lu)(lu)處理效(xiao)率是(shi)1/Max(t1,t2),此時已(yi)經(jing)達(da)到鏈路(lu)(lu)上數據傳輸效(xiao)率或者計算(suan)處理效(xiao)率的瓶頸點,鏈路(lu)(lu)利用度已(yi)到最大,在FPGA計算(suan)密集型等場景可實現深度加(jia)速(su)。