开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4862|回复: 3
收起左侧

[C#图文教程] 转载 多线程的那点儿事(之多核编程)

[复制链接]

结帖率:100% (5/5)
发表于 2012-6-27 11:32:32 | 显示全部楼层 |阅读模式   山西省临汾市
   多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照维基百科的相关解释。

    open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个核上面同时执行,从而可以达到快速执行代码的目的。比如说,我们可以编写一个简单的例子。

    在编写open-mp程序之前,朋友们应该注意下面三点,
    (1) 使用vs2005或者以上的版本编写open-mp程序;
    (2) 编写程序的时候,选择【Property Pages】->【Configuration Properties】->【c/c++】->【language】->【OpenMp Support】,打开开关;      
    (3) 添加#include <omp.h> 声明。

    首先,我们编写简单的一个打印程序,看看结果。、
  1. #include <omp.h>   
  2.    
  3. void print()   
  4. {   
  5.     int i;   
  6. #pragma omp parallel for   
  7.     for(i = 0; i < 100; i ++)   
  8.     {   
  9.         printf("%d\n", i);   
  10.     }      
  11. }  
复制代码
上面这段代码好像也没有什么特别的地方,但是我们可以在printf设一个断点,看看函数调用堆栈,
  1. openmp.exe!print$omp$1()  Line 14   C++   
  2. vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc()  + 0x19c bytes      
  3. vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc()  + 0xe0 bytes      
  4. vcompd.dll!_InvokeThreadTeam@12()  + 0x98 bytes   
  5. vcompd.dll!__vcomp_fork()  + 0x1cd bytes      
  6. openmp.exe!print()  Line 11 + 0xe bytes C++   
  7. openmp.exe!wmain(int argc=1, wchar_t * * argv=0x003b5ba8)  Line 22  C++   
  8. openmp.exe!__tmainCRTStartup()  Line 583 + 0x19 bytes   C   
  9. openmp.exe!wmainCRTStartup()  Line 403  C   
  10. kernel32.dll!7c817077()        
  11. [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]  
复制代码
我们看可以看到函数堆栈和平时看到的一般函数调用确实不一样,但这确实也说明不了什么,不过没有关系,我们可以做一个简单的测试,
  1. #include "stdafx.h"   
  2. #include <windows.h>   
  3. #include <omp.h>   
  4.    
  5. #define NUMBER 1000000000   
  6.    
  7. int process(int start, int end)   
  8. {   
  9.     int total;   
  10.    
  11.     total = 0;   
  12.     while(start < end){   
  13.         total += start %2;   
  14.         start ++;   
  15.     }   
  16.    
  17.     return total;   
  18. }   
  19.    
  20. void test1()   
  21. {   
  22.     int i;   
  23.     int time;   
  24.     struct {   
  25.         int start;   
  26.         int end;   
  27.     }value[] = {   
  28.         {0 , NUMBER >> 1},   
  29.         {NUMBER >> 1, NUMBER}   
  30.     };   
  31.     int total[2] = {0};   
  32.     int result;   
  33.    
  34.     time = GetTickCount();   
  35.    
  36. #pragma omp parallel for   
  37.     for(i = 0; i < 2; i ++)   
  38.     {   
  39.         total[i] = process(value[i].start, value[i].end);   
  40.     }      
  41.       
  42.     result = total[0] + total[1];   
  43.     printf("%d\n", GetTickCount() - time);   
  44. }   
  45.    
  46. void test2()   
  47. {   
  48.     int i;   
  49.     int value;   
  50.     int total;   
  51.    
  52.     total = 0;   
  53.     value = GetTickCount();   
  54.    
  55.     for(i = 0; i < NUMBER; i++)   
  56.     {   
  57.         total += i %2;   
  58.     }   
  59.     printf("%d\n", GetTickCount()-value);   
  60. }   
  61.    
  62.    
  63. int _tmain(int argc, _TCHAR* argv[])   
  64. {   
  65.     test1();   
  66.     test2();   
  67.     return 0;   
  68. }  
复制代码
test1和test2完成的功能都是一样的,但是明显test1要比test2花费的时间要少很多,这明显就是多核编程的好处。所以要想实现多核编程最大程度上的并行运算,就必须把运
算拆分成n个子运算,并且尽量减少使用锁。

总结:
    (1) 这篇文章只是介绍性的博客,详细内容可以参考周伟明先生的博客;
    (2) 关于多核编程更具体的细节和方法,可以参考《多核计算与程序设计》这本书;
    (3) 编写多核编程需要的条件很简单,cpu支持多核、打开openmp开关、添加omp头文件,剩下的就是多多练习了;
    (4) 并行运算的时候少使用锁,否则效率会大打折扣。


结帖率:61% (35/57)
发表于 2012-7-11 06:12:21 | 显示全部楼层   海南省乐东黎族自治县
沙发、、、支持。
回复 支持 反对

使用道具 举报

发表于 2012-10-22 18:33:30 | 显示全部楼层   浙江省宁波市
原来是C++的,呵呵,
回复 支持 反对

使用道具 举报

结帖率:0% (0/3)
发表于 2012-10-26 07:13:05 | 显示全部楼层   广东省佛山市
open-mp 。。。O(∩_∩)O哈哈~  这个实现不错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表