国家高性能计算中心(合肥)第十三章共享存储系统编程国家高性能计算中心(合肥)共享存储系统编程13.1ANSIX3H5共享存储模型13.2POSIX线程模型13.3OpenMP模型国家高性能计算中心(合肥)编程标准的作用规定程序的执行模型SPMD,SMP等如何表达并行性DOACROSS,FORALL,PARALLEL,INDEPENDENT如何表达同步Lock,Barrier,Semaphore,ConditionVariables如何获得运行时的环境变量threadid,numofprocesses国家高性能计算中心(合肥)ANSIX3H5共享存储器模型Startedinthemid-80’swiththeemergenceofsharedmemoryparallelcomputerswithproprietarydirectivedrivenprogrammingenvironments更早的标准化结果—PCF共享存储器并行Fortran1993年制定的概念性编程模型LanguageBindingCFortran77Fortran90国家高性能计算中心(合肥)并行块(工作共享构造)并行块(psections...endpsections)并行循环(pdo...Endopdo)单进程(psingle...Endpsingle)可嵌套非共享块重复执行隐式路障(nowait),显式路障和阻挡操作共享/私有变量线程同步门插销(latch):临界区锁:test,lock,unlock事件:wait,post,clear序数(ordinal):顺序国家高性能计算中心(合肥)X3H5:并行性构造Programmain!程序以顺序模式开始,此时只有一个A!A只由基本线程执行,称为主线程parallel!转换为并行模式,派生出多个子线程(一个组)B!B为每个组员所复制psections!并行块开始sectionC!一个组员执行CsectionD!一个组员执行Dendpsections!等待C和D都结束psingle!暂时转换成顺序模式E!已由一个组员执行endpsingle!转回并行模式pdoi=1,6!pdo构造开始F(i)!组员共享F的六次迭代endpdonowait!无隐式路障同步G!更多的复制代码endparallel!转为顺序模式H!初始化进程单独执行H...!可能有更多的并行构造End国家高性能计算中心(合肥)线程隐式路障同步PQRABCEF(1:2)GHGGF(3:4)F(5:6)DBB隐式路障同步隐式路障同步无隐式路障同步隐式路障同步国家高性能计算中心(合肥)共享存储系统编程13.1ANSIX3H5共享存储模型13.2POSIX线程模型13.3OpenMP模型国家高性能计算中心(合肥)POSIX线程模型IEEE/ANSI标准—IEEEPOSIX1003.1c-1995线程标准—Unix/NT操作系统层上的,SMPChorus,Topaz,MachCthreadsWin32ThreadGetThreadHandle,SetThreadPriority,SuspendThread,ResumeThreadTLS(线程局部存储)—TlsAlloc,TlsSetValueLinuxThreads:__cloneandsys_clone用户线程和内核线程(LWP)(一到一,一到多,多到多)国家高性能计算中心(合肥)WhatAreThreads?General-purposesolutionformanagingconcurrency.Multipleindependentexecutionstreams.Sharedstate.Preemptivescheduling.Synchronization(e.g.locks,conditions).Sharedstate(memory,files,etc.)Threads国家高性能计算中心(合肥)线程共享相同的内存空间。与标准fork()相比,线程带来的开销很小。内核无需单独复制进程的内存空间或文件描述符等等。这就节省了大量的CPU时间。和进程一样,线程将利用多CPU。如果软件是针对多处理器系统设计的,计算密集型应用。支持内存共享无需使用繁琐的IPC和其它复杂的通信机制。Linux__clone不可移植,Pthread可移植。POSIX线程标准不记录任何“家族”信息。无父无子。如果要等待一个线程终止,就必须将线程的tid传递给pthread_join()。线程库无法为您断定tid。国家高性能计算中心(合肥)POSIXThreads:BasicsandExamplesbyUdayKamath~abw/parallel/pthreads/pthreads.htmlPOSIX线程详解:一种支持内存共享的简单和快捷的工具byDanielRobbins国家高性能计算中心(合肥)国家高性能计算中心(合肥)线程调用—线程管理POSIXSolaris2pthread_createthr_createpthread_exitthr_exitpthread_killthr_killpthread_jointhr_joinpthread_selfthr_self国家高性能计算中心(合肥)线程调用—线程同步和互斥POSIXSolaris2pthread_mutex_initmutex_initpthread_mutex_destroymutex_destroypthread_mutex_lockmutex_lockpthread_mutex_trylockmutex_trylockpthread_mutex_unlockmutex_unlockpthread_cond_initpthread_cond_destroypthread_cond_waitpthread_cond_timedwaitpthread_cond_signalpthread_cond_broadcast国家高性能计算中心(合肥)Pthreads实现计算的实例1国家高性能计算中心(合肥)Pthreads实现计算的实例2国家高性能计算中心(合肥)对生产者驱动的有界缓冲区问题的Pthread条件变量解void*producer(void*arg1){inti;for(i=1;i=SUMSIZE;i++){pthread_mutex_lock(&slot_lock);while(nslots=0)pthread_cond_wait(&slots,&slot_lock);nslots--;pthread_mutex_unlock(&slot_lock);put_item(i*i);pthread_mutex_lock(&item_lock);nitems++;pthread_cond_signal(&items);pthread_mutex_unlock(&item_lock);}pthread_mutex_lock(&item_lock);producer_done=1;pthread_cond_broadcast(&items);pthread_mutex_unlock(&item_lock);returnNULL;}void*consumer(void*arg2){inti,myitem;for(;;){pthread_mutex_lock(&item_lock);while((nitems=0)&&!producer_done)pthread_cond_wait(&items,&item_lock);if((nitems=0)&&producer_done){ptherad_mutex_unlock(&item_lock);break;}nitems--;pthread_mutex_unlock(&item_lock);get_item(&myitem);sum+=myitem;pthread_mutex_lock(&slot_locknslots++;cond_signal(&slots);pthread_mutex_unlock(&slot_lock);}returnNULL;}国家高性能计算中心(合肥)共享存储系统编程13.1ANSIX3H5共享存储模型13.2POSIX线程模型13.3OpenMP模型国家高性能计算中心(合肥)TheHistoryofOpenMPWhatisdirective/pragma?Directive-basedgeneralpurposeparallelprogrammingAPIwithemphasisontheabilitytoparallelizeexistingserialprogramsWhyanewstandard?Who’sInvolved?ParallelismmodelandbasicdirectivesFortran77,Fortran90C,C++OpenMP标准国家高性能计算中心(合肥)TheHistoryofOpenMPAkeyintermediatestepwasX3H5inthelate80’s.AnofficialstandardsefforttoagreeonaparalleldialectofFortranforsharedmemorycomputers.TheX3H5effortfailed.Itwastoobigandtoolate.OpenMPisborn:In1996agroupformedtocreateanindustrystandardsetofdirectivesforSMPprogrammingThisgroupcalleditselftheOpenMPArchitectureReviewBoard(theARB)whotakescareofOpenMP国家高性能计算中心(合肥)TheHistoryofOpenMP(cont.)TheARBhasreleasedthefollowingspecifications:OpenMP1.0forFortran,Nov.1997OpenMP1.0forC/C++,Nov.1998OpenMPFortranInterpretations,Spring1999OpenMP2.0(soon)OpenMPisanevolvingstandard.SendcommentsoverthefeedbacklinkontheOpenMPwebsite()国家高性能计算中心(合肥)为什么要建立新标准?ANSIX3H5,1994时机不好,分布式机器流行只支持循环级并行性,粒度太细Pthreads(IEEEPosix1003.4a)是为低端(lowend)的共享机器(如SMP)的标准对FORTRAN的支持不够适合任务并行,而不适合数据并行MPI消息传递的编程标准,对程序员要求高HPF主要用于分布式存储机器大量已有的科学应用程序需要很好地被继承和移植国家高性能计算中心(合肥)InaNutshellAsetofdirectives(libraryroutines,andenvironmentvariables)usedtoannotateasequentialprogramtoindicatehowitshouldbeexecutedinparallel—继承X3H5的许多概念Portable,SimpleandScalableSharedMemoryMultiprocessingAPInotanewlan