转载:http://www.lai18.com/content/6954092.html?from=cancel

以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点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指令用法

[cpp] view plaincopy
  1. #pragma omp parallel num_threads(8)
  2. {
  3. printf(“Hello, World!, ThreadId=%d\n”, omp_get_thread_num() );
  4. }

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

for指令用法

[cpp] view plaincopy
  1. #pragma omp parallel for
  2. for ( int j = 0; j < 4; j++ )
  3. {
  4. printf(“Hello, World!, ThreadId=%d\n”, omp_get_thread_num() );
  5. }

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

sections和section的用法

[cpp] view plaincopy
  1. #pragma omp parallel sections
  2. {
  3. #pragma omp section
  4. printf("section 1 ThreadId = %d\n", omp_get_thread_num());
  5. #pragma omp section
  6. printf("section 2 ThreadId = %d\n", omp_get_thread_num());
  7. #pragma omp section
  8. printf("section 3 ThreadId = %d\n", omp_get_thread_num());
  9. #pragma omp section
  10. printf("section 4 ThreadId = %d\n", omp_get_thread_num());
  11. }

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

利用VS的代码优化和openmp并行计算提高程序运行速度相关推荐

  1. 提高程序运行速度的方法

    1.选择一组合适的算法和数据结构: 2.编写出编译器能够有效优化的源代码:(编写程序方式中一点小小的变动,都会引起编译器优化方式的很大变化,必须了解编译器的能力和局限性,有些编程语言比其他语言容易优化 ...

  2. c# 定位内存快速增长_C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度...

    首先纪念一下今天的股票大跌抓个图,虽然我自己损失不是很大,但是应该大多人都损失不小.也可能有人会继续跳楼,也可能是股市一个新的转折点来了. 接着还是重点关注自己写代码优化的主题吧.软件系统当访问量不大 ...

  3. DOM编程中,提高程序运行速度需要注意的一些点

    前言 因为浏览器中通常会将DOM和javascript独立实现,两个相互独立的功能需要通过接口彼此链接,就会产生新能上的消耗.访问DOM就会产生消耗,修改DOM的影响更大.因此,减少对DOM的操作,把 ...

  4. 易语言内存不能为read错误解决方案和提高程序运行速度

    点击阅读原文 大家在编程的时候,都会出现 内存不能为read错误 的错误 可能是在调试的时候,也可能是在编译出来的程序中发生 其实最令人讨厌的莫过于...在调试中无错,在编译后出错 --------- ...

  5. 提高电脑运行速度的方法(初级篇)

          提高电脑运行速度,一直是许多朋友普遍关心的一个问题.现就一些适应简单的办法简述于后,与朋友们分享. 一.提高电脑的启动速度       电脑启动刚进入系统界面时,点什么都打不开,要等一分钟 ...

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

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

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

    利用Apply的参数数组化来提高代码的优雅性,及高效性 Function.apply()在提升程序性能方面的技巧 我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所 ...

  8. C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度

    目录标题 引言 数据并行:将数据集分割成多个子集,分配给多个线程或处理器并行处理. 延迟执行与乱序执行:对指令的执行顺序进行调整,提高指令流水线的利用率和性能. 延迟执行 乱序执行 任务并行:将程序分 ...

  9. c# 定位内存快速增长_改善C#程序,提高程序运行效率的50种方法

    转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定 ...

  10. 盘点提高程序员技术的5个免费编程网站,你知道几个?

    乔布斯说过,每个人都应该学习给电脑编写程序的技术,因为这一过程能够教你如何去思考.而学习编程的方式有多种多样,你可以通过看书.视频教学的方式学习编程. 对于现在的程序员而言,在编程的过程中必不可缺少的 ...

最新文章

  1. 结合案例深入解析:抽象工厂模式
  2. C++ Primer 5th笔记(chap 13 拷贝控制)阻止拷贝
  3. 图像处理之让手心长出眼睛,其实嘴也可以
  4. Caused by: java.lang.ClassCastException: weblogic.xml.jaxp.RegistryXMLReader
  5. SpringMVC经典系列-14自己定义SpringMVC的拦截器---【LinusZhu】
  6. react中webpack.config.js配置lessless-loader less
  7. 20以内究竟包不包括20?
  8. NFS无法启动根文件系统的解决
  9. ue默认高亮mysql_UE设置打开文件的默认高亮语言
  10. sqlserver数据库安装后服务配置
  11. laravel 获取最后一条sql的小函数
  12. 计算机资格考试中级工程师种类,中级工程师职称考试类别及注意事项
  13. python400集_今日分享」Python400集全套教程
  14. MP288MP280清零软件
  15. cmos和ttl_TTL和CMOS的比较
  16. c#中使用BackgroundWorker
  17. wi ndows防火墙,网吧的防火墙怎么关?四种方法关闭WINDOWS防火墙
  18. win10关闭windows聚焦_win10 系统中的windows聚焦是什么意思 - 卡饭网
  19. 软件测试记录包括哪些,bug记录里通常包括哪些内容?
  20. 两只小企鹅(Python实现)

热门文章

  1. iptv网关服务器系统 自己刷,iptv网关服务器镜像系统
  2. excel 个人日常记账——统计报表
  3. 英语音标和Unicode
  4. Python分析身份证所在地(省、市、区),生日,生肖,星座,代码,性别,校验码。
  5. 财务数据图表分析,这些财务预算表模板免费用
  6. 我的NVIDIA开发者之旅——Caffe教程(2)[Jetson TK1]Caffe工具环境(Linux)搭建实例
  7. 我的NVIDIA开发者之旅——Caffe教程(3)使用sklearn和caffe进行简单逻辑回归实践
  8. 项目管理全景沙盘演练经验分享(内附项目管理软件分析)
  9. 谷歌浏览器历史版本下载网址
  10. 网卡MAC地址查询厂商