GPU計算CUDA基本介紹課件_第1頁
GPU計算CUDA基本介紹課件_第2頁
GPU計算CUDA基本介紹課件_第3頁
GPU計算CUDA基本介紹課件_第4頁
GPU計算CUDA基本介紹課件_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、CUDA基本介紹基于Nvidia GPU的通用計算開發(fā)張舒第1頁,共73頁。電子科技大學(xué) 電子工程學(xué)院 06級碩士研究生信號探測與獲取技術(shù)專業(yè)研究方向:合成孔徑雷達(dá)成像與雷達(dá)目標(biāo)像識別信號處理與模式識別的算法與硬件實現(xiàn)研究第2頁,共73頁。GPU的優(yōu)勢強(qiáng)大的處理能力 GPU接近1Tflops/s高帶寬 140GB/s低成本 Gflop/$和Gflops/w高于CPU當(dāng)前世界超級計算機(jī)五百強(qiáng)的入門門檻為12Tflops/s一個三節(jié)點,每節(jié)點4GPU的集群,總處理能力就超過12Tflops/s,如果使用GTX280只需10萬元左右,使用專用的Tesla也只需20萬左右第3頁,共73頁。GPU /C

2、PU計算能力比較第4頁,共73頁。GPU/CPU存儲器帶寬比較第5頁,共73頁。GPU/CPU架構(gòu)比較第6頁,共73頁。延遲與吞吐量CPU: 通過大的緩存保證線程訪問內(nèi)存的低延遲,但內(nèi)存帶寬小,執(zhí)行單元太少,數(shù)據(jù)吞吐量小 需要硬件機(jī)制保證緩存命中率和數(shù)據(jù)一致性GPU: 高顯存帶寬和很強(qiáng)的處理能力提供了很大的數(shù)據(jù)吞吐量 緩存不檢查數(shù)據(jù)一致性 直接訪問顯存延時可達(dá)數(shù)百乃至上千時鐘周期第7頁,共73頁。單核CPU已經(jīng)走到了盡頭頻率提高遇到了瓶頸 從p4時代至今主流處理器頻率一直在2GHz-3GHz左右架構(gòu)上已無潛力可挖。超線程 多流水線 復(fù)雜的分支預(yù)測 大緩存等技術(shù)已經(jīng)將性能發(fā)揮到了極致,但是通用計

3、算中的指令級并行仍然偏低上述技術(shù)占用了芯片上的絕大多數(shù)晶體管和面積,目的卻只是讓極少數(shù)的執(zhí)行單元能夠滿負(fù)荷工作第8頁,共73頁。GPU能夠更好的利用摩爾定律提供的晶體管圖形渲染過程高度并行,因此硬件也是高度并行的少量的控制單元,大量的執(zhí)行單元顯存被固化在了PCB上,擁有更好的EMI性能,因此運行頻率高于內(nèi)存 通過更大的位寬實現(xiàn)了高帶寬第9頁,共73頁。當(dāng)前的單核并行計算產(chǎn)品IBM Cell 應(yīng)用主要見于PS3SUN Niarraga NPUNV/ATI GPU 大規(guī)模應(yīng)用GPU最為常見,受市場牽引發(fā)展最快,性價比最高第10頁,共73頁。架構(gòu)比較第11頁,共73頁。硬件CPUGPUFPGAAES

4、-128解密實測速度(GByte/s)0.119(Core2E6700中單核)1.78(FX9800GTX+)1.02(互聯(lián)網(wǎng)資料中單片F(xiàn)PGA最大值)開發(fā)難度小較小大增加功能容易容易難硬件升級無需修改代碼無需修改代碼需要修改代碼與主控端通信不需要通過PCI-E,實際速度一般為3G左右,通過API實現(xiàn),較簡單需要為FPGA編寫額外的驅(qū)動程序,實現(xiàn)通信協(xié)議需要額外的硬件資源性能/成本高低高片外存儲器內(nèi)存,容量大,速度低顯存,容量較大,速度高FPGA板上內(nèi)存,一般為DDRII,速度低開發(fā)周期短短長CPU GPU FPGA實現(xiàn)比較第12頁,共73頁。當(dāng)前的GPU開發(fā)環(huán)境Cg:優(yōu)秀的圖形學(xué)開發(fā)環(huán)境,但

