0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

NPU加速器建模設(shè)計(jì)(完整版)

sakobpqhz ? 來源:算力基建 ? 2023-06-19 15:37 ? 次閱讀

對NPU進(jìn)行建模的主要目的是快速評估不同算法、硬件、數(shù)據(jù)流下的延時(shí)、功耗開銷,因此在架構(gòu)的設(shè)計(jì)初期,可以評估性能瓶頸,方便優(yōu)化架構(gòu)。在架構(gòu)和數(shù)據(jù)流確定后,建??梢钥焖僭u估網(wǎng)絡(luò)在加速器上的執(zhí)行效率。對其建??梢詮膹乃惴ňS度和硬件維度進(jìn)行。

算法維度:以一定的方式表示需要加速的網(wǎng)絡(luò),如一些中間件描述,主要包括算子的類型、網(wǎng)絡(luò)的層數(shù)以及操作數(shù)精度等信息,這一部分可以由自定義的網(wǎng)絡(luò)描述文件表示,也可以由編譯器解析網(wǎng)絡(luò)文件生成,目的在于定量的描述工作負(fù)載。

硬件維度,包括計(jì)算資源和存儲(chǔ)資源兩部分,不同的NPU具有不同數(shù)量的計(jì)算資源,加速不同算子的并行度也會(huì)有所區(qū)別。不同NPU的存儲(chǔ)層次結(jié)構(gòu)也有很大區(qū)別,權(quán)重、特征是否共用同一片緩存或者有各自獨(dú)立的緩存,每一級存儲(chǔ)的容量、帶寬以及相互之間的連接關(guān)系,都是設(shè)計(jì)空間的一部分。

建模分析的主要問題是功耗、延時(shí)以及訪存。

對功耗而言,通常具有統(tǒng)一的分析方法,通過每個(gè)操作的功耗,比如一次乘法,加載一個(gè)數(shù)據(jù)等需要的功耗,以及總的操作次數(shù)相乘后累加,就可以估算出整體的功耗。延時(shí)可以通過RTL/FPGA等精確的仿真得到,適用于架構(gòu)與數(shù)據(jù)流確定的情況。另外有一些基于數(shù)學(xué)方法分析的建模方法,并不會(huì)實(shí)際執(zhí)行網(wǎng)絡(luò),而是根據(jù)網(wǎng)絡(luò)參數(shù)、硬件參數(shù)進(jìn)行數(shù)學(xué)推導(dǎo),估算延時(shí)。對訪存的估計(jì)與需求有關(guān),有些建模方法只關(guān)注于對DRAM的訪問,有些則會(huì)同時(shí)考慮到片上不同存儲(chǔ)單元間的數(shù)據(jù)移動(dòng)。

建模越精確其越貼近特定的架構(gòu),更有利于評估算法在特定硬件上的計(jì)算效率。

建模越模糊越具有普適性,有利于在加速器設(shè)計(jì)初期進(jìn)行設(shè)計(jì)空間探索。

以下以最近的一篇論文為例,來分析加速器架構(gòu)的設(shè)計(jì)空間探索,DeFiNES: EnablingFast Exploration of the Depth-first Scheduling Space for DNN Acceleratorsthrough Analytical Modeling,考慮了PE利用和內(nèi)存層級結(jié)構(gòu),對于PE的利用,其主要是PE間的數(shù)據(jù)交互,排列和連接方式,并沒有太大的探索空間,即計(jì)算和數(shù)據(jù)搬移的共同代價(jià),在一些架構(gòu)分析的時(shí)候,對內(nèi)存層級關(guān)注較低,多集中on-off chip,這里深度優(yōu)先的搜索加速器架構(gòu)空間,配合cost model找到最優(yōu)架構(gòu)模型,從幾個(gè)層面,逐次計(jì)算tile大?。〞?huì)影響到between layer input/output位于那個(gè)內(nèi)存層級上,以及weight復(fù)用的問題,即weight訪問的頻次),數(shù)據(jù)復(fù)用模式(即cache已計(jì)算的的數(shù)據(jù),還是完全重新數(shù)據(jù))以及層間融合(將層間存儲(chǔ)在告訴存儲(chǔ)區(qū)內(nèi)完成上一層的output送入到下一層的input)減少高層存儲(chǔ)訪問三個(gè)方面來探討搜索空間,需要一定的trade off,對于cost model,文章并沒有作詳細(xì)的介紹,cost model一般考慮lateny 和power兩部分,尚未解決的問題:文章主要針對convolution進(jìn)行的分析,以transform為代表的大模型,計(jì)算模式則完成不同,convolution計(jì)算中,weight復(fù)用,featuremap的滑動(dòng),以及感受野計(jì)算區(qū)域變化等和transform差距較大。優(yōu)點(diǎn):詳細(xì)的內(nèi)存層級分布的探討和不同容量層級的內(nèi)存分布,值得借鑒。缺點(diǎn):cost model并未真正提及,對于convolution并沒有關(guān)注到depthwise和point兩種常見版本,對于transform新的計(jì)算模式并未涉及 文章中提及了fuselayer和cascade excute,前者很好理解,對于后者,給一個(gè)簡單的介紹,所謂的cascade excute

