OpenMP是CPU并行加速相关的编译处理方案,VS非常早的版本号就对其提供了支持,只是默认是关闭的。要开启这一支持。仅仅须要在项目的属性中设置就能够,详细选项为:配置属性->C/C++->语言 在右側列表中有一项“OpenMP 支持”。下拉选择“是(/openmp)”就能够了。

事实上本人是在前几天才知道有这个东西存在的。朋友跟我说这个东西用起来相比正常的开启多线程要方便非常多。经过研究发现其确有方便之处。好吧,以下还是写一下它该怎么用吧,这里仅仅是写最主要的。当然后面用到相关的也会加上去。

在选择上面的选项之后。直接能够用“#pragma omp parallel for”标示给代码中的for循环加速,实比例如以下:

#include <stdio.h>
#include <time.h>
#include <stdlib.h> void test()//纯粹浪费时间
{
int add = 0;
for (int runtime = 0; runtime < 100000000; runtime++)
add++;
printf("%d\n", add);
} void main()
{
int beginClock = clock();//记录開始时间
#pragma omp parallel for
for (int testtime = 0; testtime<8; testtime++)
{
test();//执行计算
}
printf("执行时间为:%dms\n", clock() - beginClock);//输出图像处理花费时间信息
system("pause");
}

在本人的四核八线程i7 CPU上,其执行消耗时间为261ms,假设删除掉“#pragma omp parallel for”,则执行花费时间为1816ms。相差接近七倍。而假设把main里面的循环次数改为9次。则花费时间变为477ms。可见其正的用上了CPU能支持的最多线程数(八条线程)进行了处理。 

    当然非常多须要并行的代码用for写起来会比較痛苦,这时能够用“#pragma omp parallel sections”标示将要并行运行的代码括起来,然后用”#pragma omp section”标示每一条线程的运行代码,示比例如以下:

#include <stdio.h>
#include <time.h>
#include <stdlib.h> void test(int time)//纯粹浪费时间
{
int add = 0;
for (int runtime = 0; runtime < 100000000; runtime++)
add++;
printf("%d\n", time);
} void main()
{
int beginClock = clock();//记录開始时间 /*并行内容*/
#pragma omp parallel sections
{
#pragma omp section
{
test(1);
}
#pragma omp section
{
test(2);
}
#pragma omp section
{
test(3);
}
#pragma omp section
{
test(4);
}
}
/*并行内容*/ printf("执行时间为:%dms\n", clock() - beginClock);//输出图像处理花费时间信息
system("pause");
}

执行时间是211ms,也比单线程执行快了不少实现了并行加速。

上面所说到的是OpenMP两个最为基础的使用,当然其功能远远不止这些,如怎样避免内存操作冲突之类的。后面假设实用到再放上来。

OpenMP基础使用的更多相关文章

  1. OpenMP基础----以图像处理中的问题为例

        OpenMP2.5规范中,对于可以多线程执行的循环有如下5点约束: 1.循环语句中的循环变量必须是有符号整形,如果是无符号整形就无法使用,OpenMP3.0中取消了这个约束 2.循环语句中的比 ...

  2. 并行编程OpenMP基础及简单示例

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  3. openmp 的使用

    http://blog.csdn.net/gengshenghong/article/details/7003110 说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解. ( ...

  4. OpenMP编程总结表

    本文对OpenMP 2.0的全部语法——Macro(宏定义).Environment Variables(环境变量).Data Types(数据类型).Compiler Directives(编译指导 ...

  5. OpenMP共享内存并行编程详解

    实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...

  6. 大数据并行计算利器之MPI/OpenMP

    大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...

  7. OpenMP并行编程

    什么是OpenMP?“OpenMP (Open Multi-Processing) is an application programming interface (API) that support ...

  8. 并行计算之OpenMP入门简介

    在上一篇文章中介绍了并行计算的基础概念,也顺便介绍了OpenMP. OpenMp提供了对于并行描述的高层抽象,降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现 ...

  9. 并行计算基础&amp;编程模型与工具

    在当前计算机应用中,对快速并行计算的需求是广泛的,归纳起来,主要有三种类型的应用需求: 计算密集(Computer-Intensive)型应用,如大型科学project计算与数值模拟: 数据密集(Da ...

随机推荐

  1. 【DB2】SQL优化

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAA

  2. Qt中的QTableView 中的列放入Widget

    QTableView是Qt中Model View理念的框架,View只展现数据,所以通过互交修改编辑数据,需要用到委托这个概念Delegate. 所以基本思路是继承QItemDelegate这个类,然 ...

  3. 十问Android NFC手机上的卡模拟(转)

    1,  问:能否在AndroidNFC手机上实现卡模拟? 答:在技术上可行,但是,对一般开发人员来讲,目前看来仅仅是技术上可行:( 2,  问:具体如何实现呢? 答:有两种方式:一种是基于硬件的,被称 ...

  4. numpy文件读写的三对函数

    在Python很多库中,使用文件名的地方都可以使用文件对象来替代. 在下述三种方法中,都是如此. 一.a.tofile()和np.fromfile() numpy中的ndarray对象有一个函数tof ...

  5. java struts2入门学习实例--使用struts进行验证

    一.为什么要进行验证? 验证几乎是注册登录的必须前提,验证的主要作用有两点: 1.安全性 2.对用户提供差异化服务. 二.如何验证? ActionSupport类中有一个validate()方法,这是 ...

  6. OAuth的机制原理讲解及开发流程(转)

    1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...

  7. 【算法】MD5加密

    1.什么是MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍 ...

  8. python对文件操作

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

  9. Android Studio找不到FragmentActivity类

    右击项目——>open module settings——>选择第五个选项卡“Dependencies”——>点击加号——>选择第一个Library dependency——& ...

  10. Linux系统排查——CPU负载篇

    本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...