5、不適合GPU通用計算開發(fā)ATI stream:硬件上已經(jīng)有了基礎(chǔ),但只有低層次匯編能夠使用所有資源。高層次抽象Brook本質(zhì)上是基于上一代GPU的,缺乏良好的編程模型OpenCL:聯(lián)合制定的標(biāo)準(zhǔn),抽象層次較低,對硬件直接操作更多,代碼需要根據(jù)不同硬件優(yōu)化CUDA:目前最佳選擇第13頁,共73頁。未來的發(fā)展趨勢GPU通用計算進(jìn)一步發(fā)展:更高版本的CUDA, OpenCL新產(chǎn)品涌現(xiàn):Nvidia和AMD的下一代產(chǎn)品,Intel的LarraBeeCPU+GPU產(chǎn)品:減少了CPU-GPU通信成本,但存儲器帶寬和功耗面積等可能將制約集成度。在較低端的應(yīng)用中將有用武之地。第14頁,共73頁。CUDA的硬件

6、架構(gòu)適合通用計算G8x系G9x系GT200系列標(biāo)量機(jī)架構(gòu)提高了處理效率,更加適合通用計算增加了shared memory和同步機(jī)制,實現(xiàn)線程間通信以通用的處理器矩陣為主,輔以專用圖形單元第15頁,共73頁。GTX280性能933 Gflops(MAD)單精度 116 Gflops雙精度(MAD )512bit位寬ddr3顯存,提供了140GB/s的帶寬1G的顯存第16頁,共73頁。GT200框圖第17頁,共73頁。TPC3 SMInstruction and constant cacheTextureLoad/store第18頁,共73頁。SM第19頁,共73頁。ROP第20頁,共73頁。RO

7、P對DRAM進(jìn)行訪問TEXTURE機(jī)制對global的atomic操作第21頁,共73頁。微架構(gòu)比較第22頁,共73頁。執(zhí)行流水線第23頁,共73頁。工作在通用計算模式下的GT200第24頁,共73頁。SM架構(gòu)第25頁,共73頁。DUAL-Issue 并發(fā)每二周期可以發(fā)射 一次指令FPU和SFU指令延遲 是四周期某些情況下可以讓FPU和SFU并發(fā)執(zhí)行,實現(xiàn)超標(biāo)量理論處理能力峰值沒有計算dual-issue雙精度浮點計算不能dual-issue第26頁,共73頁。CUDA架構(gòu)GPU硬件特點硬件資源模塊化,根據(jù)市場定位裁減高度并行 存在TPC SM 兩層 每個SM又有8SPSM內(nèi)存在高速的shar

8、ed memory和同步機(jī)制原子操作有利于實現(xiàn)通用計算中的數(shù)據(jù)順序一致性shared memory Texture cache constant cache等高速片內(nèi)存儲器有助于提高數(shù)據(jù)訪問速度,節(jié)省帶寬第27頁,共73頁。如何選購硬件目前(2019. 12)只有CUDA能夠完全發(fā)揮新一代GPU的全部計算能力。Nvidia的G80以上的GPU能夠支持CUDA。GT200系列不僅性能更強(qiáng),而且具有很多實用的新特性Tesla專用流處理器擁有更大的顯存和更高的核心頻率,通過降低顯存頻率,屏蔽不需要的圖形單元和改善散熱獲得了更好的穩(wěn)定性,適合服務(wù)器或者集群使用第28頁,共73頁。適合的應(yīng)用GPU只有在