3cb05704-0e73-11ee-962d-dac502259ad0.png

3cbd1d2c-0e73-11ee-962d-dac502259ad0.png

3cc96078-0e73-11ee-962d-dac502259ad0.png

從圖2這里可以看到,convolution的計(jì)算特點(diǎn),weight在輸入空間滑動(dòng)帶來的三個(gè)結(jié)果:1.支持逐個(gè)模塊的計(jì)算,即這里延申的cross layer的tile計(jì)算塊 2,數(shù)據(jù)的生產(chǎn)者消費(fèi)者模式,即stride和kernel size差異引起的數(shù)據(jù)復(fù)用,和層間連接的數(shù)據(jù)交付 3.計(jì)算模式導(dǎo)致的存儲(chǔ)結(jié)構(gòu),weight在層內(nèi)的復(fù)用,而tile大小影響了計(jì)算時(shí),weight的訪問頻次?;诖宋覀兛吹绞崭惺芤暗挠绊懀碿onvolution的計(jì)算結(jié)構(gòu))看到在fuse-layer的時(shí)候,較大的tile-size帶來了較好的計(jì)算效率,對比圖中可以看到tile_size=4*4,最上層的輸入為10*10,tile_size為1*1,輸入為7*7

3cd80a4c-0e73-11ee-962d-dac502259ad0.png

紫色的表示計(jì)算已經(jīng)生成的數(shù)據(jù),對于圖a為完全每次都從第一層開始重新計(jì)算的模式,表示最后一層生成一個(gè)1*1*c綠色的數(shù)據(jù),倒數(shù)第二層需要提供3*3*c綠色數(shù)據(jù),第一層需要提供綠色5*5*c綠色數(shù)據(jù),因?yàn)槠鋵儆趂ullyrecompute,即沒有數(shù)據(jù)復(fù)用,可以看到底層的c個(gè)數(shù)據(jù)需求,前兩層分別需要用到9c個(gè)和25c個(gè)。對于圖b, 屬于H-cached,V-recompute,即水平方向緩存,垂直方向計(jì)算,最后一行中,生成一個(gè)1*1*c綠色數(shù)據(jù),對應(yīng)上面一層需要3*3*c的數(shù)據(jù)塊產(chǎn)于運(yùn)算,這其中需要復(fù)用cached的紅色2*3*c的數(shù)據(jù),和新加入了綠的1*3*c的數(shù)據(jù),這其中新加入的1*3的綠色數(shù)據(jù)會(huì)設(shè)置成new to-cache 1*3*c的數(shù)據(jù)為下一次的領(lǐng)域計(jì)算作為cache,如圖種藍(lán)色框?qū)?yīng),中圖種新讀入的1*3*c的數(shù)據(jù),則對應(yīng)最上層需要new to-cache 1*5*c的數(shù)據(jù),圖c同理

3ce68d24-0e73-11ee-962d-dac502259ad0.png

對于a,當(dāng)一層一個(gè)stack的時(shí)候,每一層的weight比較小,則將其放置在LB中,因?yàn)槠鋝tack很淺,每層的between stack的I/O都會(huì)寫到最慢的DRAM中,而其per stack的I/O(上一層的輸出傳遞到下一層的輸入)也只能在低級別存儲(chǔ)中傳遞。

