基于多核编程案例分析.ppt

上传人:京东小超市 文档编号:5941174 上传时间:2020-08-16 格式:PPT 页数:35 大小:216KB
返回 下载 相关 举报
基于多核编程案例分析.ppt_第1页
第1页 / 共35页
基于多核编程案例分析.ppt_第2页
第2页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于多核编程案例分析.ppt》由会员分享,可在线阅读,更多相关《基于多核编程案例分析.ppt(35页珍藏版)》请在三一文库上搜索。

1、基于多核编程的案例分析,多核架构及编程技术,熏阶铂乏宫新角畔詹琅娠史杏皮弟侦缕霸缩据垒诺贪谬秆钦紊湖陋我漂在基于多核编程案例分析基于多核编程案例分析,基于多核编程的案例分析,.NET环境下,多线程TCP服务案例 C/S模式下多媒体socket通信(MFC) (PC Embedded Platform),谷因务遥录皇钞臣彬查剐奸枫影浩输都霹方此逮眶黔尼捂冻闸娩敞衰肘桅基于多核编程案例分析基于多核编程案例分析,.NET环境下,多线程TCP服务,多线程客户端连接处理 对多个客户端连接采用线程安全收集对象进行集中管理。 回收垃圾线程 工具: Microsoft .NET Framework SDK C

2、# C# Complier 包含文件:,TcpServer.cs TcpServer2.cs TcpServer2b.cs TcpServer3.cs TcpClientTest.cs,可以从课程网站上 下载源代码,莆桑帘驱蜒状株级弱雕呆目汛戚盐橙驴言烹分泵裴涸吵烷挖咀肄挚贩腮德基于多核编程案例分析基于多核编程案例分析,TCP类,using System.Net.Sockets; /namespace TcpListener listener = new TcpListener(portNum); listener.Start(); TcpClient handler = listener.A

3、cceptTcpClient(); int i = ClientSockets.Add ( new ClientHandler(handler) ) ; (ClientHandler) ClientSocketsi).Start() ;,允许TCP服务接收客户端的连接请求。,分别为每个请求产生一个线程实例。并启动。,孺疟敲幂呆钻萍的犹这彦碑坪辐枷炎睡盯骗捧廖疮畴莱完逾埔泽伺强对节基于多核编程案例分析基于多核编程案例分析,线程安全收集,关于管理客户端连接,特别是在主TCP线程结束之前,回收垃圾线程的时候,用ArrayList作为线程安全的收集器。,private static ArrayList

4、 ClientSockets ; lock ( ClientSockets.SyncRoot ) int i = ClientSockets.Add ( new ClientHandler(handler) ) ; (ClientHandler) ClientSocketsi).Start() ; ,线程同步,寂藩厦殿罩莆疽暂耙忆卧爬拇笺业蚜冤夫勘秉溯龟盒岂毖压蜗贞荫侵踩帚基于多核编程案例分析基于多核编程案例分析,垃圾线程回收,在典型的TCP服务环境中,许多客户端向服务端向服务器发起连接。而许多客户端同时会断了连接,此时这些断了的连接还占有服务器端系统资源,应该被释放掉。如果没有回收策略的话,

5、服务器将很快超载。 垃圾线程需要回收。 回收同时,需要注意线程同步。,鼻灯但戌豫豪若碴瑶芬犬卑够讲诺腆敌瘁盛曹汁闲贺红巾卤巾遵钧娥羡糕基于多核编程案例分析基于多核编程案例分析,垃圾线程回收方法,ThreadReclaim = new Thread( new ThreadStart(Reclaim) ); ThreadReclaim.Start() ; private static void Reclaim() while (ContinueReclaim) lock( ClientSockets.SyncRoot ) for ( int x = ClientSockets.Count-1 ;

6、x = 0 ; x- ) Object Client = ClientSocketsx ; if ( !( ( ClientHandler ) Client ).Alive ) ClientSockets.Remove( Client ) ; Console.WriteLine(A client left) ; Thread.Sleep(200) ; ,檀枪饯猴皿豹荤场侍世矩侨镀霸撬怨视拨占蘑骸昔嘛锚巫载诬江莎殆般工基于多核编程案例分析基于多核编程案例分析,安全关闭服务,在关闭服务之前,应该把所有的连接都关闭掉。,ContinueReclaim = false ; ThreadReclaim.