9、計算高度數(shù)據(jù)并行任務(wù)時才能發(fā)揮作用。在這類任務(wù)中,需要處理大量的數(shù)據(jù),數(shù)據(jù)的儲存形式類似于規(guī)則的網(wǎng)格,而對這寫數(shù)據(jù)的進(jìn)行的處理則基本相同。這類數(shù)據(jù)并行問題的經(jīng)典例子有:圖像處理,物理模型模擬(如計算流體力學(xué)),工程和金融模擬與分析,搜索,排序。 在很多應(yīng)用中取得了1-2個數(shù)量級的加速第29頁,共73頁。不適合的應(yīng)用需要復(fù)雜數(shù)據(jù)結(jié)構(gòu)的計算如樹,相關(guān)矩陣,鏈表,空間細(xì)分結(jié)構(gòu)等,則不適用于使用GPU進(jìn)行計算。串行和事務(wù)性處理較多的程序并行規(guī)模很小的應(yīng)用,如只有數(shù)個并行線程需要ms量級實時性的程序需要重新設(shè)計算法和數(shù)據(jù)結(jié)構(gòu)或者打包處理第30頁,共73頁。CUDA 執(zhí)行模型 重點是將CPU做為終端(Ho

10、st),而GPU做為服務(wù)器(Server)或協(xié)處理器(Coprocessor),或者設(shè)備(Device),從而讓GPU來運行一些能夠被高度線程化的程序。CUDA的基本思想是盡量得開發(fā)線程級并行(Thread Level Parallel),這些線程能夠在硬件中被動態(tài)的調(diào)度和執(zhí)行。 第31頁,共73頁。CUDA執(zhí)行模型調(diào)用核程序時CPU調(diào)用API將顯卡端程序的二進(jìn) 制代碼傳到GPUgrid運行在SPA上block運行在SM上thread運行在SP上第32頁,共73頁。grid block threadKernel不是一個完整的程序,而只是其中的一個關(guān)鍵并行計算步Kernel以一個網(wǎng)格(Grid)

11、的形式執(zhí)行,每個網(wǎng)格由若干個線程塊(block)組成,每一個線程塊又由最多512個線程(thread)組成。 第33頁,共73頁。grid block thread一個grid最多可以有65535 * 65535個block一個block總共最多可以有512個thread,在三個維度上的最大值分別為512, 512和64第34頁,共73頁。grid block threadgrid之間通過global memory交換數(shù)據(jù)block之間不能相互通信,只能通過global memory共享數(shù)據(jù),不要讓多個block寫同一區(qū)段內(nèi)容(不保證數(shù)據(jù)一致性和順序一致性)同一block內(nèi)的thread可以通

12、過shared memory和同步實現(xiàn)通信block間粗粒度并行,block內(nèi)thread細(xì)粒度并行第35頁,共73頁。warpWarp是硬件特性帶來的概念,在CUDA C語言中是透明的(除vote函數(shù)),但應(yīng)用中不能忽略一個warp中有32個線程,這是因為SM中有8個SP,執(zhí)行一條指令的延遲是4個周期,使用了流水線技術(shù)一個half warp中有16個線程,這是因為執(zhí)行單元的頻率是其他單元的兩倍,每兩個周期才進(jìn)行一次數(shù)據(jù)傳輸?shù)?6頁,共73頁。SIMT編程模型SIMT是對SIMD(Single Instruction, Multiple Data,單指令多數(shù)據(jù))的一種變形。 兩者的區(qū)別在于:S

13、IMD的向量寬度是顯式的,固定的,數(shù)據(jù)必須打包成向量才能進(jìn)行處理;而SIMT中,執(zhí)行寬度則完全由硬件自動處理了。 (每個block中的thread數(shù)量不一定是32)而SIMT中的warp中的每個線程的寄存器都是私有的,它們只能通過shared memory來進(jìn)行通信。 第37頁,共73頁。分支性能與現(xiàn)代的微處理器不同,Nvidia的SM沒有預(yù)測執(zhí)行機(jī)制-沒有分支預(yù)測單元(Branch Predicator)。 在需要分支時,只有當(dāng)warp中所有的線程都計算出各自的分支的地址,并且完成取指以后,warp才能繼續(xù)往下執(zhí)行。 如果一個warp內(nèi)需要執(zhí)行N個分支,那么SM就需要把每一個分支的指令發(fā)射到