B vs C 相同之處,都進(jìn)行了fuse, 對比a來說,因?yàn)閒use layer了,stack變深,多層間累計(jì)的weight變大,weight從原來圖a中位于LB, 被迫放在了GB中,對于b vs c,看到tile粒度變細(xì)后,其相應(yīng)的執(zhí)行次數(shù)變多,則weight訪問頻次變高,c的 weight reuse變少。對于和a比較,因?yàn)閒use了,per stack的I/O(上一層的輸出傳遞到下一層的輸入)從a中的DRAM(因?yàn)閍為single layer執(zhí)行,即每次結(jié)果需要放回到DRAM,則between-stack的I/O放在DRAM,因?yàn)橹挥幸粚?,其輸出perI/O和between stack是一樣的)移動(dòng)到了GB中(b)或者LB中(c),因?yàn)閠ile粒度變小,所以c的per-stack位于LB中,而b 的per-stack位于GB中,對于between stack是位于stack之間的,無論b還是c都還是寫入到最外層DRAM中,對于b和c而言fuse 層比較淺,對比可以看出tile 越細(xì),即tile finer,則每一層的featuremap變小,per-stack的I/O越容易放到高速緩存中,看到在圖C中 Per-Stack 的Input Feature Map & OutputFeatureMap集中在最底層的LB上,而圖B中,則在放在GB中,即所謂tile finer--》less per-stackactivation. 但是同時(shí)也帶來的缺點(diǎn),多個(gè)tile則意味著更多次的訪問weight,即所謂的tile finer-》lesslocal-memory weight reuse,再C中可以看到關(guān)于W為less reuse B vs D,對比可以看到,融合層數(shù)越多,即 fuse deeper,即每個(gè)stack包含的層數(shù)多,一個(gè)stack包含了多層的weight也就多,因此Moreper-stack weight, 對應(yīng)圖b中,weight可以在GB中,在圖d,圖e中,weight數(shù)據(jù)量較多,則都集中在了DRAM上,fusedeeper好處是這些stack中逐層之間的activation在高速存儲(chǔ)中完成了交換(即上一層的輸出是下一層的輸入),圖d中DRAM中沒有 between-stack I/O ,I/O集中在下面的高速層,即lessbetween -stack activation

3cf52316-0e73-11ee-962d-dac502259ad0.png

因?yàn)榈谝恍?列中的塊還沒有可用的緩存數(shù)據(jù)——同樣,最后一列/行中的塊也不必為它們的鄰居存儲(chǔ)重疊,因此不是所有的tile都是相同的。

3d05a09c-0e73-11ee-962d-dac502259ad0.png

以下圖來看那些數(shù)據(jù)可以利用cached data,那些用來cache for neighbors

3d0cf676-0e73-11ee-962d-dac502259ad0.png

5_step3 內(nèi)存排列分布來看

3d196582-0e73-11ee-962d-dac502259ad0.png

3d227c44-0e73-11ee-962d-dac502259ad0.png

圖9中為例看到,圖像被分割成了3種tile,對于tile1,數(shù)目為1個(gè),其weight首次需要從DRAM逐層搬移到進(jìn)來,看到在tile type1中,其weight位于DRAM中,再其后的type2(15個(gè))和type3(112個(gè)),weight是完全復(fù)用的,所以一直在LB結(jié)構(gòu)中,對應(yīng)于5_step3圖中W位于LB中,而I因?yàn)橛写鎯?chǔ)計(jì)算時(shí)的cache存在,前一層生成的輸出可能部分被緩存起來,或者使用更低的內(nèi)存級別用來作為下一層的輸入,只會(huì)在每種type切換的時(shí)候,會(huì)從DRAM中讀取一次數(shù)據(jù),因此,從DRAM中讀入后,以后的每次使用中,需要的一部分是新數(shù)據(jù),一部分是來源于cache的數(shù)據(jù),在type2和type3中,則基本都為LB中,而對于O只有在type類型切換,和最終結(jié)果則寫出到DRAM中。從圖5中step4可以看到,prev的outputfeautre map在內(nèi)存層級中更優(yōu)先于Cached data。

3d2de66a-0e73-11ee-962d-dac502259ad0.png

3d367884-0e73-11ee-962d-dac502259ad0.png

端到端的功耗匹配更具挑戰(zhàn)性,因?yàn)樗鼘讉€(gè)細(xì)粒度設(shè)計(jì)和布局方面非常敏感,例如:

1)稀疏性,DepFiN使用稀疏性來關(guān)閉邏輯活動(dòng)以節(jié)省功率;

2)位置和路由效應(yīng),導(dǎo)致數(shù)據(jù)傳輸比內(nèi)存讀/寫成本更昂貴,還包括稀疏依賴效應(yīng);

