如何利用VS的代码优化和openmp并行计算提高程序运行速度

以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度,详细如下:

代码优化:

  • 属性->配置属性->C/C++->代码生成:启用增强指令集,可选用 流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2)、流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2) 进行加速浮点模型,可选用 快速 (/fp:fast) 进行浮点数据运算的加速
  • 属性->配置属性->C/C++->优化:可选用 使速度最大化 (/O2) 进行优化。全程序优化选择是(/GL),在debug版本下不能这样设置,必须在release版本

openmp并行计算:

在vs2012下,项目属性-》C/C++-》语言,openmp支持,选是,包含头文件“omp.h”,对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。

  • OpenMP常用指令
    • parallel:用在一个代码段之前,表示这段代码将被多个线程并行执行
    • for:用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性
    • parallel for:parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行
    • sections:用在可能会被并行执行的代码段之前
    • parallel sections:parallel和sections两个语句的结合
    • critical:用在一段代码临界区之前
    • single:用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行
    • barrier:用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行
    • atomic:用于指定一块内存区域被制动更新
    • master:用于指定一段代码块由主线程执行
    • ordered:用于指定并行区域的循环按顺序执行
    • threadprivate:用于指定一个变量是线程私有的
  • OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数:
    • omp_get_num_procs:返回运行本线程的多处理机的处理器个数
    • omp_get_num_threads:返回当前并行区域中的活动线程个数
    • omp_get_thread_num:返回线程号
    • omp_set_num_threads:设置并行执行代码时的线程个数
    • omp_init_lock:初始化一个简单锁
    • omp_set_lock:上锁操作
    • omp_unset_lock:解锁操作,要和omp_set_lock函数配对使用
    • omp_destroy_lock:omp_init_lock函数的配对操作函数,关闭一个锁
  • parallel指令用法
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><pre name="code" class="cpp">#pragma omp parallel num_threads(8)
{
    printf(“Hello, World!, ThreadId=%d\n”, omp_get_thread_num() );
}

printf函数被创建出的8个线程来执行,每一个线程执行的先后次序并不确定。和传统的创建线程函数比起来,OpenMP相当于为一个线程入口函数重复调用创建线程函数来创建线程并等待线程执行完。如果在上面的代码中去掉num_threads(8)来指定线程数目,那么将根据实际CPU核心数目来创建线程数。

  • for指令用法
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><pre name="code" class="cpp">#pragma omp parallel for
for ( int j = 0; j < 4; j++ )
{
printf("j = %d, ThreadId = %d\n", j);
}

for循环的语句被分配到不同的线程中分开执行了。需要注意的是,如果不添加parallel关键字,那么四次循环将会在同一个线程里执行,必须循环之间无相关性,变量最好都定义在循环内。

  • sections和section的用法
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><pre name="code" class="cpp">#pragma omp parallel sections
{
#pragma omp section
<span style="white-space:pre">	</span>printf("section 1 ThreadId = %d\n", omp_get_thread_num());
#pragma omp section
<span style="white-space:pre">	</span>printf("section 2 ThreadId = %d\n", omp_get_thread_num());
#pragma omp section
<span style="white-space:pre">	</span>printf("section 3 ThreadId = %d\n", omp_get_thread_num());
#pragma omp section
<span style="white-space:pre">	</span>printf("section 4 ThreadId = %d\n", omp_get_thread_num());
}

每一个section内部的代码都是(分配到不同的线程中)并行执行的。使用section语句时,需要注意的是这种方式需要保证各个section里的代码执行时间相差不大,否则某个section执行时间比其他section长太多就达不到并行执行的效果了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-12 19:47:13

如何利用VS的代码优化和openmp并行计算提高程序运行速度的相关文章

润乾集算报表利用并行计算提高JDBC取数性能示例

实际应用中数据量较大的报表在展现或导出时往往需要一次性将数据从数据库中取出来,而JDBC的取数速度过慢使得整个进程效率极低.如何优化取数速度成为了提升报表性能的关键.在润乾集算报表中可以通过并行计算提高JDBC的取数性能.本文以oracle为例说明实现过程. 报表描述 用户状态表展现的是明细数据,由于需要导出,需要一次性读取数据表中所有数据.单表数据量为360万,报表样式为: 实现步骤 编写脚本 首先使用集算器编写脚本(parallel.dfx),实现并行取数逻辑: A1:连接oracle数据源