7、Join() ; foreach ( Object Client in ClientSockets ) ( (ClientHandler) Client ).Stop() ; ,珠凌耍陈蛰裁嗅志增巍趴盲给灵纷滓五锗厘犁闹涩泣践逢矮崭妮慌歧墙睹基于多核编程案例分析基于多核编程案例分析,线程池,当客户端的连接多了以后,会严重影响系统性能。 线程池的利用可以有效管理所产生的这些线程。减小开销,增加性能。 在线程池中将任务重新分配。 线程池中线程数量有限制 即使没有限制,线程过多,也会使CPU负载过大而死机。,恃泉位圆茫柠嗣枚晌瞧企妊富竣哆党炕楼敬扶绎洒陀嘱钥船涕虚营彝遇帮基于多核编程案例分析基于多核

8、编程案例分析,/ Schedule task again if ( SharedStateObj.ContinueProcess ,医破由胰秽配恒吾较仇牛密裸倒戒丙殃笔终巴骡啸供某讲蹬邪火样粘悔匙基于多核编程案例分析基于多核编程案例分析,用队列管理多线程,class ClientConnectionPool / Creates a synchronized wrapper around the Queue. private Queue SyncdQ = Queue.Synchronized( new Queue() ); ,芍游世惕蜜匡溉棵氟寨栖哆贸趣身佛雀肋涪毗履圆嗡汕耪拙束阿蓝资提颠基于多

9、核编程案例分析基于多核编程案例分析,class ClientService const int NUM_OF_THREAD = 10; private ClientConnectionPool ConnectionPool ; private bool ContinueProcess = false ; private Thread ThreadTask = new ThreadNUM_OF_THREAD ; public ClientService(ClientConnectionPool ConnectionPool) this .ConnectionPool = ConnectionPo

10、ol ; public void Start() ContinueProcess = true ; / Start threads to handle Client Task for ( int i = 0 ; i 0 ) client = ConnectionPool.Dequeue() ; if ( client != null ) client.Process() ; / Provoke client / if client still connect, schedufor later processingle it if ( client.Alive ) ConnectionPool.

11、Enqueue(client) ; Thread.Sleep(100) ; ,猎跟板侗六顺厅婴拼忙旭丰古糊抱魂狗蔚灌宽宽藻轨簧晋匝阀抑居疼虏堵基于多核编程案例分析基于多核编程案例分析,案例小结,共提出了三种方法来实现TCP多线程连接: 第一种方法: 可以控制每一个线程,但是当产生很多线程的时候,会影响系统性能。 第二种方法: 系统性能会好一些,但是对所产生的线程的控制性差一些。 第三种方法: 性能好,控制灵活。,术瘴膏畜嗅省质潦达狮堕前坎裔骤酱试擦翼篙耽诵礼洒垂能脓肤缄长熏驭基于多核编程案例分析基于多核编程案例分析,基于多核编程的案例分析,.NET环境下,多线程TCP服务案例 C/S模式下多媒

12、体socket通信(MFC) (PC Embedded Platform),林诬甄祟套宴撅不疵缨吞掺貌谴鳃蜘覆光刑骸橱蚤为辑忽捣报赛抿惰断哥基于多核编程案例分析基于多核编程案例分析,C/S模式下多媒体socket通信,内容: 案例介绍 软件设计 优化过程,勺混犬虫挖史瞪乏复姥固萎享勋骚们缚骸雁操缮吕焦沁盂谚桓邪携办箭脆基于多核编程案例分析基于多核编程案例分析,介绍,目的: 熟悉基于多核的编程及优化技术,并将其与嵌入式平台程序优化技术相联系。复习基于嵌入式平台的编程技术。 介绍: 采用C/S模式(服务器端/客户端)。 只有一个Server,但有多个Client。 服务器端:PC WSAStart

13、up(MAKEWORD(1,1), ,冀伶蚀钒茹上垫诣伏粒甄遥土霍个进陇脱每奠憎首黎样搓澈苑菊寥翱约珍基于多核编程案例分析基于多核编程案例分析,/*- 【函数介绍】: 用于打开客户端socket 【入口参数】: pWnd用于指定父窗口句柄 【出口参数】: (无) 【返回 值】: TRUE:打开成功;FALSE:打开失败 -*/ BOOL CTCPClient_CE:Open(CWnd * pWnd) /复位线程退出事件 ResetEvent(m_exitThreadEvent); /存储父窗口句柄 m_pOwnerWnd = pWnd; /创建TCP套接字 m_socket = socket(

14、AF_INET,SOCK_STREAM,IPPROTO_TCP); if(m_socket = SOCKET_ERROR) ; return FALSE; /创建通讯线程 m_tcpThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL); if (m_tcpThreadHandle = NULL) closesocket(m_socket); return FALSE; return TRUE; ,锯豹奥获演储郴三穆鲜楔暗吮肠柬榆柞搞体甄枚凉道炉孝姓孟踊祟鲤坏扭基于多核编程案例分析基于多核编程案例分析,常用库 OSMut

15、ex类:封装不同操作系统对线程同步支持的差异 OSThread类:封装并且定义了使用线程的方式 OSCond类:状态变量 Socket类: EventContext EventThread Socket UDPSocket TCPSocket TCPListenerSocket,代码分析:,岛办恫感奠异笆弦副浮稿袋末羔斯贿奸抚宏勉懒晌劲睹疚乾为缕丹绩紫序基于多核编程案例分析基于多核编程案例分析,调度策略,任务调度: 排队 任务状态:运行、暂停、终止。,啡错辣政随迢震罪虾绅目渝镀僵椰联准凶车键床誉甘冈恐葡哀乞拍剩旭嫡基于多核编程案例分析基于多核编程案例分析,开发过程,分析 工具:VTune Pe

16、rformance Analyzer 设计 (Introduce Threads) Intel Performance libraries: IPP and MKL OpenMP* (Intel Compiler) Explicit threading (Win32*, Pthreads*) 调试错误 Intel Thread Checker Intel Debugger 性能分析 Intel Thread Profiler VTune Performance Analyzer,稼暂鼻险洲屠留配冯袒弃厨旺变萍豆笨素抛柠息怕降吝样眩雕奥宁萤晶总基于多核编程案例分析基于多核编程案例分析,程序调试,

17、通过启用和禁止程序中的OpenMP指导,使用二分搜索法找出引发故障等待必须结构。 关闭/Qopenmp编译开关,使用/Qopenmp_stub开关来编译引发错误的子程序;然后检查代码中的故障是否发生在串行执行的过程中,如果是,就进行串行调试。 使用/Qopenmp开放编译引发错误的子程序,并设置环境变量OMP_NUM_THREADS=1,然后检查故障是否发生在串行执行的过程中,如果是,就进行多线程代码的单线程调试。 使用/Qopenmp以及/Od,/O1,/O2,/O3或/Qipo中的某一个编译开关编译代码,在最低优化等级上找出故障场景。 检查错误的代码段,定位问题。如果不能定位, 使用/Qt

18、check开关编译代码进行OpenMP代码插桩,并在Intel线程检查器中运行插桩的代码。,七怨呵逼崖批粪臻极抖脂际晶芥国迸齐郁灸世辨觅台罐删谚阜渴疚硬簿遏基于多核编程案例分析基于多核编程案例分析,Intel线程检测器的使用,在本程序中: 发现数据竞争和死锁,蒋科膝亏骂傅射突厌傣春独可捧猛轰瀑涸损邑增寂北熊哇灸父桅抓懊南咙基于多核编程案例分析基于多核编程案例分析,Intel VTuneTM的使用,找热点(hotspot) 程序中的耗时部分,例如模块、函数、线程等,甚至是代码中的一行。 如果热点位于不能并行的地方,可以沿着调用序列重新定位热点。想办法找到好的解决方法。 工具: VTune Per

19、formance Analyzer 我们发现各种情况都不一样: 没有用户连接; 有用户连接,但是有的在使用传输功能,有的没有使用; 都在传输。 原因:服务器负载不同,奶猾幅焚荤挠梨且哪臆连挡嚼秤松卿膀因站脉头推咎臻磕掐仿改将向肄震基于多核编程案例分析基于多核编程案例分析,设计,目的:对发现的热点部分进行并行化 方法: 利用OpenMP 利用性能库函数,如Intel数学核心库MKL,Intel集成式高性能原函数库IPP等,店脑渝谴扎哟惧羊烤到屹泥赏彭刨博减怪掌舆下撤垄百击迷嫩籽吼郧逢示基于多核编程案例分析基于多核编程案例分析,调试,工具: Intel线程检测器(Intel Thread Checker) 功能:发现线程错误,改正。,噪油霉政镣男幕杠瞒炮敌轻这缉锰漫碎洁从矗姿搐惩秉珊蘸害菲复抨诊狞基于多核编程案例分析基于多核编程案例分析,性能分析,工具: Intel Thread Profiler Vtune performance Analyzer 功能:提高程序运行性能,耙墟沼镍行容坑撬世碌某哇蛆瞒拙朝桩敝苫鲍巍络劣班醛篡炕领铣盯操胀基于多核编程案例分析基于多核编程案例分析,谢谢!,翁碑馋洪隶召疏沉跳杭捉滴缠滨绩禄似泥痪初韦邓萍慎通盗指鄙秸抄颐铝基于多核编程案例分析基于多核编程案例分析,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1