3)工藝、電壓和溫度(PVT)變化

3d403d6a-0e73-11ee-962d-dac502259ad0.png

看table1看到對于架構(gòu)進(jìn)行l(wèi)ike DF 手動(dòng)改造的時(shí)候,對于meta-proto-like DF處理器,local buffer 減少了weight的分配,增大了I&O的數(shù)量, 并對 I&O 進(jìn)行復(fù)用,增加I&O有助于融合的層次更深,支持更大一點(diǎn)的tile size,對于tpu-likeDF, 減少了reg for Mac group的數(shù)目,增加了Local buffer種I&O. 對于edgetpu-like DFT中,處理方式和meta-proto-like DF類似,都是減少了weight的LB的分配,增大了I&O,即更加關(guān)注可以用來在層間I/O傳遞, 給定一個(gè)workload和架構(gòu),深度優(yōu)先策略的影響,以上圖中Meta-proto-like DF架構(gòu)和FSRCNN作為workload

case1:使用FSRCNN and Meta-proto-like DF 分別作為targeted workload 和 HWarchitecture. 對于三個(gè)DF影響因子,tile size, overlap storing mode 和fusedepth, 對應(yīng)該case,其第三個(gè)軸fusedepth固定在整個(gè)DNN上,因?yàn)镕SRCNN的總weight很?。?5.6KB),因此所有權(quán)值都適合Meta-proto-likeDF架構(gòu)的weight可以全部放進(jìn)on-chiplocal buffer(看到該架構(gòu)的weight使用的local buffer是32K),因此不把整個(gè)DNN融合成一個(gè)堆棧是沒有好處

3d47f5dc-0e73-11ee-962d-dac502259ad0.png

從圖中,看右下角,不同計(jì)算模式下,它們的能量和延遲數(shù)(分別為19.1和29)是相同的,因?yàn)榇藭r(shí)的tile大小為960*540即為全圖,因此不存在tile, 即轉(zhuǎn)換為了LBL, 因?yàn)椴煌闹丿B存儲(chǔ)模式對LBL沒有影響

1.考慮相同重疊存儲(chǔ)模式下,即同一個(gè)圖內(nèi)比較,發(fā)現(xiàn)不同的tile尺寸,tile尺寸太小和太大都是次優(yōu)的。tile尺寸過大,會(huì)導(dǎo)致訪問一些非常慢的存儲(chǔ)層級,tile尺寸很小,則導(dǎo)致會(huì)大量訪問weight, 太大太小都不是最好的選擇,最好的點(diǎn)總是在中間的某個(gè)地方。

2.考慮不同重疊存儲(chǔ)模式下相同的tile大小的情況下,即同一相對坐標(biāo)下的跨圖進(jìn)行比較,大多數(shù)情況下能耗順序?yàn)椋篺ull -cached 《 H-cached V-recompute《 full -recompute,這個(gè)也易于解釋,適當(dāng)?shù)拇鎯?chǔ)結(jié)構(gòu)減少了大量的重復(fù)計(jì)算 3.不同的tile大小和模式會(huì)嚴(yán)重影響能量和延遲

4.fully recompute比fully-cached更喜歡更大的tile大小。Fully-cached傾向于小一些的tile.

對上圖中,分析器對角線對應(yīng)的tile組合,其對應(yīng)的計(jì)算量如下

3d5513c0-0e73-11ee-962d-dac502259ad0.png

3d60d39a-0e73-11ee-962d-dac502259ad0.png

圖13可以看到tile越小,則計(jì)算量反而越大,因?yàn)閿?shù)據(jù)復(fù)用比例較低,在圖13種可以看到在fully recom對應(yīng)的1*1下,計(jì)算量最多, 以圖2為例子,可以看到,對于tile1*1,則頂層需要的計(jì)算為7*7,而對于tile2*2 則需要的僅僅為8*8,因此可以看到tile size的大小并不是和計(jì)算量成線性關(guān)系,tile長寬增大一倍,計(jì)算量并沒有相應(yīng)的增大,而是小于其增速,則說明,tile越小,計(jì)算量較大,對于三種存儲(chǔ)模式都是滿足這個(gè)規(guī)律,只是full-cache 影響很小,統(tǒng)觀全圖,總的情況下滿足fully-recom》H-cac,V-recom》Fully-cac. 再看到隨著tilesize的增大,因?yàn)閏ache的數(shù)據(jù)(用于減少重復(fù)計(jì)算量)的數(shù)據(jù)通常為kernel width-1列(H-cac,V-recom),或者(kernel width*kernel width-1)個(gè)(對應(yīng)于Fully-cac),但是相對于大的kernel size而言,cache起來的數(shù)據(jù)占的比例在減小,因此cached data的作用在降低,這也是在前面,對于上一層輸出的output featuremap比cached data更優(yōu)先占用較快存儲(chǔ),隨著tile size增大,比如增加到960*540這個(gè)時(shí)候cache的意義也就沒意義了(即轉(zhuǎn)換成了LBL),因此計(jì)算量也就一樣了。