14、每一個SP上,再由SP根據(jù)線程的邏輯決定需不需要執(zhí)行。這是一個串行過程,此時SIMT完成分支的時間是多個分支時間之和。第38頁,共73頁。存儲器模型RegisterLocalsharedGlobalConstantTextureHost memoryPinned host memory第39頁,共73頁。寄存器與local memory對每個線程來說,寄存器都是線程私有的-這與CPU中一樣。如果寄存器被消耗完,數(shù)據(jù)將被存儲在本地存儲器(local memory)。Local memory對每個線程也是私有的,但是local memory中的數(shù)據(jù)是被保存在顯存中,而不是片內(nèi)的寄存器或者緩存中,速

15、度很慢。線程的輸入和中間輸出變量將被保存在寄存器或者本地存儲器中。第40頁,共73頁。Shared memory用于線程間通信的共享存儲器。共享存儲器是一塊可以被同一block中的所有thread訪問的可讀寫存儲器。訪問共享存儲器幾乎和訪問寄存器一樣快,是實現(xiàn)線程間通信的延遲最小的方法。共享存儲器可以實現(xiàn)許多不同的功能,如用于保存共用的計數(shù)器(例如計算循環(huán)次數(shù))或者block的公用結(jié)果(例如計算512個數(shù)的平均值,并用于以后的計算)。第41頁,共73頁。constant memory, texture memory 利用GPU用于圖形計算的專用單元發(fā)展而來的高速只讀緩存速度與命中率有關(guān),不命中

16、時將進(jìn)行對顯存的訪問常數(shù)存儲器空間較小(只有64k),支持隨機(jī)訪問。從host端只寫,從device端只讀 紋理存儲器尺寸則大得多,并且支持二維尋址。(一個數(shù)據(jù)的“上下左右”的數(shù)據(jù)都能被讀入緩存)適合實現(xiàn)圖像處理算法和查找表第42頁,共73頁。全局存儲器 使用的是普通的顯存,無緩存,可讀寫,速度慢整個網(wǎng)格中的任意線程都能讀寫全局存儲器的任意位置,并且既可以從CPU訪問,也可以從CPU訪問。 第43頁,共73頁。各種存儲器的延遲register: 1 周期shared memory: 1 周期( 無bank conflict ) - 16 周期( 發(fā)生16路 bank conflict)text

17、ure memory: 1 ( 命中) - 數(shù)百周期(不命中)constant memory: 1 ( 命中) - 數(shù)百周期( 不命中)global local memory: 數(shù)百周期第44頁,共73頁。各存儲器大小每個SM中有64K(GT200)或者32K(G8x, G9x)寄存器,寄存器的最小單位是32bit的register file每個SM中有16K shared memory一共可以聲明64K的constant memory,但每個SM的cache序列只有8K可以聲明很大的texture memory,但是實際上的texture cache序列為每SM 6-8K第45頁,共73頁。

18、使用存儲器時可能出現(xiàn)的問題致命問題:無法產(chǎn)生正確結(jié)果多個block訪問global同一塊,以及block內(nèi)thread間線程通信時的數(shù)據(jù)一致性問題Texture的工作模式設(shè)置錯誤效率問題:大大增加訪存延遲Shared bank conflict問題Global 合并訪問問題第46頁,共73頁。Bank conflictShared memory被分為了16個bank,單位是32-bit,相鄰數(shù)據(jù)在不同bank中,對16余數(shù)相同的數(shù)據(jù)在同一bankHalf warp中的16個線程訪問shared memory時最好一一對應(yīng),如果多個thread同時訪問屬于同一bank的數(shù)據(jù)將發(fā)生bank con

