![云計算與數(shù)據(jù)中心建設(shè)---2云計算中的并行數(shù)據(jù)處理_第1頁](http://file4.renrendoc.com/view/1183151250bb43100a5db9f638823874/1183151250bb43100a5db9f6388238741.gif)
![云計算與數(shù)據(jù)中心建設(shè)---2云計算中的并行數(shù)據(jù)處理_第2頁](http://file4.renrendoc.com/view/1183151250bb43100a5db9f638823874/1183151250bb43100a5db9f6388238742.gif)
![云計算與數(shù)據(jù)中心建設(shè)---2云計算中的并行數(shù)據(jù)處理_第3頁](http://file4.renrendoc.com/view/1183151250bb43100a5db9f638823874/1183151250bb43100a5db9f6388238743.gif)
![云計算與數(shù)據(jù)中心建設(shè)---2云計算中的并行數(shù)據(jù)處理_第4頁](http://file4.renrendoc.com/view/1183151250bb43100a5db9f638823874/1183151250bb43100a5db9f6388238744.gif)
![云計算與數(shù)據(jù)中心建設(shè)---2云計算中的并行數(shù)據(jù)處理_第5頁](http://file4.renrendoc.com/view/1183151250bb43100a5db9f638823874/1183151250bb43100a5db9f6388238745.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
云計算中的并行數(shù)據(jù)處理1.目錄背景并行處理硬件系統(tǒng)并行處理軟件系統(tǒng)消息傳遞接口大規(guī)模異構(gòu)并行架構(gòu)2.1.背景物聯(lián)網(wǎng)、云計算=》?麥肯錫:“數(shù)據(jù),已經(jīng)滲透到當(dāng)今每一個行業(yè)和業(yè)務(wù)職能領(lǐng)域,成為重要的生產(chǎn)因素。人們對于海量數(shù)據(jù)的挖掘和運用,預(yù)示著新一波生產(chǎn)率增長和消費者盈余浪潮的到來。”3.BigDataMay2011,麥肯錫,BigData:Thenextgenerationfrontierforinnovation,competitionandproductivity2012年3月,美國奧巴馬政府宣布投資2億美元啟動“大數(shù)據(jù)研究和發(fā)展計劃”,2012年12月24日《人民日報》發(fā)表《當(dāng)“大數(shù)據(jù)”來敲門》4.國內(nèi)2012年9月《計算機學(xué)會通訊》刊登了李國杰院士等撰寫的學(xué)術(shù)界談大數(shù)據(jù)的專題文章《人民日報》發(fā)表《當(dāng)“大數(shù)據(jù)”來敲門》等相關(guān)文章第一屆中國云計算大會,2009年5月主辦單位:中國電子學(xué)會第五屆,指導(dǎo)單位:工業(yè)和信息化部、國家發(fā)展和改革委員會、科學(xué)技術(shù)部5.領(lǐng)域搜索引擎電子商務(wù)(淘寶網(wǎng),)生物天氣預(yù)報核物理
3D動漫圖像處理6.遙感大數(shù)據(jù)“十二五”期間的目標(biāo)100顆衛(wèi)星在軌穩(wěn)定運行4月26日,我國高分辨率對地觀測系統(tǒng)首發(fā)星“高分一號”成功發(fā)射2012年,我國首顆高分辨率測繪衛(wèi)星“資源三號”在太原衛(wèi)星發(fā)射;每天接收、處理和存儲的數(shù)據(jù)達(dá)到1790GBNASA在2011年10月1日至2012年9月30日期間統(tǒng)計EOSDIS平均每日數(shù)據(jù)存檔增長為6.4TB/d,終端用戶平均每日分發(fā)數(shù)據(jù)量為17.1TB/d,總存檔數(shù)據(jù)量達(dá)7.4PB.7.遙感的數(shù)據(jù)處理平臺加拿大PCIGeomatica美國的ENVI美國ERDAS公司的ERDASIMAGING法國的像素工廠(PixelFactory)中國測繪科學(xué)研究院研制的PixelGrid8.并行遙感數(shù)據(jù)分析ESRIprovidesseveralcloud-basedGISsolutions:ArcGISServeronAmazonEC2,云檢索
云存儲
云訂購
云服務(wù)
云發(fā)布9.IBM超級計算機再次戰(zhàn)勝人類
大數(shù)據(jù)分析由IBM和美國德克薩斯大學(xué)聯(lián)合研制的超級計算機“沃森”(Watson)近日在美國最受歡迎的智力競猜電視節(jié)目《危險邊緣》中擊敗該節(jié)目歷史上兩位最成功的選手肯-詹寧斯和布拉德-魯特,成為《危險邊緣》節(jié)目新的王者。Watson由90臺IBMPower750服務(wù)器和DeepQA分析軟件組成,(2880coresand16Terabytesofmemory)10.技術(shù)分析Watson通過攝像頭拍下屏幕上的文字,然后進(jìn)行光學(xué)識別,得到以文字而不是圖像形式存儲的題目文本:信息檢索能力+信息的提取以及分析+自動推理+NaturalLanguageProcessingwatson需要一個語音合成引擎將這個答案的文本轉(zhuǎn)換成語音并播放出來就可以了。11.大數(shù)據(jù)與云計算以“大數(shù)據(jù)大帶寬推動云計算應(yīng)用與創(chuàng)新”為主題的第五屆中國云計算大會在以客戶為中心,來構(gòu)建大網(wǎng)絡(luò)和大數(shù)據(jù),最終以云計算服務(wù)模式來交付,以達(dá)到最終的愿景:即正確的時間、精確的位置、適當(dāng)?shù)姆椒ê徒K端,讓客戶得到所需的服務(wù)?!辈杉鎯Ψ治?2.大數(shù)據(jù)與云計算13.目錄背景并行處理硬件系統(tǒng)并行處理軟件系統(tǒng)消息傳遞接口大規(guī)模異構(gòu)并行架構(gòu)14.
世界Top50015.IBMSequoia(紅杉)computenodes
:32*16*2*96=9830416.國內(nèi)Top10017.天河一號103個機柜、占地面積近千平方米、總重量155噸,每年電費可高達(dá)1800萬元
–計算結(jié)點B(IntelXeonEP+NVIDIAGPU):7168個,含14336個CPU、7168個GPU;–點點通信帶寬40Gbps;延遲1.2us–總?cè)萘繛?PB;18.國產(chǎn)三臺千萬億次機名稱完成時間研制單位主要特點天河1號2010年10月國防科大、浪潮公司等采用異構(gòu)混合體系結(jié)構(gòu),部分采用國產(chǎn)飛騰處理器,峰值性能每秒4700萬億次,實測Linpack性能2507萬億次,在2010年11月中發(fā)布的世界高性能計算機TOP500榜中排在第一位。曙光6000(星云)2010年5月中科院計算所、曙光公司等采用混合體系結(jié)構(gòu),系統(tǒng)峰值性能每秒3000萬億次,Linpack性能為1.27千萬億次每少,功耗2600千瓦,在2010年6月份世界TOP500中排名第二。下一步將采用國產(chǎn)處理器龍芯3B。神威藍(lán)光2010年年底江南計算所全部采用自主的多核高性能處理器實現(xiàn),在我們國家高性能計算機發(fā)展史上具有里程碑的意義,同時探索萬萬億次體系結(jié)構(gòu)和高性能技術(shù)。19.國家超算中心上海超級計算中心天津超級計算中心(投資6億元)深圳超級計算中心(總投資8億元)長沙超級計算中心(總投資7.2億元)濟(jì)南超級計算中心(投資6億元)廣州超級計算中心(投資16億元)。。。。。。20.高校高性能計算平臺建設(shè)南京大學(xué)高性能計算機系統(tǒng)
花費二千萬元建成的。在“2009年第七,在全國高校系統(tǒng)“科學(xué)計算/教育”領(lǐng)域中排名第一。南京微結(jié)構(gòu)國家實驗室吉林大學(xué)高性能計算中心1300萬元,40萬億次,在2010年6月TOP500第239位,居全國高校首位。
清華大學(xué)
3千萬元,100T,CPU計算峰值可達(dá)104萬億,GPGPU部分的計算峰值可達(dá)68萬億次/秒,百萬億次超算系統(tǒng)在9個機柜中即可實現(xiàn)21.地方政府北京亦莊的北京云計算基地上海云海計劃成都云計算中心無錫城市云計算中心鄂爾多斯綠色云計算數(shù)據(jù)中心22.并行計算基礎(chǔ)--計算機體系結(jié)構(gòu)并行計算機
共享存儲的對稱多處理器系統(tǒng)SMP
分布存儲的大規(guī)模并行處理系統(tǒng)(MPP)
計算機集群系統(tǒng)(Cluster)
集群系統(tǒng)優(yōu)點:
可靠性、擴(kuò)展性和性價比
23.圖世界500強計算機體系結(jié)構(gòu)發(fā)展趨勢圖
集群系統(tǒng)的發(fā)展
24.系統(tǒng)總體架構(gòu)25.26.集群系統(tǒng)
由節(jié)點和集群互連網(wǎng)絡(luò)組成,再配置上全局軟件,是一種松散耦合的多機系統(tǒng).通過各節(jié)點的并行運行,可以實現(xiàn)高性能的并行計算.
節(jié)點:機架式或者刀片式網(wǎng)絡(luò):InfiniBand和千兆以太網(wǎng).
27.性能評測28.MPI-集群性能評測理論峰值=主頻×每個時鐘周期浮點運算的次數(shù)×CPU數(shù)HPL(HighPerformanceLinpack)
29.Green500&Graph500
Green500也有一個衡量指標(biāo),即每瓦功耗所獲取的運算性能(MFLOPS/W)。Graph500benchmark;Dataintensivecomputing30.軟件環(huán)境組成操作系統(tǒng)作業(yè)調(diào)度系統(tǒng)管理和監(jiān)控軟件并行開發(fā)軟件客戶端軟件31.HighperformanceLinpack1、操作系統(tǒng)LINUX2、并行軟件MPICH23、數(shù)學(xué)庫Gotoblas,BLAS(BasicLinearAlgebraSubprograms)4、HPL32.33.并行計算平臺的使用申請帳號熟悉軟件:putty和winscp熟悉常用Linux命令掌握MPI函數(shù)Linux環(huán)境下vi編輯器編寫程序或者本地編寫后上傳程序
Linux編譯鏈接運行34.摩爾定律的困境CPU發(fā)展規(guī)律:“摩爾定律”:由于物理定律的限制,采用提高CPU制程和主頻的辦法遇到了工藝上的壁壘,暫時無法突破GPU發(fā)展規(guī)律:1993年開始,GPU的性能以每年2.8倍的速度增長峰值發(fā)展趨勢帶寬發(fā)展趨勢35.二者的區(qū)別與聯(lián)系CPU和GPU的聯(lián)系都是計算機體系結(jié)構(gòu)中的重要部分超大規(guī)模集成電路元件能夠完成浮點運算功能GPU的設(shè)計目標(biāo)與CPU是不同的:CPU的微架構(gòu)是按照兼顧“指令并行執(zhí)行”和“數(shù)據(jù)并行運算”的思路而設(shè)計。CPU的大部分晶體管主要用于構(gòu)建控制電路和CacheCPU的5%是ALU,控制電路設(shè)計更加復(fù)雜CPU的內(nèi)存延遲是GPU的1/10GPU其實是由硬件實現(xiàn)的一組圖形函數(shù)的集合。GPU控制電路相對簡單,而且對Cache的需求小,所以可以把大部分的晶體管用于計算單元GPGPU的40%是ALUGPGPU的內(nèi)存帶寬是CPU的10倍36.GPU(graphicsprocessingunit)NVIDIA公司在1999年發(fā)布GeForce256圖形處理芯片時首先提出GPU的概念。1999年,T&L(TransformandLighting,多邊形轉(zhuǎn)換與光源處理)2000年,微軟發(fā)布了DirectX8.0,像素渲染(PixelShader)與頂點渲染(VertexShader),使GPU真正成為了可編程的處理器,
37.GPU對3D圖形的處理—圖形的生成渲染
1、頂點生成2、頂點處理3、光柵化計算4、紋理帖圖
5、像素處理6、最終輸出38.RADEONX1900
Architecture
39.統(tǒng)一渲染架構(gòu)和幾何著色
2006,微軟發(fā)布了DirectX10.0,統(tǒng)一渲染架構(gòu)和幾何著色。40.nVIDIAGTX6804個GraphicsProcessingClusters(GPC)每個GPC由2SMX組成每個SMX當(dāng)中包含192CUDACore核心共擁有1536個CUDACore
3.09TFLOPs41.nVIDIATeslaC2050GPGPUK20應(yīng)用領(lǐng)域加速卡高性能運算服務(wù)器處理器內(nèi)核頻率1.15GHz1.5GHz處理器核心數(shù)目4482496單精度浮點峰值1.03TFlops3.52TFlops雙精度浮點峰值515Gflops1.17TFlops專用內(nèi)存3GB5GB內(nèi)存位寬384位GDDR5320位GDDR5內(nèi)存帶寬144GB/s208GB/s功耗238W225W42.AMD/ATIGPU的發(fā)展2006年7月24日,AMD購并ATI,2011~,7970,7950HD7970具有2048個流處理器(單精度浮點3.79TFlops,雙947GFlops),Tahiti擁有32個GCN陣列,每個GCN陣列里面包括4個SIMD單元,每個SIMD包括16個1D標(biāo)量運算單元43.Future---融合CPU向多核化,GPU向眾核化發(fā)展GPU-CPU融合Intel--SandyBridgeAMD--AcceleratedProcessingUnit(APU)Nvidia--ProjectDenver44.GPU是一種高度并行的,多線程的,眾核處理器;非常適合處理計算密集型的數(shù)據(jù)并行任務(wù);SandyBridge:每顆CPU核心、高速緩存段、核顯和內(nèi)核管理中心等可以互相交換數(shù)據(jù)GPU普適性45.IntelHDGraphicsHDGraphics(6executionunits)HDGraphics2500(6EU)HDGraphics4000(16EU)HaswellHDGraphics(GT1,6EU)HDGraphics4200,4XXX,(GT2,20EU)HDGraphics5000,IrisGraphics5100(GT3,40EUIrisProGraphics520046.AcceleratedProcessingUnitAPU,CPU通過北橋訪問內(nèi)存;采用FusionComputeLink來將北橋、GPU、IO連接在一起,同時在GPU和北橋之間搭建RadeonMemoryBus,目的是讓GPU與內(nèi)存進(jìn)行高速數(shù)據(jù)交換,從而提升3D性能與并行計算性能。47.GPU開發(fā)軟件DirectX(MS)OpenGLCUDA(2007年6月,NVIDIA)OpenCLDirectCompute,C++AMPMatlabOpenACCPortlandGroup(PGI),PGIAccelerator48.CUDA2006年11月與G80一同誕生2007年6月,1.0版與Tesla2013年5,CUDA5.549.ComputeUnifiedDeviceArchitecture50.OpenComputingLanguage蘋果發(fā)起,Khronos開發(fā)2008年6月蘋果公司提出AMD,Intel,ARM,NVIDIA,Qualcomm,Nokia,IBM,Samsung,TI等Microsoft是例外適合CPU、GPU、CELL、DSP架構(gòu)AMDAMDAcceleratedParallelProcessingSDK2.5,全面支持OpenCL1.1NVIDIA支持OpenCL51.開發(fā)工具intel2012年,推出SDKforOpenCLApplications/en-us/vcsource/tools/opencl-sdkAMD2012年,推出了CodeXL1.0beta
幫助開發(fā)者更好利用CPU,GPU和APU計算性能的綜合開發(fā)工具套裝,具有強大的GPU調(diào)試、CPU和GPU代碼分析、及靜態(tài)的OpenCLkernel性能分析等能力。
52.OpenACC英偉達(dá)、Cray、PortlandGroup(PGI)以及CAPSOpenACC:DirectivesforGPUs,OpenMPvoidsaxpy_parallel(intn,floata,float*x,float*restricty){#pragmaacckernels
for(inti=0;i<n;++i)y[i]=a*x[i]+y[i];}
53.圖形API
DirectXOpenGL1.0September30,1995January1992.2.01996September7,20043.0September15,1996July11,20084.0NeverlaunchedMarch11,20105.0August4,19976.0August7,19987.0September22,19998.0November12,20009.0December19,200210.0November30,200611october22,2009
54.DirectCompute2009年10月22日,微軟公司正式發(fā)布Windows7,DirectX11集成在Windows7中同步登場
DirectCompute是MicrosoftDirectX的一部分。DirectX10:DirectCompute4.0
DirectX10.1:DirectCompute4.1
DirectX11:DirectCompute5.0。2011,6月16,AMDFusion開發(fā)者峰會上,微軟發(fā)布了C++AMP,(AcceleratedMassiveParallelism)
55.C++AMP微軟于11年6月推出的一個異構(gòu)并行編程框架,VisualStudio11開發(fā)者預(yù)覽版起支持。
六個特征
C++而不是C主流最小的改動可移植的通用且不會過時開放
56.MIC--XeonPhi入門級3100高端5100頂級7100
Xeon
Phi
5110P擁有60個核心,每一個核心都有著4個線程,1.05GHz,2級緩存為30MB,最大支持8GB的GDDR5內(nèi)存尋址,內(nèi)存帶寬高達(dá)320Gbps,雙精度浮點計算能力能夠達(dá)到1TFLOPS$2,64957.XeonPhi開發(fā)代號為KnightsCorner
PCIExpressVectorProcessingUnit(VPU).OS由Linux修改,uOSMicroOperatingSystem包括C、C++和Fortran支持OpenMP、pThread、MPI58.計算的發(fā)展1997年,top1,美國桑迪亞國家實驗室的“ASCI紅”,是世界上首個突破每秒一萬億次(TeraFLOPS)浮點運算的系統(tǒng),它采用了9298個英特爾奔騰Pro處理器,成本約每一萬億次55,000,000美元。,2011年,每一萬億次(TeraFLOPS)的擁有成本降到了低于1000美元。高性能計算確確實實已經(jīng)為所有人觸手可及。
59.云終端
ImaginationTechnologies,PowerVR的SGX系列(PowerVRG6230/6430,100GFLOPS高通(QUALCOMM)Adreno320,OpenCL1.2博通(Broadcom)BCM系列NVIDIATegraARM的Mali圖形處理單元。
Mali-T628核心數(shù)量4-8個,OpenCL
60.并行處理軟件系統(tǒng)基礎(chǔ)知識OpenMP消息傳遞接口MatlabOpenCL61.負(fù)載均衡問題
62.負(fù)載均衡問題
63.負(fù)載均衡問題經(jīng)典算法
64.負(fù)載均衡問題
65.性能分析66.Amdahl定律67.Gustafson定律
68.加速比性能定律Sun&Ni’sLaw:BaseonMemoryBounding充分利用存儲空間等計算資源,盡量增大問題規(guī)模以產(chǎn)生更好/更精確的解。是Amdahl定律和Gustafson定律的推廣。公式推導(dǎo):設(shè)單機上的存儲器容量為M,其工作負(fù)載W=fW+(1-f)W當(dāng)并行系統(tǒng)有p個結(jié)點時,存儲容量擴(kuò)大了pM,用G(p)表示系統(tǒng)的存儲容量增加p倍時工作負(fù)載的增加量。則存儲容量擴(kuò)大后的工作負(fù)載為W=fW+(1-f)G(p)W,所以,存儲受限的加速為特別地:當(dāng)G(p)=1時,為Amdahl定律;當(dāng)G(p)=p時,為Gustafson定律;69.OpenMultiprocessing(OpenMP)支持C、C++和Fortran編譯指導(dǎo)語句而GCC4.4支持OpenMP3標(biāo)準(zhǔn)MicrosoftVisualStudio支持適用于共享存儲架構(gòu)70.Fork-Join執(zhí)行模式在開始執(zhí)行的時候,只有主線程的運行線程存在主線程在運行過程中,當(dāng)遇到需要進(jìn)行并行計算的時候,派生出(Fork,創(chuàng)建新線程或者喚醒已有線程)線程來執(zhí)行并行任務(wù)在并行執(zhí)行的時候,主線程和派生線程共同工作在并行代碼結(jié)束執(zhí)行后,派生線程退出或者掛起,不再工作,控制流程回到單獨的主線程中(Join,即多線程的會和)。71.并行Helloworld#include<stdio.h>#include<omp.h>intmain(intargc,char**argv){
intnthreads,thread_id;
printf("Iamthemainthread.\n");
#pragmaompparallelprivate(nthreads,thread_id)
{
nthreads=omp_get_num_threads();
thread_id=omp_get_thread_num();
printf("Hello.Iamthread%doutofateamof%d\n",thread_id,nthreads);
}printf("HereIam,backtothemainthread.\n");return0;}72.幾點說明#pragmaompparallel,創(chuàng)建并行區(qū):并行區(qū)里每個線程都會去執(zhí)行并行區(qū)中的代碼。控制并行區(qū)中線程的數(shù)量并行區(qū)內(nèi)線程數(shù)=系統(tǒng)中核的個數(shù)。setOMP_NUM_THREADS=4
gcc:gcc-fopenmphello.c-ohello73.循環(huán)并行化循環(huán)并行化是是把一個循環(huán)分成多部分在不同的進(jìn)程上執(zhí)行。#pragmaompparallelforfor(inti=0;i<n;i++)
z[i]=x[i]+y[i];工作原理:將for循環(huán)中的工作分配到一個線程組中,線程組中的每一個線程將完成循環(huán)中的一部分內(nèi)容;74.消息傳遞接口(MPI)MPI庫函數(shù)MPI目前支持C、C++和FORTRAN語。一個MPI并行程序由一組運行在相同或不同計算機上的進(jìn)程構(gòu)成。進(jìn)程組(processgroup)進(jìn)程號(rank)75.消息傳遞接口(MPI)下面給出基于C語言的并行程序框架#include"并行庫"intmain(int
argc,char**argv){
使用MPI_Init函數(shù)初始化并行計算環(huán)境;
使用MPI_Comm_size函數(shù)返回指定通信器中進(jìn)程的數(shù)目;
使用MPI_Comm_rank函數(shù)返回指定通信器中本進(jìn)程的進(jìn)程號;
并行程序代碼和進(jìn)程通信代碼;
使用MPI_Finalize退出并行計算環(huán)境,并行程序結(jié)束;
Return0;}76.并行Helloworld#include"mpi.h"intmain(argc,argv)intargc;char**argv;{intrank,size;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);printf("Helloworldfromprocess%dof%d\n",rank,size);MPI_Finalize();return0;}Helloworldfromprocess0of3
Helloworldfromprocess1of3
Helloworldfromprocess2of3
77.MPI程序的的編譯與運行mpif77–ohellohello.f或mpicc–ohellohello.c生成hello的可執(zhí)行代碼.mpirun–np4hello4指定np的實參,表示進(jìn)程數(shù),由用戶指定.hello要運行的MPI并行程序.%小寫onp:Thenumberofprocess.78.通信模式點對點通信(pointtopointcommunication)阻塞型:MPI_Send和MPI_Recv。非阻塞型:MPI_Isend和MPI_Irecv。聚合通信(collectivecommunication)一對多通信:廣播MPI_Bcast多對一通信:數(shù)據(jù)收集MPI_Gather,
多對多通信:全交換MPI_Alltoall79.發(fā)送消息語法MPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag,MPI_Commcomm)將緩沖區(qū)中的count個datatype數(shù)據(jù)類型的數(shù)據(jù)發(fā)送到目的進(jìn)程dest,本次發(fā)送的消息標(biāo)志是tag,使用這一標(biāo)志就可以把本次發(fā)送的消息和本進(jìn)程向同一日的進(jìn)程發(fā)送的其它消息區(qū)別開來;MPI_SEND操作指定的發(fā)送緩沖區(qū)是由count個類型為datatype的連續(xù)數(shù)據(jù)空間組成80.接收消息語法MPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commncomm.,MPI_Status*status)從指定的進(jìn)程source接收消息,其它參數(shù)意義與發(fā)送操作類似;應(yīng)該注意的是,接收到消息的長度必須小于或等于接收緩沖區(qū)的長度,這是因為如果接收到的數(shù)據(jù)過大,而MPI沒有截斷機制,接收緩沖區(qū)會發(fā)生溢出錯誤。81./*first.c*/#include“mpi.h” /*MPI的頭函數(shù),intmain(intargc,char**argv){intrank,size,tag=333;intbuf[20]MPI_StatusstatusMPI_Init(&argc,&argv); /*MPI的初始化函數(shù)*/MPI_Comm_rank(MPI_COMM_WORLD,&rank);/*該進(jìn)程的編號*/MPI_Comm_size(MPI_COMM_WORLD,&size);/*總的進(jìn)程數(shù)目*/if(rank==0)MPI_Send(buf,20,MPI_Int,1,tag,MPI_COMM_WORLD); if(rank==1)MPI_Recv(buf,20,MPI_Int,0,tag,MPI_COMM_WORLD,&status);
MPI_Finalize(); /*MPI的結(jié)束函數(shù)*/return0;}82.聚合通信(CollectiveCommunication)
從一個進(jìn)程到本組內(nèi)的所有進(jìn)程的播送broadcast從本組所有進(jìn)程收集數(shù)據(jù)到一個進(jìn)程gather從一個進(jìn)程分散數(shù)據(jù)到本組內(nèi)的所有進(jìn)程sactter83.84.April23MPI并行程序設(shè)計85/217數(shù)據(jù)聚集ReduceAllreduceReduce-scatterScanMPI預(yù)定義全局?jǐn)?shù)據(jù)運算符:MPI_MAX/MPI_MIN;MPI_SUM求和MPI_PROD求積MPI_LAND邏輯與MPI_LOR邏輯或MPI_MAXLOC/MPI_MINLOC最大/小值求下相應(yīng)位置…
…85.86.87.intp,myrank;floatbuf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進(jìn)程編號*/MPI_Comm_rank(comm,&my_rank);/*得進(jìn)程總數(shù)*/MPI_Comm_size(comm,&p);if(myrank==0) buf=1.0;MPI_Bcast(&buf,1,MPI_FLOAT,0,comm);Broadcast--數(shù)據(jù)廣播databuf..MPI_Bcast();.data..MPI_Bcast();.data..MPI_Bcast();.Process0myrank=0Process1myrank=1Processp-1myrank=p-1intMPI_Bcast( void*buffer,/*發(fā)送/接收buf*/ intcount, /*元素個數(shù)*/ MPI_Datatypedatatype,
introot, /*指定根進(jìn)程*/ MPI_Commcomm)根進(jìn)程既是發(fā)送緩沖區(qū)也是接收緩沖區(qū)88.Gather--數(shù)據(jù)收集intp,myrank;floatdata[10];/*分布變量*/float*buf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進(jìn)程編號*/MPI_Comm_rank(comm,&my_rank);/*得進(jìn)程總數(shù)*/MPI_Comm_size(comm,&p);if(myrank==0) buf=(float*)malloc(p*10*sizeof(float);/*開辟接收緩沖區(qū)*/MPI_Gather(data,10,MPI_FLOAT, buf,10,MPI_FlOAT,0,comm);data.MPI_Gather();.data.MPI_Gather();.data.MPI_Gather();.Process0myrank=0Process1myrank=1Processp-1myrank=p-1根進(jìn)程接收其他進(jìn)程來的消息(包括根進(jìn)程),按每在進(jìn)程在通信組中的編號依次聯(lián)接在一下,存放在根進(jìn)程的接收緩沖區(qū)中.intMPI_Gather(void*sendbuf,intsendcnt,MPI_Datatypesendtype,void*recvbuf,intrecvcount,MPI_Datatyperecvtype,introot,MPI_Commcomm)buf89.Scatter--數(shù)據(jù)分散intp,myrank;floatdata[10];float*buf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進(jìn)程編號*/MPI_Comm_rank(comm,&my_rank);/*得進(jìn)程總數(shù)*/MPI_Comm_size(comm,&p);if(myrank==0) buf=(float*)malloc(p*10*sizeof(float);/*開辟發(fā)送緩沖區(qū)*/MPI_Scatter(buf,10,MPI_FLOAT, data,10,MPI_FlOAT,0,comm);data.MPI_Scatter();.data.MPI_Scatter();.data.MPI_Scatter();.Process0myrank=0Process1myrank=1Processp-1myrank=p-1根進(jìn)程中存儲了p個消息,第i個消息將傳給第i個進(jìn)程.intMPI_Scatter(void*sendbuf,intsendcnt,MPI_Datatypesendtype,void*recvbuf,intrecvcnt,MPI_Datatyperecvtype,introot,MPI_Commcomm)buf90.Reduce--全局?jǐn)?shù)據(jù)運算intp,myrank;floatdata=0.0;floatbuf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進(jìn)程編號*/MPI_Comm_rank(comm,&my_rank);/*各進(jìn)程對data進(jìn)行不同的操作*/data=data+myrank*10;/*將各進(jìn)程中的data數(shù)相加并存入根進(jìn)程的buf中*/MPI_Reduce(&data,&buf,1,MPI_FLOAT,MPI_SUM,0,comm);data.MPI_Scatter();.data.MPI_Scatter();.data.MPI_Scatter();.Process0myrank=0Process1myrank=1Processp-1myrank=p-1對組中所有進(jìn)程的發(fā)送緩沖區(qū)中的數(shù)據(jù)用OP參數(shù)指定的操作進(jìn)行運算,并將結(jié)果送回到根進(jìn)程的接收緩沖區(qū)中.intMPI_Reduce(void*sendbuf,void*recvbuf,intcount,MPI_Datatypedatatype,MPI_Opop,introot,MPI_Commcomm)buf+91.類型函數(shù)功能數(shù)據(jù)移動MPI_Bcast一到多,數(shù)據(jù)廣播MPI_Gather多到一,數(shù)據(jù)匯合MPI_GathervMPI_Gather的一般形式MPI_AllgatherMPI_Gather的一般形式MPI_AllgathervMPI_Allgather的一般形式MPI_Scatter一到多,數(shù)據(jù)分散MPI_ScattervMPI_Scatter的一般形式MPI_Alltoall多到多,置換數(shù)據(jù)(全互換)MPI_AlltoallvMPI_Alltoall的一般形式數(shù)據(jù)聚集MPI_Reduce多到一,數(shù)據(jù)歸約MPI_Allreduce上者的一般形式,結(jié)果在所有進(jìn)程MPI_Reduce_scatter結(jié)果scatter到各個進(jìn)程MPI_Scan前綴操作同步MPI_Barrier同步操作MPI集合通信函數(shù)All:表示結(jié)果到所有進(jìn)程.V:Variety,被操作的數(shù)據(jù)對象和操作更為靈活.%92.避免死鎖deadlock發(fā)送和接收是成對出現(xiàn)的,忽略這個原則很可能會產(chǎn)生死鎖總會死鎖的通信調(diào)用次序93.安全的通信調(diào)用次序94.實例分析:求PI95.串行代碼h=1.0/(double)n;sum=0.0;for(i=1;i<=n;i++){ x=h*((double)i–0.5); sum+=f(x);}pi=h*sum;doublef(doublea){ return(4.0/(1.0+a*a));}96.并行代碼h=1.0/(double)n;sum=0.0;for(i=myid+1;i<=n;i+=numprocs){ x=h*((double)i–0.5); sum+=f(x);}mypi=h*sum;MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);doublef(doublea){ return(4.0/(1.0+a*a));}97.cpi.c#include"mpi.h"#include<stdio.h>#include<math.h>doublef(double);doublef(doublea){return(4.0/(1.0+a*a));}98.cpi.cintmain(intargc,char*argv[]){intdone=0,n,myid,numprocs,i;doublePI25DT=3.141592653589793238462643;doublemypi,pi,h,sum,x;doublestartwtime=0.0,endwtime;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Get_processor_name(processor_name,&namelen);fprintf(stderr,"Process%don%s\n",myid,processor_name);99.=100;while(!done){if(myid==0){
startwtime=MPI_Wtime();}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
100.cpi.cif(n==0)done=1;else{h=1.0/(double)n;sum=0.0;for(i=myid+1;i<=n;i+=numprocs){x=h*((double)i-0.5);sum+=f(x);}mypi=h*sum;
101.April23MPI并行程序設(shè)計cpi.cMPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);if(myid==0){printf("piisapproximately%.16f,Erroris%.16f\n",pi,fabs(pi-PI25DT));
endwtime=MPI_Wtime();printf("wallclocktime=%f\n",endwtime-startwtime);}}}
MPI_Finalize();return0;}102.CUDA架構(gòu)發(fā)展103.CUDA邏輯結(jié)構(gòu)及內(nèi)存結(jié)構(gòu)在CUDA的程序架構(gòu)中,程序執(zhí)行區(qū)域分為兩個部分:Host與Device。Host指在CPU上執(zhí)行的部分Device指在GPU上執(zhí)行的部分,這部分又稱為“kernel”通常,Host程序會將需要并行計算的數(shù)據(jù)復(fù)制到GPU的顯存,再由GPU執(zhí)行Device程序,完成后再由Host程序?qū)⒔Y(jié)果從GPU顯存中取回104.示例,cuda.cu#include<cuda_runtime.h>
/*運行在GPU端的程序*/
__global__voidvectorADD(int*a,int*b,int*c)
{
intindex=threadIdx.x;//獲得當(dāng)前線程的序號
if(index<blockDim.x)
c=a+b;
}
intmain()
{
/*定義10個GPU運算線程*/
intN=10;
/*本地開辟三個數(shù)組存放我們要計算的內(nèi)容*/
int*h_a=(int*)malloc(N*sizeof(int));//
*h_b,int*h_c;
/*初始化數(shù)組A,B和C*/
for(inti=0;i<N;i++)
{
h_a=i;
h_b=i;
h_c=0;
}
105.示例,cuda.cu
intsize=N*sizeof(int);/*計算10個int型需要的空間*/
/*在GPU上分配同樣大小的三個數(shù)組*/
int*d_a;
int*d_b;
int*d_c;
cudaMalloc((void**)&d_a,size);
//
d_b,
d_c
/*把本地的數(shù)組拷貝進(jìn)GPU內(nèi)存*/
cudaMemcpy(d_a,h_a,size,cudaMemcpyHostToDevice);
d_bh_b;
d_ch_c
/*定義一個GPU運算塊由10個運算線程組成*/
dim3DimBlock=N;
/*通知GPU用10個線程執(zhí)行函數(shù)vectorADD*/
vectorADD<<<1,DimBlock>>>(d_a,d_b,d_c);
/*將GPU運算完的結(jié)果復(fù)制回本地*/
cudaMemcpy(h_c,d_c,size,cudaMemcpyDeviceToHost);
/*釋放GPU的內(nèi)存*/
cudaFree(d_a);
//d_b,
d_c;
/*驗證計算結(jié)果*/
}
106.數(shù)據(jù)并行與任務(wù)并行數(shù)據(jù)并行是所有線程中執(zhí)行的內(nèi)核(kernel)是相同的,只是處理的數(shù)據(jù)會根據(jù)內(nèi)核代碼分支等原因而不同。任務(wù)并行則在每個線程中執(zhí)行不同的代碼
107.OpenCL開放計算語言O(shè)penComputingLanguage蘋果發(fā)起,Khronos開發(fā)2008年6月蘋果公司提出AMD,Intel,ARM,NVIDIA,Qualcomm,Nokia,IBM,Samsung,TI等Microsoft是例外適合CPU、GPU、CELL、DSP、ARM、FPGA、Altera108.OpenCL由一個并行計算API和一種針對此類計算的編程語言組成C99編程語言并行擴(kuò)展子集;適用于各種類型異構(gòu)處理器的坐標(biāo)數(shù)據(jù)和基于任務(wù)并行計算API;基于IEEE754標(biāo)準(zhǔn)的數(shù)字條件;與OpenGL、OpenGLES和其他圖形類API高效互通提供了基于任務(wù)分割和數(shù)據(jù)分割的并行計算機制KhronosGroup/opencl/109.OpenCL四種模型OpenCLallowsparallelcomputingonheterogeneousdevicesCPUs,GPUs,Cell,DSPs,etc)Providesportableacceleratedcode平臺模型(PlatformModel)執(zhí)行模型(ExecutionModel)內(nèi)存模型(MemoryModel)編程模型(ProgrammingModel)
110.PlatformModelEachOpenCLimplementation(i.e.anOpenCLlibraryfromAMD,NVIDIA,etc.)definesplatformswhichenablethehostsystemtointeractwithOpenCL-capabledevicesCurrentlyeachvendorsuppliesonlyasingleplatformperimplementationOpenCLusesan“InstallableClientDriver”modelThegoalistoallowplatformsfromdifferentvendorstoco-existCurrentsystems’devicedrivermodelwillnotallowdifferentvendors’GPUstorunatthesametime111.PlatformModelThemodelconsistsofa
hostconnectedtooneormoreOpenCLdevicesAdeviceisdividedintooneormorecomputeunitsComputeunitsaredividedintooneormoreprocessingelementsEachprocessingelementmaintainsitsownprogramcounter112.Host/DevicesThehostiswhatevertheOpenCLlibraryrunsonx86CPUsforbothNVIDIAandAMDDevicesareprocessorsthatthelibrarycantalktoCPUs,GPUs,andgenericacceleratorsForAMDAllCPUsarecombinedintoasingledevice(eachcoreisacomputeunitandprocessingelement)EachGPUisaseparatedevice113113.執(zhí)行模型OpenCL的執(zhí)行模型可以分為兩部分,一部分是在host上執(zhí)行的主程序(hostprogram),另一部分是在OpenCL設(shè)備上執(zhí)行的內(nèi)核程序(kernels),OpenCL通過主程序來定義上下文并管理內(nèi)核程序在OpenCL設(shè)備的執(zhí)行。OpenCL執(zhí)行模型的核心工作就是管理kernel在OpenCL設(shè)備上的運行。在Host創(chuàng)建一個kernel程序之前必須先為該kernel創(chuàng)建一個標(biāo)識了索引的工作空間,kernel會在工作空間每個節(jié)點(workitem)上執(zhí)行114.ThreadStructureWork-itemscanuniquelyidentifythemselvesbasedon:Aglobalid(uniquewithintheindexspace)Awork-groupIDandalocalIDwithinthework-group115.ThreadStructureAPIcallsallowthreadstoidentifythemselvesandtheirdataThreadscandeterminetheirglobalIDineachdimensionget_global_id(dim)get_global_size(dim)Ortheycandeterminetheirwork-groupIDandIDwithintheworkgroupget_group_id(dim)get_num_groups(dim)get_local_id(dim)get_local_size(dim)get_global_id(0)=column,get_global_id(1)=rowget_num_groups(0)*get_local_size(0)==get_global_size(0)116.MemoryModel117.使用OpenCL編程的6個步驟
查找支持OpenCL的硬件設(shè)備(Device),并創(chuàng)建上下文(Context)創(chuàng)建命令隊列(CommandQueue)及包含了內(nèi)核的程序(Program);如果該程序是源代碼,則還需進(jìn)行在線編譯。創(chuàng)建程序執(zhí)行過程中需要的內(nèi)存對象(Buffer)及圖像對象(ImageObject),并初始化創(chuàng)建內(nèi)核對象(可理解為Kernel中的函數(shù))并設(shè)置其所需參數(shù)設(shè)置內(nèi)核的索引空間(NDRange)并執(zhí)行內(nèi)核。其中NDRange通過全局尺寸(GlobalSize)和工作包尺寸(WorkGroup)來進(jìn)行管理。將運行的結(jié)果拷貝回主機(Host)內(nèi)存。118.主機處理器上運行的代碼打開OpenCL上下文,獲得并選擇執(zhí)行設(shè)備,創(chuàng)建命令隊列,以接受并執(zhí)行內(nèi)存請求,分配OpenCL內(nèi)存對象以掌握用于計算內(nèi)核的輸入和輸出,在線編譯及構(gòu)建計算內(nèi)核代碼,建立參數(shù)和執(zhí)行域,開始執(zhí)行計算內(nèi)核收集結(jié)果。119.cl_uintnumPlatforms;cl_platform_idplatform=NULL;status=clGetPlatformIDs(0,NULL,&numPlatforms);if(status!=CL_SUCCESS){returnEXIT_FAILURE;}if(numPlatforms>0){cl_platform_id*platforms=*)malloc(numPlatforms*sizeof(cl_platform_id));status=clGetPlatformIDs(numPlatforms,platforms,NULL);if(status!=CL_SUCCESS){return-1;}使用示例120.clGetPlatformInfocharpbuff[100];status=clGetPlatformInfo(platforms[i],CL_PLATFORM_VENDOR,sizeof(pbuff),pbuff,NULL);platform=platforms[i];If(!Strcmp(pbuff,”AdvancedMicroDevices,Inc.”))break;121.SelectingDevicesWecanspecifywhichtypesofdevicesweareinterestedin(e.g.alldevices,CPUsonly,GPUsonly)ThiscallisperformedtwiceaswithclGetPlatformIDsThefirstcallistodeterminethenumberofdevices,thesecondretrievesthedeviceobjectsOnceaplatformisselected,wecanthenqueryforthedevicesthatitknowshowtointeractwith122122.clGetDeviceInfoclGetDeviceInfo(cl_device_iddevice,cl_device_infoparam_name,size_tparam_value_size,void*param_value,size_t*param_value_size_ret)用戶可以通過clGetDeviceInfo獲得每個設(shè)備的具體信息,例如設(shè)備類型,生產(chǎn)商,設(shè)備是否支持某些拓展功能等等123.ContextsAcontextreferstotheenvironmentformanagingOpenCLobjectsandresourcesTomanageOpenCLprograms,thefollowingareassociatedwithacontextDevices:thethingsdoingtheexecutionProgramobjects:theprogramsourcethatimplementsthekernelsKernels:functionsthatrunonOpenCLdevicesMemoryobjects:datathatareoperatedonbythedeviceCommandqueues:mechanismsforinteractionwiththedevicesMemorycommands(datatransfers)KernelexecutionSynchronization124.ContextsThisfunctioncreatesacontextgivenalistofdevicesThepropertiesargumentspecifieswhichplatformtouse(ifNULL,thedefaultchosenbythevendorwillbeused)Thefunctionalsoprovidesacallbackmechanismforreportingerrorstotheuser125.cl_platform_idplatform_id; cl_device_iddevice_id; cl_uintnum_of_devices=0; //retreivealistofplatformsavaible clGetPlatformIDs(1,&platform_id,&num_of_platforms; //trytogetasupportedGPUdevice
clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_CPU,1,&device_id,&num_of_devices)) //contextpropertieslist-mustbeterminatedwith0 properties[0]=CL_CONTEXT_PLATFORM; properties[1]=(cl_context_properties)platform_id; properties[2]=0; //createacontextwiththeGPUdevice
context=clCreateContext(properties,1,&device_id,NULL,NULL,&err);126.CommandQueuesAcommandqueueisthemechanismforthehosttorequestthatanactionbeperformedbythedevicePerformamemorytransfer,beginexecuting,etc.AseparatecommandqueueisrequiredforeachdeviceCommandswithinthequeuecanbesynchronousorasynchronousCommandscanexecutein-orderorout-of-order127.CommandQueuesAcommandqueueestablishesarelationshipbetweenacontextandadeviceThecommandqueuepropertiesspecify:Ifout-of-orderexecutionofcommandsisallowedIfprofilingisenabledProfilingisdoneusingevents(discussedinalaterlecture)andwillcreatesomeoverhead128.MemoryObjectsMemoryobjectsareOpenCLdatathatcanbemovedonandoffdevicesObjectsareclassifiedaseitherbuffersorimagesBuffersContiguouschunksofmemory–storedsequentiallyandcanbeaccesseddirectly(arrays,pointers,structs)Read/writecapableImagesOpaqueobjects(2Dor3D)Canonlybeaccessedviaread_image()andwrite_image()Caneitherbereadorwritteninakernel,butnotboth129.CreatingbuffersThisfunctioncreatesabuffer(cl_memobject)forthegivencontextImagesaremorecomplexandwillbecoveredinalaterlectureTheflagsspecify:thecombinationofreadingandwritingallowedonthedataifthehostpointeritselfshouldbeusedtostorethedataifthedatashouldbecopiedfromthehostpointer130.cl_meminput,output; //createbuffersfortheinputandouputinput=clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float)*DATA_SIZE,NULL,NULL);output=clCreateBuffer(context,CL_MEM_WRITE_ONLY,sizeof(float)*DATA_SIZE,NULL,NULL);CL_MEM_READ_WRITEThisflagspecifiesthatthememoryobjectwillbereadandwrittenbyakernel.Thisisthedefault.CL_MEM_READ_ONLYThisflagspecifiesthatthememoryobjectisaread-onlymemoryobjectwhenusedinsideakernel.示例131.TransferringDataOpenCLprovidescommandstotransferdatatoandfromdevicesclEnqueue{Read|Write}{Buffer|Image}CopyingfromthehosttoadeviceisconsideredwritingCopyingfromadevicetothehostisreadingThewritecommandbothinitializesthememoryobjectwithdataandplacesitonadeviceThevalidityofmemoryobjectsthatarepresentonmultipledevicesisundefinedbytheOpenCLspec(i.e.arevendorspecific)OpenCLcallsalsoexistto
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三人合伙投資合同書
- 中外合資飯店合作開發(fā)合同
- 兩大煤礦企業(yè)簽訂戰(zhàn)略合作合同
- 二手辦公用品采購合同
- 人事招聘委托代理合同規(guī)定
- 中西醫(yī)結(jié)合醫(yī)師培訓(xùn)合同范本
- 中小企業(yè)板塊上市證券合同范本(版)
- 業(yè)務(wù)外包合同格式合同
- 個人對個人借款標(biāo)準(zhǔn)合同范本
- 個人住宅改造合同范本(簡化版)
- 蛋糕店服務(wù)員勞動合同
- 土地買賣合同參考模板
- 2025高考數(shù)學(xué)二輪復(fù)習(xí)-專題一-微專題10-同構(gòu)函數(shù)問題-專項訓(xùn)練【含答案】
- 四川省綿陽市2025屆高三第二次診斷性考試英語試題(含答案無聽力原文及音頻)
- 2025年天津市政建設(shè)集團(tuán)招聘筆試參考題庫含答案解析
- 2024-2030年中國烘焙食品行業(yè)運營效益及營銷前景預(yù)測報告
- 2025年上半年水利部長江水利委員會事業(yè)單位招聘68人(湖北武漢)重點基礎(chǔ)提升(共500題)附帶答案詳解
- 寧德時代筆試題庫
- 五年級下冊北京版英語單詞
- 康復(fù)醫(yī)院患者隱私保護(hù)管理制度
- 新課標(biāo)I、Ⅱ卷 (2024-2020) 近五年高考英語真題滿分作文
評論
0/150
提交評論