異構(gòu)計算綜述_第1頁
異構(gòu)計算綜述_第2頁
異構(gòu)計算綜述_第3頁
異構(gòu)計算綜述_第4頁
異構(gòu)計算綜述_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

./異構(gòu)計算〔Heterogeneouscomputing摘要異構(gòu)計算〔Heterogeneouscomputing技術從80年代中期產(chǎn)生,由于它能經(jīng)濟有效地獲取高性能計算能力、可擴展性好、計算資源利用率高、發(fā)展?jié)摿薮?目前已成為并行/分布計算領域中的研究熱點之一。本文主要介紹了CPU+GPU基礎知識及其異構(gòu)系統(tǒng)體系結(jié)構(gòu)〔CUDA和基于OpenCL的異構(gòu)系統(tǒng),并且總結(jié)了兩種結(jié)構(gòu)的特點,從而對異構(gòu)計算有了更深的理解。關鍵詞:異構(gòu)計算CUDAOpenCL1、引言異構(gòu)計算主要是指使用不同類型指令集和體系架構(gòu)的計算單元組成系統(tǒng)的計算方式。常見的計算單元類別包括CPU、GPU等協(xié)處理器、DSP、ASIC、FPGA等。我們常說的并行計算正是異構(gòu)計算中的重要組成部分異構(gòu)計算近年來得到更多關注,主要是因為通過提升CPU時鐘頻率和內(nèi)核數(shù)量而提高計算能力的傳統(tǒng)方式遇到了散熱和能耗瓶頸。而與此同時,GPU等專用計算單元雖然工作頻率較低,具有更多的內(nèi)核數(shù)和并行計算能力,總體性能/芯片面積的比和性能/功耗比都很高,卻遠遠沒有得到充分利用。CPU的設計讓其比較擅長于處理不規(guī)則數(shù)據(jù)結(jié)構(gòu)和不可預測的存取模式,以及遞歸算法、分支密集型代碼和單線程程序。這類程序任務擁有復雜的指令調(diào)度、循環(huán)、分支、邏輯判斷以及執(zhí)行等步驟。而GPU擅于處理規(guī)則數(shù)據(jù)結(jié)構(gòu)和可預測存取模式。而APU的設計理念則正是讓CPU和GPU完美合作,集合兩者的長處,用異構(gòu)計算來達到整體性能的最佳化。目前,已經(jīng)有50款領先的應用能夠利用AMDAPU進行加速,而后續(xù)的應用也將陸續(xù)到來——異構(gòu)計算普及的一刻應該是近在咫尺了。1.1CPU和GPU的本質(zhì)區(qū)別<1>CPU特點a>CPU的目標是快速執(zhí)行單一指令流;b>CPU將其用于亂序執(zhí)行、寄存器重命名、分支預測以及巨大的cache上,這些設計都是為了加速單一線程的執(zhí)行速度c>CPU利用cache來降低內(nèi)存訪問延遲d>CPU通過大量的cache和分支預測來降低延遲,這些機制消耗了大量的晶體管的電能;e>CPU每個核心支持1~2個線程;f>CPU切換線程的代價是數(shù)百個時鐘周期;g>CPU通過SIMD〔單指令多數(shù)據(jù)來處理矢量數(shù)據(jù);h>Intel的CPU沒有集成內(nèi)存控制器〔2GPU特點a>GPU的目標是快速執(zhí)行大量的并行指令流。b>GPU將晶體管用于處理器陣列、多線程管理、共享內(nèi)存、內(nèi)存控制器,這些設計并不著眼于提高單一線程的執(zhí)行速度,而是為了使GPU可以同時執(zhí)行成千上萬的線程,實現(xiàn)線程間通信,并提供極高的內(nèi)存帶寬。c>GPU使用cache來放大內(nèi)存帶寬d>GPU通過同時運行上千個線程來隱藏延遲,等待內(nèi)存訪問的線程會被切換掉,e>GPU切換線程不耗時間。f>對于支持CUDA的GPU,每個流處理器可以同時處理1024個線程。g>GPU切換線程的代價是0,事實上GPU通常每個時鐘周期都切換線程。h>GPU則使用SIMT〔單指令多線程,SIMT的好處是無需開發(fā)者費力把數(shù)據(jù)湊成合適的矢量長度,并且SIMT允許每個線程有不同的分支。j>支持CUDA的GPU集成有8個內(nèi)存控制器,GPU的內(nèi)存帶寬通常是CPU的十倍1.2GPU計算模型內(nèi)核是執(zhí)行模型的核心,能在設備上執(zhí)行。當一個內(nèi)核執(zhí)行之前,需要指定一個N-維的范圍〔NDRange。一個NDRange是一個一維、二維或三維的索引空間。還需要指定全局工作節(jié)點的數(shù)目,工作組中節(jié)點的數(shù)目。如圖NDRange所示,全局工作節(jié)點的范圍為{12,12},工作組的節(jié)點范圍為{4,4},總共有9個工作組。如果定義向量為1024維,特別地,我們可以定義全局工作節(jié)點為1024,工作組中節(jié)點為128,則總共有8個組。定義工作組主要是為有些僅需在組內(nèi)交換數(shù)據(jù)的程序提供方便。當然工作節(jié)點數(shù)目的多少要受到設備的限制。如果一個設備有1024個處理節(jié)點,則1024維的向量,每個節(jié)點計算一次就能完成。而如果一個設備僅有128個處理節(jié)點,那么每個節(jié)點需要計算8次。合理設置節(jié)點數(shù)目,工作組數(shù)目能提高程序的并行度。圖1.GPU計算模型CPU的長項是整數(shù)計算,GPU的優(yōu)勢則是浮點計算。對于整機性能而言,CPU和GPU都是性能的保障,合理的搭配才是重中之重,才能給用戶帶來最強的綜合性能。1.3異構(gòu)計算分類及發(fā)展方向目前的趨勢,增加并行的性能,而不是時鐘頻率。我們的重點是在一個節(jié)點,幾乎是充分利用指令級并行性。這意味著,提高性能,必須來自多芯片,多核或多上下文并行。Flynn的分類法在硬件定義了四個級別的并行:〔1單指令單數(shù)據(jù)〔SISD〔2單指令多數(shù)據(jù)流〔SIMD〔3多指令單數(shù)據(jù)〔MISD〔4多指令多數(shù)據(jù)〔MIMD此外,兩個細分MIMD單程序多數(shù)據(jù)〔SPMD,以及多個程序多數(shù)據(jù)〔MPMD,我們使用這些術語來描述架構(gòu)。圖2.架構(gòu)單芯片CBEA,如圖所示〔a,由一個傳統(tǒng)的CPU核心和8個SIMD加速器核心。這是一個非常靈活的架構(gòu),每個核心可以運行單獨MPMD時尚和溝通方案,快速通過片上總線。其主要設計標準得到了最大限度降低消耗的功率。圖中〔b顯示了多線程SIMD加速器結(jié)合一個標準的多核CPU核心的GPU。GPU具有優(yōu)異的帶寬和計算性能,對很少或根本沒有同步運行的SPMD方案進行了優(yōu)化。它是專為高性能的圖形,其中的數(shù)據(jù)吞吐量是關鍵。最后,圖中〔c顯示了FPGA邏輯塊陣列組成和一個標準的多核心CPU的組合。FPGA的片上,也可以納入正規(guī)的CPU核心,使得它本身就是一個異構(gòu)芯片。FPGA可視為用戶定義的應用程序的專用集成電路〔ASIC的可重構(gòu)。他們提供充分確定性的表現(xiàn),是專為高吞吐量,例如,在電信方面的應用。目前異構(gòu)并行計算向著以下幾個方向發(fā)展:〔1集群計算。這是傳統(tǒng)高性能計算的領域。但是今天高性能計算已經(jīng)演變成了異構(gòu)并行計算的一部分,越來越多的高性能計算集群使用GPU、MIC、FPGA等?!?單機計算。推動單機計算向異構(gòu)并行計算發(fā)展的主要動力是游戲、計算機輔助設計等,而主要表現(xiàn)是GPU+CPU的異構(gòu)計算。〔3移動計算。近幾年發(fā)展表明,人們對手機的需求比對PC的需求更大。目前幾乎所有的移動芯片解決方案都是異構(gòu)的,除了有CPU、GPU之外,還有視頻編解碼單元、音頻處理單元。傾向于把更多工作內(nèi)容轉(zhuǎn)移到手機上,但是為了保證續(xù)航時間,移動處理器的設計一開始就不是以高性能為目標,這使得要在移動處理器上獲取高性能是比較困難的?!?嵌入式計算。在一些惡劣工作環(huán)境下,只有DSP和FPGA能夠滿足要求。2、異構(gòu)計算系統(tǒng)2.1CPU+GPU異構(gòu)系統(tǒng)體系結(jié)構(gòu)計算機系統(tǒng)一般都配置了CPU和GPU,GPU傳統(tǒng)上只負責圖形渲染,大部分的仸務都由CPU來完成。隨著圖形渲染的數(shù)據(jù)量越來越大、計算也越來越復雜,GPU的可編程性和幵行性也隨之增強。目前,主流GPU的計算能力、存儲帶寬、性價比與同期的CPU相比更具競爭力。下面以支持CUDA<ComputingUnifiedDeviceArchitecture>的GPU為例來說明CPU+GPU異構(gòu)計算系統(tǒng)的體系結(jié)構(gòu)。支持CUDA的GPU通常由數(shù)個線程處理器簇。TPC<ThreadProcessorCluster>組成,如:NVIDIAGeForce9800GX2由2個TPC組成雙核GPU;NVIDIAGeForce9800GTX只含有一個TPC。每個TPC由若干流多處理器SM<StreamingMulti-processor>組成,一個SM包含8個線程處理器TP<threadedprocessor>和一定大小的共享存儲空間<SharedMemory>,另外,GPU還提供了全局的存儲器<GlobalMemoryorVideoMemory>和一定數(shù)量的全局只讀的紋理緩存<TextureCache>和常緩存<ConstantCache>。GPU與CPU間的數(shù)據(jù)傳輸通過PCIE通道來完成,該數(shù)據(jù)傳輸通道可能成為性能瓶頸。CPU+GPU異構(gòu)系統(tǒng)的整體結(jié)構(gòu)如下圖所示。圖3.CPU+GPU異構(gòu)系統(tǒng)體系結(jié)構(gòu)2.1.2CUDA執(zhí)行模型CUDA源程序由運行于host〔CPU上的控制程序和運行于device〔GPU上的計算核心<kernel>兩部分組成。每一個kernel由一組相同大小的線程塊〔threadblock來幵行執(zhí)行,同一線程塊里面的線程通過共享存儲空間來協(xié)作完成計算,線程塊間是相互獨立的。運行時,每一個線程塊會被分派到一個流多處理器SM上運行,它們共享大小為16KB的共享存儲空間。為了管理運行各種不同程序的數(shù)百個線程,SM采用了一種稱為SIMT〔singleinstructionmultiplethread,SIMT的新架構(gòu)。SIMT單元以32個幵行線程為一組來創(chuàng)建、管理、調(diào)度和執(zhí)行線程,這樣的線程組稱為warp塊。多個warp塊可以組成一個線程塊,一個線程塊將會分派到一個SM上,SM會將各線程映射到一個TP核心上,各TP使用自己的指令地址和寄存器狀態(tài)獨立執(zhí)行。構(gòu)成SIMTwarp塊的各個線程在同一個程序地址一起啟動,也可隨意分支、獨立執(zhí)行。為一個SM指定了一個或多個要執(zhí)行的線程塊時,它會將其分成warp塊,幵由SIMT單元迚行調(diào)度。將塊分割為warp塊的方法總是相同的,每個warp塊都包含連續(xù)的線程,遞增線程ID,第一個warp塊中包含線程0。每収出一條指令時,SIMT單元都會選擇一個已準備好執(zhí)行的warp塊,幵將下一條指令収送到該warp塊的活動線程,其執(zhí)行調(diào)度過程示意如下圖所示。圖4.CUDA執(zhí)行模型2.1.3協(xié)作框架由于PCIE數(shù)據(jù)傳輸通道會成為CPU+GPU異構(gòu)系統(tǒng)的性能瓶頸,因此,保證通信傳輸開銷取得最優(yōu)解的情況下,更有利于優(yōu)化通信開銷取得期望解,GPU與CPU如何協(xié)作完成求解問題,最大限度較少數(shù)據(jù)在CPU與GPU之間的頻繁傳輸顯得尤為重要。為此參考文獻之處寫作框架如下:圖5.CPU+GPU協(xié)作框架2.2.3實驗評估分析為了驗證本文提出的協(xié)作框架的有效性和高效性,選擇了計算密集型應用圖像置亂變換作為測試用例。實驗環(huán)境配置如下:<1>IntelCore2Quad2.33Ghz,4GB內(nèi)存,MicrosoftVisualStudio2005<2>GeForceGTX280,1GB顯存,16KBSharedMemory,CUDAtoolkit和SDK2.0,NVIDIADriverforMicrosoftWindowsXP<177.98>圖6.運行時間比較2.3基于OpenCL的異構(gòu)系統(tǒng)并行編程使用GPU進行通用計算是近些年的熱點研究領域。傳統(tǒng)的通用計算主要依靠圖形API,這給不熟悉圖形應用的用戶帶來了極大的不便。為了克服該缺陷,出現(xiàn)了NVIDIACUDA和ATIStream等編程模型,給編程帶來了極大的靈活性。但是在程序移植性方面,NVIDIAGP和AMDGPU互不兼容。并且今天的計算機系統(tǒng)通常包含高度并行的CPU、GPU和其它類型的處理器,讓軟件開發(fā)人員充分合理的利用這些異構(gòu)處理平臺的優(yōu)勢變得非常重要。針對上述問題,OpenCL一種新的并行計算技術出現(xiàn),使用它可以調(diào)用計算機內(nèi)全部計算資源,包括CPU、GPU和其它處理器,為軟件開發(fā)人員能夠方便高效的利用異構(gòu)處理平臺、充分挖掘計算機中所有計算設備的性能潛力提供了充分保障。用OpenCL包含一個用來協(xié)調(diào)異構(gòu)處理器間并行計算的API,和一個基于ISOC99跨平臺的編程語言,且能與OpenGL、OpenGLES和其它圖形類API高效互通,具有跨平臺、兼容性好等特點,極大地方便了軟件開發(fā)人員的編程工作,將大大地推動并行計算的發(fā)展。在諸如分子模擬、流體模擬、碰撞模擬、生物應用以及電信、金融、證券數(shù)據(jù)分析、醫(yī)療等各種領域都將具有良好的應用前景。本章節(jié)以OpenCL的架構(gòu)、軟件框架及實現(xiàn)原理等為基礎,對OpenCL進行描述,并將OpenCL與CUDA等通用計算技術進行對比,突出OpenCL的優(yōu)越性。2.3.1OpenCL架構(gòu)〔1平臺架構(gòu)該模型描述內(nèi)部單元之間的關系,如圖1所示。主機可以是個人計算機或超級計算機。設備可以是CPU、GPU、DSP或其它處理器。每個OpenCL設備包含若干計算單元,每個計算單元又由若干處理單元組成。圖7.平臺模型OpenCL通過平臺實現(xiàn)主機與設備間的交互操作。主機管理著整個平臺上的所有計算資源,所有OpenCL應用程序都是從主機端啟動并在主機端結(jié)束的。應用程序運行時由主機提交命令,在設備上的處理單元中執(zhí)行計算。每個計算單元內(nèi)所有的處理單元都會執(zhí)行相同的一套指令程。每個處理單元以單指令多數(shù)據(jù)SIMD或單程序多數(shù)據(jù)SPMD模式運行指令流?!?執(zhí)行模型OpenCL執(zhí)行兩類程序:內(nèi)核程序和主機程序;前者由若干個OpenCL設備執(zhí)行,后者由主機執(zhí)行。OpenCL通過主機程序定義上下文并創(chuàng)建一個被稱為命令隊列的數(shù)據(jù)結(jié)構(gòu)來管理內(nèi)核程序的執(zhí)行。在命令隊列中,內(nèi)核程序可順序執(zhí)行也可亂序執(zhí)行。每當主機提交內(nèi)核程序到設備上執(zhí)行時,系統(tǒng)便會創(chuàng)建一個N維〔N可取1,2,3的索引空間NDRange。如下圖所示。內(nèi)核程序?qū)⑺饕臻g中的每一點用一個工作項〔work-item來表示,將若干個工作項劃分成一個工作組〔workgroup。在一個計算單元內(nèi)可運行同一工作組中的工作項,并且該組內(nèi)的工作可以并發(fā)執(zhí)行在多個處理單元上。圖8.執(zhí)行模型索引空間〔3內(nèi)存模型設備上有4塊存儲區(qū)域可以提供給工作項進行訪問:〔a全局內(nèi)存:所有工作項對其中的任意數(shù)據(jù)都可以讀寫,容量較大,但訪問延遲較高?!瞓常數(shù)內(nèi)存:全局內(nèi)存的一部分,但工作項對其中的任意數(shù)據(jù)只能進行讀操作?!瞔局部內(nèi)存:對特定工作組可見,該工作組中所有工作項可以對其中的任意數(shù)據(jù)進行讀寫操作。局部內(nèi)存通常位于片上,訪問速度較快,但容量有限?!瞕私有內(nèi)存:該區(qū)域中的數(shù)據(jù)只對單獨的工作項可見。內(nèi)存模型如下圖所示。圖9.內(nèi)存模型一個kernal既不能訪問主機內(nèi)存也不能動態(tài)分配全局內(nèi)存和常數(shù)內(nèi)存,所有的內(nèi)存都是由主機進行管理。下表描述了內(nèi)核與主機對內(nèi)存區(qū)域的分配以及訪問情況?!?編程模型數(shù)據(jù)并行和任務并行是OpenCL可以支持的兩種并行編程模型,同時兩者的混合模型也得到支持。通常情況下,OpenCL采用的首要模型是數(shù)據(jù)并行,而對多核CPU主要采用任務并行。在數(shù)據(jù)并行編程模型中,一系列的指令會作用到內(nèi)存對象的多個元素上。嚴格來說,數(shù)據(jù)并行要求內(nèi)存對象單元與工作項保持一對一的映射,而在實際應用中,并不要求嚴格按照這種方式。在數(shù)據(jù)并行編程模型中,OpenCL又提供了一種分級方式,有兩種方法:顯式分級模型和隱式分級模型;前者要求開發(fā)人員指出工作項的總數(shù)和工作項所屬的工作組;而后者僅需要開發(fā)人員定義工作項的總數(shù),對于工作項的劃分則根據(jù)OpenCL的實現(xiàn)來管理。在任務并行編程模型上,每個工作項都相當于在一個單一的計算單元內(nèi),該單元內(nèi)只有單一工作組,該工作組只有該工作項本身在執(zhí)行。2.3.2OpenCL軟件架構(gòu)OpenCL軟件框架包含三部分:OpenCL平臺層、OpenCL運行時和OpenCL編譯器。如下圖所示。在OpenCL平臺層上,開發(fā)人員可以查詢系統(tǒng)中的平臺數(shù)目并選定運行平臺,在指定的平臺上選擇必要的計算設備并對它們進行初始化,然后可以建立上下文,并創(chuàng)建命令隊列。執(zhí)行內(nèi)核程序、讀、寫及復制緩沖區(qū)和同步操作等都是通過命令隊列中的命令實現(xiàn)的。一個命令隊列和一個OpenCL設備是一對一的關系。在OpenCL運行時中,開發(fā)人員建立內(nèi)核實例,并將其映射到正確的內(nèi)存空間中,接著在命令隊列中排隊執(zhí)行內(nèi)核。OpenCL編譯器負責編譯運行在設備上的程序,并創(chuàng)建可執(zhí)行程序。圖10.OpenCL軟件架構(gòu)2.4總結(jié)根據(jù)下表可以看出,兩者采用了不同的開發(fā)語言:<1>CUDA采用的是CUDAC作為開發(fā)語言,是一種類C的編程語言,它包含對C語言的最小擴展集和一個運行時庫,編寫的文件由NVCC編譯器編譯。CUDAC對C語言的擴展集引入了變量類型限定符、函數(shù)類型限定符等,<2>OpenCL采用的是基于ISOC99的OpenCLC語言,也是一種類C的編程語言。但OpenCLC引入了一些函數(shù)限定符、變量限定符,并且支持C語言中原有的一些數(shù)據(jù)類型,還增加了一些新的數(shù)據(jù)類型如half類型、內(nèi)建的矢量數(shù)據(jù)類型等,OpenCLC還提供了豐富的內(nèi)建函數(shù),其中有些內(nèi)建函數(shù)名和C語言的庫函數(shù)相同,只是實現(xiàn)有所不同。OpenCLC為開發(fā)者提供的是統(tǒng)一的編程語言,適合在各種處理器上實現(xiàn)通用計算,并且程序移植性好。表1.CUDA與OpenCL術語對比表2.CUDA與OpenCL特點對比3、異構(gòu)計算的典型應用異構(gòu)計算并不神秘,目前已滲透各個領域,不僅是PC領域,也包括了手持移動設備領域、行業(yè)領域,甚至是云計算、分布式計算領域。事實上,異構(gòu)計算至少在應用端〔前臺并不像它的名字這樣生澀,很多應用里面,都有異構(gòu)計算的身影。小到網(wǎng)頁及視頻加速,大到DNA計算、蛋白質(zhì)計算、氣象運算,都能和異構(gòu)計算搭上關系。但都有一定的限制,如_global_函數(shù)類型限定符用于聲明內(nèi)核函數(shù),只能在設備上執(zhí)行,從主機調(diào)用。3.1AMD視頻穩(wěn)定技術視頻是和大家息息相關高頻應用。而AMD、英特爾和NVIDIA在視頻領域都有GPU加速/解碼/轉(zhuǎn)碼技術——這一點大家都知道了。但還有些技術可能大家還不了解,比如圖像穩(wěn)定技術。我們時常遇到抖動的視頻,這種抖動可能源于拍攝者的手不穩(wěn),也可能是因為長焦拍攝。無論如何,AMD通過異構(gòu)計算拿出了解決方案:2011年中,AMD宣布了"SteadyVideo"技術,可以實時對抖動畫面進行穩(wěn)定化處理。不過由于缺乏播放軟件的支持,該技術一直是"只聞其聲,不見其形",真正的應用并不多。而在AFDS2012上,這一技術的升級版再度出擊——與去年不同的是,如今,你使用APU平臺筆記本,抑或是使用帶有AMD獨顯,就能實實在在地感受到這一技術帶來的良好特性。YouTube視頻在線播放目前已經(jīng)能夠一鍵開啟SteadyVideo技術〔絕大部分和主流瀏覽器都支持,而且,這種技術甚至已經(jīng)能夠在WindowsMediaPlayer上實現(xiàn)!我們在最新的A10-4600MAPU筆記本上進行了實測〔Win7系統(tǒng),以佳能SX30IS拍攝.mov格式的視頻。實測中我們發(fā)現(xiàn),只要視頻初期存在抖動,在用WindowsMediaPlayer進行播放時,SteadyVideo功能就會自動開啟——這時,在播放界面的右下角會短暫出現(xiàn)SteadyVideo的圖標,說明該功能正在啟用。而我們用35倍光學變焦拍攝的視頻,其圖像穩(wěn)定的效果非常顯著!SteadyVideo是一個很典型的異構(gòu)計算應用,因為它并非完全采用GPU而解放CPU資源,而是將實時的視頻圖像處理任務進行了智能分工,分別交給CPU和GPU共同完成。3.2人臉識別人臉識別是生物識別這個大范疇中的一類,目前廣泛地運用在日常的娛樂生活中,相機拍照、攝像頭人臉識別登錄,甚至是目前很火的攝像頭動作感應游戲,都是基于人臉識別系統(tǒng)的。那么,人臉識別怎么會和異構(gòu)計算扯上關系的呢?人臉識別系統(tǒng)后臺有面部模型,而其識別工作方式可能是這樣的〔不同軟件會有區(qū)別:先把畫面分成若干區(qū)域,大家可

溫馨提示

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

評論

0/150

提交評論