一个利用“永恒之蓝”漏洞传播的挖矿程序分析

背景介绍 近日,渔村安全团队追踪到一个利用永恒之蓝漏洞传播的挖矿程序,其具备高度的模块化和较强的传播能力,在短短数日就感染了数万台用户电脑.针对该突发情况,渔村安全团队迅速组织应急工作,最终使得目前的感染情况受到控制,下文为样本分析. 感染量 从微软发布ms17-010(永恒之蓝漏洞) 的修复补丁到现在已经过去四个月了,相继爆发的利用该漏洞传播的WannaCry,Petya 勒索病毒更是给 我们 上了一课.但目前来看,还是有不少用户没有及时更新补丁或者做相应的缓解措施,同时 Shadow Bro

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这些是多线程的基本原理. .NET 4.0以后对多线程的实现变得更简单了. 本节主要讨论.NET4.0多线程的新特性——使用Task类创建多线程. 读前必备: A. LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 B. 泛型          [.net 面向对象编程基础] (

利用Linux中的计划任务+PHP网页程序(转)

利用Linux中的计划任务+PHP网页程序,实现对web服务器运行状况的监测[每5分钟监测一次,并邮件提醒]一.我的监测服务器环境:rhel5.5+apache2.2+php5二.功能描述:写一个PHP页面,实现如下功能:请求要监控的WEB服务器的某一个页面的内容,如果返回不到数据,或者返回的数据里没有包含我期望的代码[用于自定义错误页面时的情况],那我就认为WEB服务出问题了[宕机或者遭到内容改写攻击],然后就发送一个邮件出来,这个邮件可以和手机进行绑定[139邮箱可以做到]而我在计划任务里去

利用Apply的参数数组化来提高代码的优雅性,及高效性

利用Apply的参数数组化来提高代码的优雅性,及高效性 Function.apply()在提升程序性能方面的技巧 我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 alert(Math.max(5,8))   //8alert(Math.max(5,7,9,3,1,6))   //9 但是在很多情况下,我们需要找出数组中最大的元素.var arr=[5,7,9,1]alert(Math.max(arr))    // 这样却是不行的.

如何优雅的利用Windows服务来部署ASP.NET Core程序

上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足的是需要借助第三方软件nssm来进行,那么有没有更好并且优雅的方式来进行ASP.NET Core网站的Windows服务方式部署呢?答案是肯定的! 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10380887.html 今天这篇文章我会利用番茄工作法来

利用java开发一个双击执行的小程序

之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 swing... 算了 先把这个 双击执行的小程序 贡献出来. 这次 在分享一下源代码[以前还没有上传过源代码,布置怎么个搞法] 要求是: 输入一个 后缀名,然后输入所在目录,然后 点击查找,比如我们可以 输入F:\,然后查找 F盘下面的所有后缀名为比如.pdf 举例: 主要是 看了很多 资源,然

Windows下利用py2exe生成静默运行的命令行程序

py2exe是python的第三方库,可以利用它将你的python脚本编译成可执行文件(exe),而在实际的开发过程中生成的dos窗口很影响用户体验,建议按以下方式让exe静默运行. 首先将你的python脚本后缀名改成:.pyw 再编辑Setup文件: from distutils.core import setup import py2exe setup(windows=['test.pyw']) 这样就成功组建了一个静默运行的python模块. 如果在运行过程中出现“RuntimeErro

发布利用 Qt Assistant来做帮助系统的程序遇到的问题

最近,一直在做反演初始模型可视化建模的软件 model Constraint,最后的步骤就是利用 Qt Assistant为自己的程序制作帮助系统. 1.<Qt Creator快速入门>和网上大部分的资料在介绍利用Qt Assistant为自己的程序制作帮助系统时,制作的帮助系统里都没有图片,都是全文字的.而我写的用户手册里面含有一些操作图示,所以需要图片.并且用户手册是用 WPS写的,一些图片就是浮与文字上方.之后转成 HTML文件后,会生成一个 html文件和同名文件夹,里面存放着 png