3d6f5654-0e73-11ee-962d-dac502259ad0.png

3d7c3e28-0e73-11ee-962d-dac502259ad0.png

----------------------------------------------------------------- 將深度優(yōu)先應(yīng)用于多個(gè)workload來分析其各自的性能,這里使用了如下的5種策略,和五個(gè)網(wǎng)絡(luò),其中FSRCNN/DMCNN-VD/MCCNN屬于activation占主要的類的workload,而MobileNetV1/Resnet18則屬于weight占主導(dǎo)的workload。

Single layer: layers are completely evaluated one at a time, feature maps are always stored to and fetched fromDRAM in between layers;

Layer-by-layer: layers are completely evaluated one at a time,thatmeans no tile, intermediate feature maps are passed on to the next layer in thelowest memory level they fit in;

Fully-cached DF with 4*72 tiles, which is the bestfound in case study 1;

The best strategy found when a single strategy is used for all fused layer stacks;

The best combination, where different stacks can use different DFstrategies.

3d859d06-0e73-11ee-962d-dac502259ad0.png

FSRCNN/DMCNN-VD/MCCNN屬于activation占主要的類的workload, 這一類的特點(diǎn)weight比較少,適合多層進(jìn)行fuse, 且weight通常多位于local sram中,且適合再進(jìn)行 layer fuse的時(shí)候,stack的層次比較深,看到這三個(gè)網(wǎng)絡(luò)的weight都在幾十到幾百K字節(jié),適合fuse deep and single stack, 因此對于singlelayer是一種比較差的選擇,這一類的另一個(gè)特點(diǎn)是activation占主要,則適合對activation 作 tile處理,因此,對于layer by layer也是一種比較差的選擇,對應(yīng)于圖16 .FSRCNN/DMCNN-VD,MCCNN,使用singlelayer/layer-by-layer的時(shí)候效果都比較差。相應(yīng)的這幾種網(wǎng)絡(luò)更適合選擇fully-cache的tile,其多層融合的single stack, 對應(yīng)于這三種網(wǎng)絡(luò),綠色DF 4x72 fully-cache,紅色DF best single strategy 和紫色的best combination的效果都比較好。

再來看單一策略對不同網(wǎng)絡(luò)的影響,對于Single layer,即每層作為一個(gè)stack, 對應(yīng)于圖中藍(lán)色條,對于Layer-by-layer的黃色條,無論那種網(wǎng)絡(luò),這兩張選擇,其energy和latency都比較高。 因?yàn)槠淝罢咝枰L問最慢的DRAM,后者無法tile,也需要訪問較慢的存儲(chǔ)結(jié)構(gòu),再來看DF best single stategy和best combination的兩種情況下,即紅色和紫色,對前三個(gè)網(wǎng)絡(luò)都選擇用了比較合適的single stack, 即所有的layer總體fuse一個(gè)single stack, ,其tile選取了較為合適的4*72/24*128/47*8, 對于數(shù)據(jù)存儲(chǔ),都選擇了據(jù)存儲(chǔ)性能為Fully-cache》H-cac,V-recom》Fully-cac,可以看到這三個(gè)網(wǎng)絡(luò)都取得了不錯(cuò)的latency和energy,

綠色框DF tile采取相互適配的大小4*72,4*72模式也是在case1中對activation類型占優(yōu)的網(wǎng)絡(luò)找到的最優(yōu)解,數(shù)據(jù)存儲(chǔ) 選取為Fully-cached。在圖中對于FSRCNN/DMCNN-VD/MCCNN,其DF4x72 fully -cached, DF best single strategy,Best combination占優(yōu),而Singlelayer/Layer-by-layer不占優(yōu)

