版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
并行算法概述
著名计算机科学家沃思(NikiklausWirth):
算法
+数据结构=程序(1)数据结构(datastructure)对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式(2)算法(algorithm)对操作的描述。即要求计算机进行操作的步骤Content3并行计算模型(ParallelComputingModel)设计并行算法基本方法VonNeumannModel4指令处理(InstructionProcessing)5译指Decodeinstruction计算地址Evaluateaddress取操作数Fetchoperandsfrommemory执行操作Executeoperation存储结果Storeresult从内存取指令并行计算模型
ParallelComputingModel6计算模型桥接软件和硬件为算法设计提供抽象体系结构Ex)PRAM,BSP,LogP并行程序设计模型
ParallelProgrammingModel7程序员使用什么来编码?确定通信(communication)和同步(synchronization)暴露给程序员的通信原语(Communicationprimitives)实现编程模型
Ex)Uniprocessor,Multiprogramming,Dataparallel,message-passing,shared-address-spaceAspectsofParallelProcessing8AlgorithmdeveloperApplicationdeveloperInterconnectionNetworkMemoryPPPPMemoryPPPPMemoryPPPPMemoryPPPPMultiprocessorsMultiprocessorsMultiprocessorsMultiprocessorsParallelcomputingmodelParallelprogrammingmodelSystemprogrammerArchitecturedesigner3421MiddlewareParallelComputingModels–并行随机存取机(ParallelRandonAccessMachine)9特性:ProcessorsPi
(0ip-1)每一处理器可配有局部内存一全局共享内存
所有处理器都可以访问PRAM示意图10P1P2P3PpSharedMemoryCLKPprocessorsconnectedtoasinglesharedmemoryEachprocessorhasauniqueindex.SingleprogramexecutedinMIMDmode并行随机存取机ParallelRandonAccessMachine11操作类型:
同步处理器执行时会加锁
F每一步,处理器或工作或待机
F适用于SIMD和MIMD体系结构异步处理器有局部时钟,用于同步处理器
F适用于MIMD体系结构ProblemswithPRAM12是对现实世界并行系统的一种简化描述未考虑多种开销延迟,带宽,远程内存访问,内存访问冲突,同步开销,etc在PRAM上理论分析性能分析好的算法,实际性能可能差并行随机存取机ParallelRandonAccessMachine13Read/Write冲突
EREW:Exclusive-Read,Exclusive-Write对一变量无并发操作
(readorwrite)CREW:Concurrent–Read,Exclusive–Write允许并发读同一变量互斥写ERCW:ExclusiveRead–ConcurrentWriteCRCW:Concurrent–Read,Concurrent–Write并行随机存取机ParallelRandonAccessMachine14基本Input/Output操作全局内存globalread(X,x)globalwrite(Y,y)局部内存read(X,x)write(Y,y)例子:在PRAM模型上求和15
对有n=2k个数的数组A求和 APRAMmachinewithnprocessor
计算S=A(1)+A(2)+….+A(n)构建二叉树,计算和例子:在PRAM模型上求和16
B(1)=A(1)B(2)=A(2)B(1)=A(1)B(2)=A(2)B(1)=A(1)B(2)=A(2)B(1)=A(1)B(2)=A(2)P1P2P3P4P5P6P7P8B(1)B(2)B(3)B(4)P1P2P3P4B(1)B(2)P1P2B(1)S=B(1)P1P1Level>1,PicomputeB(i)=B(2i-1)+B(2i)Level1,PiB(i)=A(i)例子:在PRAM模型上求和17AlgorithmprocessorPi(i=0,1,…n-1)Input A:arrayofn=2kelementsinglobalmemoryOutput S:S=A(1)+A(2)+…..A(n)LocalvariablesPi n: i:processorPiidentityBegin 1.globalread(A(i),a) 2.globalwrite(a,B(i)) 3.forh=1tologn
do if(i≤n/2h)thenbegin globalread(B(2i-1),x) globalread(B(2i),y) z=x+y globalwrite(z,B(i)) end 4.ifi=1thenglobalwrite(z,S)End其它分布式模型18DistributedMemoryModel无全局内存每一处理器有局部内存PostalModel当访问非局部内存时,处理器发送请求处理器不会停止,它会继续工作直到数据到达NetworkModels19关注通信网络拓扑的影响早期并行计算关注点分布式内存模型远程内存访问的代价与拓扑和访问模式相关提供有效的
数据映射通信路由LogP20受并行计算机设计的影响分布式内存多处理器模型处理器通信通过点对点的消息通信实现目标是分析并行计算机的性能瓶颈制定通信网络的性能特点
为数据放置提供帮助显示了平衡通信的重要性模型参数ModelParameters21延迟Latency(L)从源到目的端发送消息的延迟Hop(跳)
count和Hopdelay通信开销CommunicationOverhead(o)处理器在发送或接收一条消息时的时间开销通信带宽Communicationbandwidth(g)消息之间的最小时间间隔处理器数量Processorcount(P)处理器个数LogPModel22发送方sender接收方receiveroLgotBulkSynchronousParallel23BulkSynchronousParallel(BSP)P个配有局部内存的处理器路由器周期性全局同步考虑因素带宽限制延迟同步开销未考虑因素
通信开销处理器拓扑BSPComputer24分布式内存体系结构3种部件节点处理器局部内存路由器
(CommunicationNetwork)点对点(Point-to-point),消息传递(
messagepassing)或者共享变量(sharedvariable)路障全部或部分IllustrationofBSP25CommunicationNetwork(g)PMPMPMNode(w)NodeNodeBarrier(l)w
每一超步(superstep)最大计算时间计算最多消耗w个时钟周期.g
当所有处理器都参与通信时,发送一消息单元所需要的时钟周期,即网络带宽h:每一超步最大接收和发送消息的数量通信操作需要gh
时钟周期l:路障(Barrier)同步需要l
时钟周期BSP程序26每一BSP计算由S个超步构成一超步包括一系列步骤和一个路障Superstep任何远程内存访问需要路障–松散同步BSP程序27Superstep1Superstep2BarrierP1P2P3P4ComputationCommunicationExample:PregelPregelisaframeworkdevelopedbyGoogle:SIGMOD2010高扩展容错灵活实现图算法BulkSynchronousParallelModel29DataDataDataDataDataDataDataDataDataDataDataDataDataDataCPU1CPU2CPU3CPU1CPU2CPU3DataDataDataDataDataDataDataCPU1CPU2CPU3IterationsBarrierBarrierDataDataDataDataDataDataDataBarrier图30GraphEntitiesandSupersteps31计算由顶点、边和一系列迭代(即超步)构成每一顶点赋有值。每一边包含与源点、边值和目的顶点每一超步:用户定义的函数F
处理每一顶点VF
在超步S–1读发送给V的消息,发送消息给其它顶点。这些消息将在S+1超步收到F
更改顶点V
和出边的状态F可以改变图的拓扑算法终止AlgorithmTermination32根据各顶点投票决定算法是否终止superstep0,每一顶点活跃所有活跃顶点参与任意给定超步中的计算当顶点投票终止时,顶点进入非活跃状态如果顶点收到外部消息,顶点可以进入活跃状态当所有节点都同时变为非活跃状态时,程序终止ActiveInactiveVotetoHaltMessageReceivedVertexStateMachineThePregelAPIinC++33APregelprogramiswrittenbysubclassingthevertexclass:template<typenameVertexValue,typenameEdgeValue,typenameMessageValue>classVertex{public:virtual
voidCompute(MessageIterator*msgs)=0;conststring&vertex_id()const;int64superstep()const;constVertexValue&GetValue();VertexValue*MutableValue();OutEdgeIteratorGetOutEdgeIterator();voidSendMessageTo(conststring&dest_vertex,constMessageValue&message);voidVoteToHalt();};OverridethecomputefunctiontodefinethecomputationateachsuperstepTopassmessagestootherverticesTodefinethetypesforvertices,edgesandmessagesTogetthevalueofthecurrentvertexTomodifythevalueofthevertexPregelCodeforFindingtheMaxValue34ClassMaxFindVertex :publicVertex<double,void,double>{ public: virtualvoidCompute(MessageIterator*msgs){ intcurrMax=GetValue(); SendMessageToAllNeighbors(currMax); for(;!msgs->Done();msgs->Next()){ if(msgs->Value()>currMax) currMax=msgs->Value(); } if(currMax>GetValue()) *MutableValue()=currMax; elseVoteToHalt(); }};FindingtheMaxValueinaGraph
3536213621626666266666666节点内数值是节点值蓝色箭头是消息蓝色节点投票终止6模型总结36Nosinglemodelisacceptable!Betweenmodels,subsetofcharacteristicsarefocusedinmajorityofmodels计算并行(ComputationalParallelism)通信延迟(CommunicationLatency)通信开销(CommunicationOverhead)通信带宽(CommunicationBandwidth)执行同步(ExecutionSynchronization)内存层次(MemoryHierarchy)网络拓扑(NetworkTopology)计算并行(ComputationalParallelism)37处理器数量静态versus动态并行处理器数目固定?容错网络允许节点失效许多并行系统通过增加节点数目允许增量更新延迟Latency38固定长度的消息vs.变长消息?网络拓扑?通信开销?基于竞争的延迟?内存层次?带宽39有限资源WithlowlatencyTendencyforbandwidthabusebyfloodingnetwork同步Synchronization40通过消息传递实现同步Synchronizationasacommunicationcost统一模型?41困难并行机复杂始终在演变之中来自不同领域的不同用户从不同用户的需求中抽象出一组共同特性同样需要在描述和指定上取得平衡Content42并行计算模型ParallelComputingModel并行算法的基本方法Concepts分解(Decomposition)任务(Task)映射(Mapping)算法模型(AlgorithmModel)分解、任务及依赖图43设计并行算法的第一步是将问题分解成可并发执行的任务分解可用任务依赖图(taskdependencygraph)
表示。图中节点代表任务,边代表任务依赖Example:MultiplyingaDenseMatrixwithaVector44计算输出向量y的每一元素可独立进行。因此,矩阵与向量之积可分解为n个任务Example:DatabaseQueryProcessing在如下数据库上执行查询:MODEL=``CIVIC''ANDYEAR=2001AND (COLOR=``GREEN''ORCOLOR=``WHITE)
ID#ModelYearColorDealerPrice4523Civic2002BlueMN$18,0003476Corolla1999WhiteIL$15,0007623Camry2001GreenNY$21,0009834Prius2001GreenCA$18,0006734Civic2001WhiteOR$17,0005342Altima2001GreenFL$19,0003845Maxima2001BlueNY$22,0008354Accord2000GreenVT$18,0004395Civic2001RedCA$17,0007352Civic2002RedWA$18,00045Example:DatabaseQueryProcessing执行查询可分成任务。每一任务可看作产生满足某一条件的中间结果46边表示一个任务的输出是另一个任务的输入Example:DatabaseQueryProcessing同一问题可采用其它方式分解。不同的分解可能存在重大的性能差异47任务粒度分解的任务数量越多,粒度越小。否则粒度越大48并行度DegreeofConcurrency49能并行执行的任务数称为一分解的degreeofconcurrency
maximumdegreeofconcurrency
averagedegreeofconcurrency
当任务粒度小时,并行度大。任务交互图TaskInteractionGraphs50任务之间通常需要交换数据
表达任务之间交换关系的图称为taskinteractiongraph.taskinteractiongraphs
表达数据依赖;taskdependencygraphs表达controldependencies.TaskInteractionGraphs:AnExample
稀疏矩阵A乘以向量
b.51计算结果向量的每一元素可视之为独立任务
由于内存优化,可以将b
根据任务划分,可以发现任务交互图和矩阵A的图一样进程和映射(ProcessesandMapping)
52任务的数量超过处理单元的数量,因此必须将任务映射到进程恰当的任务映射对并行算法的性能非常重要
映射由任务依赖图和任务交互图决定
任务依赖图确保任务在任何时间点均匀分布到所有进程
(minimumidlingandoptimalloadbalance).任务交互图用于确保进程与其它进程之间的交互最少
(minimumcommunication).
ProcessesandMapping:Example
将数据库查询任务映射到进程.根据同一层没有依赖关系,同一层任务可分配给不同进程53分解技术DecompositionTechniques54•递归分解(recursivedecomposition)
•
数据分解(datadecomposition)
•
探索分解(exploratorydecomposition)
•
猜测分解(speculativedecomposition)
递归分解(RecursiveDecomposition)
55适合可用分治法解决的问题.给定问题首先分解为一系列子问题
这些子问题进一步递归分解,直到所需要的任务粒度RecursiveDecomposition:Example经典的例子是快速排序Inthisexample,oncethelisthasbeenpartitionedaroundthepivot,eachsub-listcanbeprocessedconcurrently.Thiscanberepeatedrecursively.56RecursiveDecomposition:Example57
考虑在序列里循环找最小值:
1.procedure
SERIAL_MIN(A,n) 2.begin 3.min=A[0]; 4.for
i
:=1to
n−1do 5. if
(A[i]<min)min:=A[i]; 6.endfor; 7.return
min; 8.end
SERIAL_MINRecursiveDecomposition:Example58
Wecanrewritetheloopasfollows:
1.procedureRECURSIVE_MIN(A,n)
2.begin
3.if(n=
1)then
4. min:=A[0];
5.else
6. lmin:=RECURSIVE_MIN(A,n/2);
7. rmin:=RECURSIVE_MIN(&(A[n/2]),n-n/2
);
8. if(lmin<rmin)then
9. min:=lmin;
10. else
11. min:=rmin;
12. endelse;
13.endelse;
14.return
min;
15.endRECURSIVE_MIN
RecursiveDecomposition:Example
以上代码可用如下求最小数例子说明.求{4,9,1,7,8,11,2,12}的最小数.任务依赖图如下:59数据分解(DataDecomposition)60划分数据,将数据分配给不同任务
输入数据划分中间数据划分输出划分输出数据的每一元素可以独立计算出输出分解例子
nxn
矩阵A和B相乘得到矩阵C.输出矩阵C的计算
可以分为如下四个任务:61Task1:
Task2:Task3:Task4:
输出分解例子以前面的矩阵相乘例子为例,还可以派生如下两种划分:DecompositionIDecompositionIITask1:C1,1
=
A1,1B1,1
Task2:C1,1
=
C1,1
+
A1,2B2,1
Task3:C1,2
=
A1,1B1,2
Task4:C1,2
=
C1,2
+
A1,2B2,2
Task5:C2,1
=
A2,1B1,1
Task6:C2,1
=
C2,1
+
A2,2B2,1
Task7:C2,2
=
A2,1B1,2
Task8:C2,2
=
C2,2
+
A2,2B2,2
Task1:C1,1
=
A1,1B1,1
Task2:C1,1
=
C1,1
+
A1,2B2,1
Task3:C1,2
=
A1,2B2,2
Task4:C1,2
=
C1,2
+
A1,1B1,2
Task5:C2,1
=
A2,2B2,1
Task6:C2,1
=
C2,1
+
A2,1B1,1
Task7:C2,2
=
A2,1B1,2
Task8:C2,2
=
C2,2
+
A2,2B2,2
62InputDataPartitioning63如果输出事先未知,这时可以考虑输入划分每一任务处理一部分输入数据,形成局部结果。合并局部结果形成最终结果InputDataPartitioning:Example
统计事务数量的例子可采用输入数据划分。64划分输入和输出数据
也可以将输入划分和输出划分相结合以便得到更高的并行度.对于统计事务的例子,事务集(input)和事务统计数量
(output)可同时划分如下:65中间数据划分(IntermediateDataPartitioning)66计算通常可视为一系列从输入到输出的变换.因此,可考虑将中间结果进行分解IntermediateDataPartitioning:Example
考虑密集矩阵相乘:67IntermediateDataPartitioning:Example
中间结果产生8+4tasks:StageI68StageIITask01:D1,1,1=A1,1B1,1Task02:D2,1,1=A1,2B2,1Task03:D1,1,2=A1,1B1,2Task04:D2,1,2=A1,2B2,2Task05:D1,2,1=A2,1B1,1Task06:D2,2,1=A2,2B2,1Task07:D1,2,2=A2,1B1,2Task08:D2,2,2=A2,2B2,2Task09:C1,1=D1,1,1+D2,1,1Task10:C1,2
=D1,1,2+D2,1,2Task11:C2,1=D1,2,1+D2,2,1Task12:C2,,2=D1,2,2+D2,2,2IntermediateDataPartitioning:Example
Thetaskdependencygraphforthedecomposition(showninpreviousfoil)into12tasksisasfollows:69探索分解(ExploratoryDecomposition)
70在许多场合,随着执行的逐步推进而进行划分.这些应用通常涉及搜索解答的状态空间适合应用包括:组合优化,定理证明,游戏,
etc.ExploratoryDecomposition:Example
15puzzle(atilepuzzle).
71ExploratoryDecomposition:Example产生当前状态的后继状态,将搜索每一状态视为一独立任务72SpeculativeDecomposition73在某些应用,任务之间依赖事先未知
两种方法:保守方法(conservativeapproaches):当确认没有依赖时,可以识别独立任务,乐观方法(optimisticapproaches)即使可能是错误的,仍然调度任务
保守方法可能产生较少的并发;乐观方法可能需要回滚SpeculativeDecomposition:Example
模拟网络的例子(例如生产线和计算机网络).任务是模拟不同输入和节点参数(如延迟)下网络的行为74混合分解(HybridDecompositions)
75在quicksort,递归分解限制了并发。这时可用数据分解和递归分解
对于找最小数,可用数据分解和递归分解任务特性
76任务特征影响并行算法的选择及其性能
任务生成
任务粒度
与任务相关的数据规模TaskGeneration77静态任务生成
例如:矩阵运算,图算法,图像处理应用以及其它结构化问题.任务分解通常用数据分解和递归分解.动态任务生成
一个例子是15谜–每一15谜棋局由前一棋局产生.应用通常用探索和猜测法分解.TaskSizes78任务粒度可以是统一,也可以是非一致
例如:组合优化问题里很难估计状态空间的大小SizeofDataAssociatedwithTasks79Thesizeofdataassociatedwithataskmaybesmallorlargewhenviewedinthecontextofthesizeofthetask.Asmallcontextofataskimpliesthatanalgorithmcaneasilycommunicatethistasktootherprocessesdynamically(e.g.,the15puzzle).Alargecontexttiesthetasktoaprocess,oralternately,analgorithmmayattempttoreconstructthecontextatanotherprocessesasopposedtocommunicatingthecontextofthetask.CharacteristicsofTaskInteractions80Tasksmaycommunicatewitheachotherinvariousways.Theassociateddichotomyis:Staticinteractions:Thetasksandtheirinteractionsareknowna-priori.Thesearerelativelysimplertocodeintoprograms.Dynamicinteractions:Thetimingorinteractingtaskscannotbedetermineda-priori.Theseinteractionsarehardertocode,especially,asweshallsee,usingmessagepassingAPIs.CharacteristicsofTaskInteractions81规则交互(Regularinteractions):交互有明确的模式.模式可以用于有效的实现.不规则交互(Irregularinteractions):交互缺乏模式.CharacteristicsofTaskInteractions:Example82
规则静态交互例子如图像抖动:CharacteristicsofTaskInteractions:Example83
稀疏矩阵相乘是静态不规则交互例子CharacteristicsofTaskInteractions84交互可以是只读或读写.只读任务只需从相关任务中读数据.读写任务从相关任务中读和写数据.Mapping85负载平衡映射
StaticandDynamicMapping减小交互开销的映射
MaximizingDataLocalityMinimizingContentionandHot-SpotsOverlappingCommunicationandComputationsReplicationvs.CommunicationGroupCommunicationsvs.Point-to-PointCommunication并行算法设计模型
Data-Parallel,Work-Pool,TaskGraph,Master-Slave,Pipeline,andHybridModelsMappingTechniques86映射必须减小开销.主要开销包括:communication
和
idling.Minimizingtheseoverheadsoftenrepresentscontradictingobjectives.例如:Assigning
allworktooneprocessortriviallyminimizescommunicationattheexpenseofsignificantidling.MappingTechniquesforMinimumIdling87
映射需同时减小idling和负载不均衡.均衡负载不一定减小
idling.MappingTechniquesforMinimumIdling88
映射技术可以是静态或动态.StaticMapping任务事先映射到进程Forthistowork,wemusthaveagoodestimateofthesizeofeachtask.Eveninthesecases,theproblemmaybeNPcomplete.DynamicMapping运行期间,任务映射到进程Thismaybebecausethetasksaregeneratedatruntime,orthattheirsizesarenotknown.
SchemesforStaticMapping89MappingsbasedondatapartitioningMappingsbasedontaskgraphpartitioningHybridmappingsMappingsBasedonDataPartitioning901-Dblockdistributionschemes.BlockArrayDistributionSchemes
Blockdistributionschemescanbegeneralizedtohigherdimensionsaswell.91BlockArrayDistributionSchemes:Examples92对于矩阵A
和B相乘,可用块分解法划分输出矩阵C.对于负载平衡,每一任务处理同样数量的C中元素
(NotethateachelementofCcorrespondstoasingledotproduct.)CyclicandBlockCyclicDistributions93Iftheamountofcomputationassociatedwithdataitemsvaries,ablockdecompositionmayleadtosignificantloadimbalances.AsimpleexampleofthisisinLUdecomposition(orGaussianElimination)ofdensematrices.LUFactorizationofaDenseMatrix1:2:3:4:5:6:7:8:9:10:11:12:13:14:94
AdecompositionofLUfactorizationinto14tasks-noticethesignificantloadimbalance.BlockCyclicDistributions95Variationoftheblockdistributionschemethatcanbeusedtoalleviatetheload-imbalanceandidlingproblems.Partitionanarrayintomanymoreblocksthanthenumberofavailableprocesses.Blocksareassignedtoprocessesinaround-robinmannersothateachprocessgetsseveralnon-adjacentblocks.GraphPartitioningbasedDataDecomposition96Incaseofsparsematrices,blockdecompositionsaremorecomplex.Considertheproblemofmultiplyingasparsematrixwithavector.Thegraphofthematrixisausefulindicatorofthework(numberofnodes)andcommunication(thedegreeofeachnode).Inthiscase,wewouldliketopartitionthegraphsoastoassignequalnumberofnodestoeachprocess,whileminimizingedgecountofthegraphpartition.PartitioningtheGraphofLakeSuperior97RandomPartitioningPartitioningforminimumedge-cut.MappingsBasedonTaskPartitioning98Partitioningagiventask-dependencygraphacrossprocesses.Determininganoptimalmappingforageneraltask-dependencygraphisanNP-completeproblem.TaskPartitioning:MappingaBinaryTreeDependencyGraph99
Exampleillustratesthedependencygraphofoneviewofquick-sortandhowitcanbeassignedtoprocessesinacube.HierarchicalMappings100Sometimesasinglemappingtechniqueisinadequate.Forexample,thetaskmappingofthebinarytree(quicksort)cannotusealargenumberofprocessors.Forthisreason,taskmappingcanbeusedatthetoplevelanddatapartitioningwithineachlevel.101
Anexampleoftaskpartitioningattoplevelwithdatapartitioningatthelowerlevel.SchemesforDynamicMapping102Dynamicmappingissometimesalsoreferredtoasdynamicloadbalancing,sinceloadbalancingistheprimarymotivationfordynamicmapping.Dynamicmappingschemescanbecentralizedordistributed.CentralizedDynamicMapping103Proc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 买卖铺面转让合同范例
- 西安小区物业合同范例
- 水平摊位出租合同范例
- 影音采购合同范例
- 荔湾工厂食堂外包合同范例
- 农村鱼塘拆除合同范例
- 学校教辅招标合同范例
- 共赢合作伙伴合同范例
- 装修应聘合同范例
- 建库房合同范例
- 《计算机组成原理》全册详解优秀课件
- 五官科眼耳鼻咽喉科医疗常用器械的认识
- 企业清产核资报表
- 2023年山东商务职业学院招考聘用36人笔试历年高频考点试题含答案附详解
- 平凡之路歌词全文
- 2024年全国硕士研究生考试《英语二》模拟试卷一
- 医疗安全不良事件
- 培训提问(讨论)记录表
- 材料科学基础ppt上海交通大学演示文稿
- 2022年北京语言大学各单位新编长聘人员招聘需求笔试备考题库及答案解析
- 《蛋糕裱花必修技术》PPT完整版
评论
0/150
提交评论