19、flict16個線程讀同一數(shù)據(jù)時,會發(fā)生一次廣播,只用一個cycle,沒有bank conflict第47頁,共73頁。合并訪問訪問顯存時要遵守嚴(yán)格的合并訪問規(guī)則將half warp訪問global的起始位置嚴(yán)格的對齊到16的整數(shù)倍在G8x, G9x硬件上thread訪問顯存的位置必須逐一遞增GT200有了很大的改進(jìn),對齊和次序比較靈活好的合并訪問可以將存儲器訪問次數(shù)減少十幾倍第48頁,共73頁。CUDA API第49頁,共73頁。CUDA C語言 由Nvidia的CUDA編譯器(nvcc)編譯 CUDA C不是C語言,而是對C語言進(jìn)行擴(kuò)展形成的變種。 第50頁,共73頁。CUDA對C的擴(kuò)展:

20、函數(shù)限定符對函數(shù)有了限定符,用來規(guī)定函數(shù)是在host還是在device上執(zhí)行,以及這個函數(shù)是從host調(diào)用還是從device調(diào)用。這些限定符是:_device_,_host_和_global_。 第51頁,共73頁。CUDA對C的擴(kuò)展:函數(shù)限定符_device_函數(shù)在device端執(zhí)行,并且也只能從device端調(diào)用,即作為device端的子函數(shù)來使用_global_函數(shù)即kernel函數(shù),它在設(shè)備上執(zhí)行,但是要從host端調(diào)用_host_函數(shù)在host端執(zhí)行,也只能從host端調(diào)用,與一般的C函數(shù)相同第52頁,共73頁。CUDA對C的擴(kuò)展:變量限定符對變量類型的限定符,用來規(guī)定變量被存儲在哪

21、一種存儲器上。 傳統(tǒng)的在CPU上運行的程序中,編譯器就能自動決定將變量存儲在CPU的寄存器還是在計算機(jī)的內(nèi)存中。 而在CUDA中,不僅要使用host端的內(nèi)存,而且也要使用顯卡上的顯存和GPU上的幾種寄存器和緩存。在CUDA編程模型中,一共抽象出來了多達(dá)8種不同的存儲器! 第53頁,共73頁。CUDA對C的擴(kuò)展:變量限定符_device_device_限定符聲明的變量存在于device端,其他的變量限定符聲明的變量雖然存在于不同的存儲器里,但總體來說也都在device端。所以_device_限定符可以與其他的限定符聯(lián)用。當(dāng)單獨使用_device_限定符修飾變量時,這個變量:存在于global m

22、emory中;變量生命周期與整個程序一樣長;可以被grid中所有的線程都可以訪問,也可以從host端通過運行時庫中的函數(shù)訪問。第54頁,共73頁。CUDA對C的擴(kuò)展:變量限定符_constant_constant_限定符,可以與_device_聯(lián)用,即_device_ _constant_,此時等同于單獨使用_constant_。使用_constant_限定符修飾的變量:存在于constant memory中,訪問時速度一般比使用global memory略快;變量生命周期與整個程序一樣長;可以被grid中所有的線程讀,從host端通過運行時庫中的函數(shù)寫。第55頁,共73頁。CUDA對C的擴(kuò)展

23、:變量限定符_shared_shared_限定符,可以與_device_聯(lián)用,即_device_ _shared_,此時等同于單獨使用_shared_。使用_shared_限定符修飾的變量:存在于block中的shared memory中;變量生命周期與block相同;只有同一block內(nèi)的thread才能訪問。 第56頁,共73頁。CUDA對C的擴(kuò)展:kernel執(zhí)行參數(shù)運算符,用來傳遞一些kernel執(zhí)行參數(shù) Grid的大小和維度Block的大小和維度外部聲明的shared memory大小stream編號第57頁,共73頁。CUDA對C的擴(kuò)展:內(nèi)建變量Dim3 ThreadIdx(三維)

24、Dim3 ThreadDim(三維)Dim3 BlockIdx(二維)Dim3 BlockDim(三維)第58頁,共73頁。執(zhí)行參數(shù)與內(nèi)建變量的作用各個thread和block之間的唯一不同就是threadID和BlockID,通過內(nèi)建變量控制各個線程處理的指令和數(shù)據(jù)CPU運行核函數(shù)時的執(zhí)行參數(shù)確定GPU在SPA上分配多少個block,在SM上分配多少個thread第59頁,共73頁。CUDA APICUDA API需要CUDA driver API才能運行,新版本的Nvidia驅(qū)動已經(jīng)包含了CUDA driver APICUDA runtime API是CUDA API的可選組件,它是一種動

