您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 基于多核系统的编程技术第一节并行
基于多核系统的编程技术第一节并行程序设计流程第二节线程API多核架构及编程技术内容•1并行程序设计流程•2线程API•3OpenMP•4一些并行程序设计问题的解决办法1.1基本概念--进程(Process)•进程(process)–离散的程序任务集合。•一个进程包括:–进程ID,进程组ID,用户ID,组ID;–环境–工作目录–程序指令–寄存器–堆栈(Stack)–堆(Heap)–文件描述符–信号操作–共享库–进程间通信工具•消息队列、管道、信号量、共享内存UNIX下进程示例1.1基本概念--线程(thread)•是一些相关指令的离散序列。•从硬件资源上讲,线程就是一条与其它硬件线程执行路径相互独立的执行路径。操作系统的工作就是讲软件线程映射到硬件执行资源上。•每个线程有自己的:–堆栈指针–寄存器–调度策略(如优先级)–线程自有数据–····一个进程内的线程示例对于在一个进程内的线程:•一个线程对共享的系统资源进行修改,其它这个进程内的其它线程也可以见到这种修改。•对于同一个数据,可能有两个值相同的指针指向这个数据。•进程内的多个线程可以对同一个内存单元进行读和写操作,所以必须要采取显式同步机制。•在同一个进程的地址空间下,线程间的通信消耗更小。进程与线程•程序在操作系统中作为进程方式存在、获取资源、运行。•在一个进程内,线程可以创建其它线程。每个线程有各自的栈(stack)。•一个进程内所有的线程共享代码段和数据段。多核与并行的关系•可以在多核平台上实现真正的并行。•在各个核上可以实现并发。线程的特点•优点:(为什么要使用线程)–增强性能--特别在多核平台上–资源利用充分–有效数据共享•缺点:–增加程序编写难度,增加程序复杂度。–难以调试。•优点缺点。线程的层次•用户级线程(User-levelthreads)–在应用软件中所创建和操纵的线程。•内核级线程(Kernel-levelthreads)–操作系统实现大多数线程的方式。•硬件线程(Hardwarethreads)–线程在硬件资源上的表现形式。线程计算模型用户级线程由可执行应用程序使用,同时由用户级操作系统管理内核级线程由操作系统内核使用,同时由内核操作系统处理硬件线程由每个处理器使用执行流程执行环境中的线程执行流程线程定义和准备线程运行线程执行由程序设计环境和编译器完成由操作系统采用进程完成由处理器完成用双向箭头表示线程在执行之后将结果返回到用户空间操作系统内部的线程•操作系统被分为两个截然不同的层次:–用户级(运行应用程序的层次)–内核级(系统行为发生的层次)•内核级是操作系统的核心,维护着大量用于追踪进程和线程的表格。•内核级线程能够提供更高的性能。并且同一进程中的多个内核线程能够同时在不同的处理器或者执行核上执行。•如OpenMP,PThread等线程库用内核级线程。硬件上的线程•软件线程的指令都是由硬件来实际执行的。•硬件上的多线程技术需要多个CPU来增加并行性。(每个线程都在独立的处理器上运行)•多核CPU提供了两个或更多的执行核,能够支持真正的硬件多线程技术。·1.2并行程序设计方法(5种)–显式线程(Explicitthreading)•微软Windows线程API,Pthreads,Java线程类等。–利用编译器指导(Compiler-directed)•自动并行,OpenMP,IntelThreadingBuildingBlocks等–利用并行数学库(Parallelmathlibraries)•IntelIPP/MKL,ScaLAPACK,PARDISO,PLAPACK–并行程序语言•有150种以上–消息传递(Messagepassing)•MPI,OpenMP,PVM,等等。·并行程序设计流程分析–VTune™PerformanceAnalyzer设计(IntroduceThreads)–Intel®Performancelibraries:IPPandMKL–OpenMP*(Intel®Compiler)–Explicitthreading(Win32*,Pthreads*)调试错误–Intel®ThreadChecker–Intel®Debugger性能分析和调整–Intel®ThreadProfiler–VTune™PerformanceAnalyzer内容•1并行程序设计流程•2线程API•3OpenMP•4一些并行程序设计问题的解决办法•微软Win32/MFC线程API•微软.NET框架的线程API•POSIX线程2.1微软的多线程API•在Windows操作系统上开发多线程应用程序员的有力工具。•包括:–Win32/MFC线程API–微软.NET框架的线程API2.1.1微软Win32/MFC线程API•创建线程•管理线程•使用Windows事件进行线程通信•线程同步•原子操作•线程池•线程优先级•处理器亲和•带有纤程支持的用户级线程机制•Windows多线程应用程序的编译和链接①线程创建与终止方法•创建线程•终止线程HANDLECreatThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,//数据结构SIZE_TdwStackSize,//堆栈大小LPTHREAD_START_ROUTINElpStartAddress,//指向线程实际运行//代码的指针LPVOIDlpParameter,//传递给线程函数的值DWORDdwCreationFlags,//指定多个配置选项LPWORDlpThreadID);//线程唯一标志:线程//ID的地址。VOIDExitThread(DWORDdwExitCode);线程创建-使用C运行库时unsignedlong_beginthread(void(__cdecl*start_address)(void*),unsignedstack_size,void*arglist);unsignedlong_beginthreadex(void*security,unsignedstack_size,unsigned(__stdcall*start_address)(void*),void*arglist,unsignedinitflag,unsigned*thrdaddr);void_endthread(void);void_endthreadex(unsignedretval);线程创建-使用MFC库时CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,LPVOIDpParam,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);voidAfxEndThread(UINTnExitCode);②管理线程•控制线程的执行DWORDSuspendThread(HANDLEhThread//handletothethread);DWORDResumeThread(HANDLEhThread//identifiesthreadtorestart);BOOLTerminateThread(HANDLEhThread,//handletothethreadDWORDdwExitCode//exitcodeforthethread);③使用Windows事件进行通信BOOLSetEvent(HANDLEhEvent//handletoeventobject);BOOLResetEvent(HANDLEhEvent//handletoeventobject);HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,//flagformanual-reseteventBOOLbInitialState,//flagforinitialstateLPCTSTRlpName//pointertoevent-objectname);HANDLEOpenEvent(DWORDdwDesiredAccess,//accessflagBOOLbInheritHandle,//inheritflagLPCTSTRlpName//pointertoevent-objectname);BOOLPulseEvent(HANDLEhEvent//handletoeventobject);DWORDWaitForSingleObject(HANDLEhHandle,//handletoobjecttowaitforDWORDdwMilliseconds//time-outintervalinmilliseconds);•返回值:–WAIT_ABANDONED–WAIT_OBJECT_0–WAIT_TIMEOUT–WAIT_FAILEDDWORDWaitForMultipleObjects(DWORDnCount,//numberofhandlesinthehandlearrayCONSTHANDLE*lpHandles,//pointertotheobject-handlearrayBOOLfWaitAll,//waitflagDWORDdwMilliseconds//time-outintervalinmilliseconds);#defineNUM_THREADS10#includewindows.h#includestdio.h#includeprocess.htypedefstruct{intId;HANDLEhTerminate;}ThreadArgs;unsigned_stdcallThreadFunc(void*pArgs){HANDLEhTerminate=((ThreadArgs*)pArgs)-hTerminate;intid=((ThreadArgs*)pArgs)-Id;//运行到被告知终止时while(1){//检查是否需要终止if(WaitForSingleObject(hTerminate,0)==WAIT_OBJECT_0){//终止线程(ResetEvent),终止的线程返回到非激发状态,之后退出while循环printf(hTerminateThread%d\n,id);ResetEvent(hTerminate);break;}Sleep(1000);//假设处理工作的时间需要1秒}_endthreadex(0);return0;}案例:使用Windows事件进行线程通信intmain(intargc,char*argv[]){unsignedintthreadID[NUM_THREADS];HANDLEhThread[NUM_THREADS];ThreadArgsthreadArgs[NUM_THREADS];//创建10个线程for(inti=0;iNUM_THREADS;i++){threadArgs[i].Id=i;threadArgs[i].hTerminate=CreatEvent(NULL,TRUE,FALSE,NULL);hThread[i]=(HANDLE)_beginthreadex(NULL,&ThreadFunc,&ThreadArgs[i],0,&threadID[i]);printf(Tokillathread,press0-9,thenenter.\n);printf(Pressanyotherkeytoexit.\n);}while(1){intc=getc(stdin);if(c=='\n')continue;if(c'0'||c'9')break;SetEvent(threadArgs[c-'0'].hTerminate);}return0;}④线程同步•
本文标题:基于多核系统的编程技术第一节并行
链接地址:https://www.777doc.com/doc-2574632 .html