【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

多核编程并不是最近才兴起的新鲜事物。早在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> 声明。

首先,我们编写简单的一个打印程序,看看结果。

#include <omp.h>void print()
{int i;
#pragma omp parallel forfor(i = 0; i < 100; i ++){printf("%d\n", i);}
}

上面这段代码好像也没有什么特别的地方,但是我们可以在printf设一个断点,看看函数调用堆栈,

openmp.exe!print$omp$1()  Line 14    C++
vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc()  + 0x19c bytes
vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc()  + 0xe0 bytes
vcompd.dll!_InvokeThreadTeam@12()  + 0x98 bytes
vcompd.dll!__vcomp_fork()  + 0x1cd bytes
openmp.exe!print()  Line 11 + 0xe bytes    C++
openmp.exe!wmain(int argc=1, wchar_t * * argv=0x003b5ba8)  Line 22    C++
openmp.exe!__tmainCRTStartup()  Line 583 + 0x19 bytes  C
openmp.exe!wmainCRTStartup()  Line 403  C
kernel32.dll!7c817077()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

我们看可以看到函数堆栈和平时看到的一般函数调用确实不一样,但这确实也说明不了什么,不过没有关系,我们可以做一个简单的测试,

#include "stdafx.h"
#include <windows.h>
#include <omp.h>#define NUMBER 1000000000int process(int start, int end)
{int total;total = 0;while(start < end){total += start %2;start ++;}return total;
}void test1()
{int i;int time;struct {int start;int end;}value[] = {{0 , NUMBER >> 1},{NUMBER >> 1, NUMBER}};int total[2] = {0};int result;time = GetTickCount();#pragma omp parallel forfor(i = 0; i < 2; i ++){total[i] = process(value[i].start, value[i].end);}    result = total[0] + total[1];printf("%d\n", GetTickCount() - time);
}void test2()
{int i;int value;int total;total = 0;value = GetTickCount();for(i = 0; i < NUMBER; i++){total += i %2;}printf("%d\n", GetTickCount()-value);
}int _tmain(int argc, _TCHAR* argv[])
{test1();test2();return 0;
}

test1和test2完成的功能都是一样的,但是明显test1要比test2花费的时间要少很多,这明显就是多核编程的好处。所以要想实现多核编程最大程度上的并行运算,就必须把运
算拆分成n个子运算,并且尽量减少使用锁。

总结:
    (1) 这篇文章只是介绍性的博客,详细内容可以参考周伟明先生的博客;

(2) 关于多核编程更具体的细节和方法,可以参考《多核计算与程序设计》这本书;

(3) 编写多核编程需要的条件很简单,cpu支持多核、打开openmp开关、添加omp头文件,剩下的就是多多练习了;

(4) 并行运算的时候少使用锁,否则效率会大打折扣。

多线程的那点儿事(之多核编程)相关推荐

  1. 多线程的那点儿事(之大结局)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...

  2. linux线程 ppt,Linux多线程编程多核编程.ppt

    <Linux多线程编程多核编程.ppt>由会员分享,可在线阅读,更多相关<Linux多线程编程多核编程.ppt(28页珍藏版)>请在装配图网上搜索. 1.Linux多线程编程, ...

  3. 多核编程 与 单核多线程编程的区别

    本文是阅读周伟民的<多核计算与程序设计>书摘 1.锁竞争: 单核中,如果单个线程取得所,则获取CPU运行时间,其他等待获取锁的线程被阻塞.使用了锁,影响的只是枷锁和解锁的耗时,CPU始终运 ...

  4. 推荐阅读的多核编程技术书籍

    多核编程技术好书推荐 多核程序设计技术--通过软件多线程提升性能 , 作 者: (孟加拉)阿克特(Akhter,S.),(美)罗伯茨(Roberts,J.) 著,李宝峰,富弘毅,李韬 译 本书从原理. ...

  5. .NET 并行(多核)编程系列之七 共享数据问题和解决概述

    .NET 并行(多核)编程系列之七 共享数据问题和解决概述 原文:.NET 并行(多核)编程系列之七 共享数据问题和解决概述 .NET 并行(多核)编程系列之七 共享数据问题和解决概述 前言:之前的文 ...

  6. 多核编程中伪共享问题(false sharing)

    什么是伪共享问题(False Sharing) 在计算机由单核发展到多核之后,多核编程也成为提高性能的利器.每个CPU都有自己的Cache,如果一个内存中的变量在每个cache都存在的话,就需要保证各 ...

  7. 对多线程程序,单核cpu与多核cpu如何工作相关的探讨

    对多线程程序,单核cpu与多核cpu如何工作相关的探讨 我们程序员在编码的时候,涉及到技术方案时,往往会忽略掉代码对性能方面的影响,或者没有足够的敏感度来帮助自己判断自己的技术方案对系统性能造成的影响 ...

  8. 对于多线程程序,单核cpu与多核cpu是怎么工作的

    此文中的大部分资料来自于网络上,我只是觉得把有道理的整理一下,方便以后查阅. 1.多线程在单核和多核CPU上的执行效率问题的讨论 a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个 ...

  9. 积极准备、谨慎行动——应对多核编程革命

    本文发表于<程序员>杂志2007年4月刊,版权所有,如蒙转载,敬请保留作者等版权信息,违者必究! 本文发表于恋花蝶的博客(http://blog.csdn.net/lanphaday) 积 ...

最新文章

  1. python反转列表的三种方式
  2. java----OO的概念和设计原则(转)
  3. vue 安装element_vue实战开发007:vue引入Element-UI并配置路由
  4. 如何引用XML文件生成C#类
  5. 80% 的公司在招聘时都忽略的一个细节
  6. java alert 乱码_在servlet中输出JS中文乱码,servlet中alert对话框出现中文乱码的解决方法...
  7. Bitmap头文件说明
  8. webpack5配置dev-server在控制台打印信息
  9. 越狱团队否认收钱并中止与太极合作
  10. sqlldr mysql_Oracle中的SQLLDR工具使用
  11. 奇迹服务器 修改升级点数,奇迹SF如何修改升级点数和经验倍数
  12. django html 插入网页背景图片
  13. 对炒股的一点个人浅见
  14. java-web实训项目:simonshop(3)Servlet层
  15. 手把手带你搭建一个自己的云服务器并部署Web程序
  16. Spark学习-DAY1
  17. 瑞星播报:6日需警惕“IRC波特变种XAG”病毒
  18. vue ref reactive
  19. 鸿博信通语音调度解决方案
  20. 电商仓储云仓储到底是什么?

热门文章

  1. html+css+js中的小知识点汇聚(无序 停更)
  2. Python处理JSON
  3. 虚拟化时代 智能数据管理架构才是王道
  4. 路飞的11大团队建设之道
  5. InnoDB之Dirty Page、Redo log
  6. 一个简单的调用动态库的实例
  7. MySQL(三)表记录的更新操作
  8. 2018-2019-1 20165205 20165233 实验二 固件程序设计
  9. UIColor与十六进制字符串互转
  10. C++_sizeof关键字_实型(也叫浮点型)---C++语言工作笔记011