25、態(tài)編譯器(JIT),能夠直接訪問實際中的底層硬件架構(gòu)。 第60頁,共73頁。CUDA API功能設(shè)備管理(Device management)上下文管理(Context management)存儲器管理(Memory management)代碼塊管理(Code Module management)執(zhí)行控制(Excution Control)紋理索引管理(Texture Reference management)與OpenGL和Direct3D的互操作(Interoperity with OpenGL and Direct3D)第61頁,共73頁。NVCC 編譯器生成三種不同的輸出:PTX,CU

26、DA二進(jìn)制序列和標(biāo)準(zhǔn)C 第62頁,共73頁。NVCC 編譯器 PTXPTX(Parallel Thread eXecution)作用類似于匯編,是為動態(tài)編譯器(包含在標(biāo)準(zhǔn)的Nvidia 驅(qū)動中)設(shè)計的輸入指令序列。這樣,不同的顯卡使用不同的機(jī)器語言,而動態(tài)編譯器卻可以運行相同的PTX。這樣做使PTX成為了一個穩(wěn)定的接口,帶來了很多好處:后向兼容性,更長的壽命,更好的可擴(kuò)展性和更高的性能,但在一定程度上也限制了工程上的自由發(fā)揮。這種技術(shù)保證了兼容型,但也使新一代的產(chǎn)品必須擁有上代產(chǎn)品的所有能力,這樣才能讓今天的PTX代碼在未來的系統(tǒng)上仍然可以運行。第63頁,共73頁。NVCC 編譯器 CUBIN

27、雖然PTX和JIT編譯器提供了很高的性能,但也不是在所有的場合都適用。某些獨立軟件開發(fā)商傾向于犧牲性能,以獲得更好的可確定性和可驗證性。JIT編譯器的輸出隨著目標(biāo)硬件和一些其他因素會發(fā)生變化。對于需要能夠確定的代碼的獨立軟件開發(fā)商(比如很多財經(jīng)軟件開發(fā)商),它們可以將代碼直接編譯成CUDA二進(jìn)制代碼,這樣就能避免JIT過程的不確定性。直接編譯得到的CUDA二進(jìn)制代碼是與特定的硬件和驅(qū)動相關(guān)的。 第64頁,共73頁。NVCC 編譯器 CNvcc的輸出還包括標(biāo)準(zhǔn)C。由nvcc生成的C代碼將被重定向到其他編譯器進(jìn)行編譯,比如ICC,GCC或者其他合適的高性能編譯器。CUDA中明確的表示了程序中的并行

28、度沒不僅在用于編寫運行在Nvidia GPU上的代碼時非常有效,而且為多核CPU生成高性能代碼。在某些應(yīng)用中,CUDA生成的代碼比標(biāo)準(zhǔn)的x86編譯器生成的代碼的性能提高了4倍。 第65頁,共73頁。CUDA API 庫函數(shù)CUFFT GPU進(jìn)行傅立葉變換的函數(shù)庫,提供了與廣泛使用的FFTW庫相似的接口。CUBLAS(CUDA Basic Linear Algorithm Subprogrammes)庫是一個基本的矩陣與向量的運算庫,提供了與BLAS相似的接口,可以用于簡單的矩陣計算,也可以作為基礎(chǔ)構(gòu)建更加復(fù)雜的函數(shù)包,如LAPACK等。CUDPP(CUDA Data parallel primitives) 庫提供了很多基本的常用并行操作函數(shù),如排序、搜索等,可以作為基本組件快速的搭建出并行計算程序。 第66頁,共73頁。如何編寫CUDA程序硬件實現(xiàn)不完全透明,需要掌握硬件實現(xiàn)的原理并行度高,適合CPU的小規(guī)模并行算法不一定適用,需要重新設(shè)計算法或者參考在集群上使用的并行算法第67頁,共73頁。如

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論