而對于MobileNetV1/Resnet18則屬于weight占主導(dǎo)的workload,這一類的特點(diǎn)activation相對比較少,因此紅色的DF best singlestategy和紫色的best combination中stack采取了不同的方式,以MobileNetV1為例子, DF best single stategy(a single strategy is used for all fusedlayer stacks)中每一個(gè)stack, 選取了7*7的tile大小,數(shù)據(jù)存儲(chǔ)為fully-cached,而對于組合模式(where different stacks can use different DF strategies),則不同層使用不同的模式,前面18層使用一個(gè)固定的tile size,使用fully-cache, 而對于后面的層,以mobilenetV1為例子,whereas MobileNetV1 and ResNet18 are weight-dominant (feature mapsare smaller and gradually decrease across layers),在18層后,featureMap已經(jīng)變得比較小,即不再對featuremap作tile處理。所以使用了layer-by-layer,總的來說更細(xì)粒度調(diào)度策略的紫色的best combination的效果最好。

3d90d07c-0e73-11ee-962d-dac502259ad0.png

3d9a369e-0e73-11ee-962d-dac502259ad0.png

3da6b75c-0e73-11ee-962d-dac502259ad0.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1625

    文章

    21620

    瀏覽量

    601232
  • 加速器
    +關(guān)注

    關(guān)注

    2

    文章

    790

    瀏覽量

    37674
  • NPU
    NPU
    +關(guān)注

    關(guān)注

    2

    文章

    256

    瀏覽量

    18511

原文標(biāo)題:NPU加速器建模設(shè)計(jì)(完整版)

文章出處:【微信號:算力基建,微信公眾號:算力基建】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    《VHDL實(shí)用教程》完整版

    電子發(fā)燒友網(wǎng)站提供《《VHDL實(shí)用教程》完整版.txt》資料免費(fèi)下載
    發(fā)表于 09-21 14:30 ?0次下載

    《VHDL實(shí)用教程》完整版

    電子發(fā)燒友網(wǎng)站提供《《VHDL實(shí)用教程》完整版.txt》資料免費(fèi)下載
    發(fā)表于 08-28 16:30 ?0次下載

    AltiumDesignerSummer9完整版安裝

    AltiumDesignerSummer9完整版安裝
    發(fā)表于 12-08 21:37 ?0次下載

    ASCLL碼表(完整版)

    ASCLL碼表(完整版)ASCLL碼表(完整版)ASCLL碼表(完整版)ASCLL碼表(完整版)
    發(fā)表于 11-20 11:26 ?0次下載

    《ZigBee協(xié)議規(guī)范完整版》(中)

    《ZigBee2006協(xié)議規(guī)范完整版》(中) 不收積分,需要的看下
    發(fā)表于 11-23 18:25 ?0次下載

    ASCII碼表完整版

    ASCII碼表完整版,方便學(xué)習(xí)C語言或者做LCD顯示時(shí)用到。
    發(fā)表于 12-22 10:44 ?0次下載

    超星閱覽完整版下載

    超星閱覽完整版下載
    發(fā)表于 12-28 15:38 ?0次下載

    STM32固件庫_中文版_最完整版

    STM32固件庫_中文版_最完整版,看好了是最完整版。
    發(fā)表于 05-16 11:05 ?0次下載

    ASCII碼表(完整版)

    ASCII碼表(完整版),感興趣的小伙伴可以看看。
    發(fā)表于 07-29 14:15 ?0次下載

    Linux命令大全完整版

    Linux命令大全完整版
    發(fā)表于 12-16 22:33 ?0次下載

    PCB流程介紹教程(完整版)

    PCB流程介紹教程(完整版)
    發(fā)表于 02-14 16:40 ?0次下載

    新版Android開發(fā)教程及筆記-完整版

    新版Android開發(fā)教程及筆記-完整版
    發(fā)表于 03-19 11:24 ?0次下載

    C51學(xué)習(xí)的教程完整版

    C51學(xué)習(xí)的教程完整版
    發(fā)表于 10-16 10:52 ?0次下載
    C51學(xué)習(xí)的教程<b class='flag-5'>完整版</b>

    常見電子元器件完整版

    電子元器件完整版
    發(fā)表于 06-21 14:54 ?0次下載

    PCIE協(xié)議5.0完整版

    PCIE協(xié)議5.0完整版
    發(fā)表于 09-13 14:32 ?0次下載