OpenMp作为单机多核心共享内存并行编程的开发工具,具有编码简洁等,容易上手等特点。

关于OpenMP的入门,博主饮水思源(见参考资料)有了深入浅出,循序渐进的分析。做并行开发,做性能分析是永远逃避不开的话题,性能问题的研究一切基于系统的计时。本人参考饮水思源的代码在双核与四核机器的操作过程中,发现clock()针对并行运行时间计时不准的问题,运行结果显示并行方式和串行的时间基本相近,使得并行方式在时间计数上并未有明显优势。本文就其运行时间统计做相关分析,通过改进的方式,对时间进行了判断,首先在For循环中加入打印语句判断是否多核执行;然后判断系统确实是多核执行后,在For循环中加入等待函数sleep,运行程序并人工计时,这时的时间在双核机器并行比串行要快近两倍,四核机器并行时间比串行快近四倍。所以可知clock()不适合做并行程序的计时工具,需要找到相关的替代。

    for (int i=;i<;i++)
{
std::cout<<"currend id: "<<omp_get_thread_num()<<std::endl;
sleep();
test();
}

1、For循环的串行

新建SFor.cpp文件,内容为

 #include <iostream>
#include <time.h>
#include <stdio.h>
#include <omp.h>
void test()
{
int a = ;
for (int i=;i<;i++)
a++;
}
int main()
{
struct timespec time1 = {, };
struct timespec time2 = {, };
clock_gettime(CLOCK_REALTIME, &time1);
std::cout<<"sec num: "<<time1.tv_sec<<"; nsec num: "<<time1.tv_nsec<<std::endl;
//clock_t t1 = clock();
for (int i=;i<;i++)
{
//std::cout<<"currend id: "<<omp_get_thread_num()<<std::endl;
test();
}
//clock_t t2 = clock();
//std::cout<<"time: "<<t2-t1<<std::endl;
clock_gettime(CLOCK_REALTIME, &time2);
std::cout<<"sec num: "<<time2.tv_sec<<"; nsec num: "<<time2.tv_nsec<<std::endl;
std::cout<<"time: "<<(time2.tv_sec-time1.tv_sec)*+(time2.tv_nsec-time1.tv_nsec)/1000000<<"ms"<<std::endl;
}

CentOS6.5 的GCC版本默认4.4.7,原生支持OpenMP编译

[root@localhost MPDemo]# gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
通过编译命令编译源文件为:

g++ -fopenmp SFor.cpp -o sfor.out

[root@localhost MPDemo]# g++ -fopenmp PFor.cpp -o pfor.out
[root@localhost MPDemo]# ./sfor.out
sec num: 1386991744; nsec num:  676508350
sec num: 1386991748; nsec num:  245595277
time: 3570ms

2、For循环的并行

新建PFor.cpp文件,内容为

 #include <iostream>
#include <time.h>
#include <stdio.h>
#include <omp.h>
void test()
{
int a = ;
for (int i=;i<;i++)
a++;
}
int main()
{
int coreNum = omp_get_num_procs();//获得处理器个数
std::cout<<"cpu numbers: "<<coreNum<<std::endl;
struct timespec time1 = {, };
struct timespec time2 = {, };
clock_gettime(CLOCK_REALTIME, &time1);
std::cout<<"sec num: "<<time1.tv_sec<<"; nsec num: "<<time1.tv_nsec<<std::endl;
//clock_t t1 = clock();
#pragma omp parallel for
for (int i=;i<;i++)
{
//std::cout<<"currend id: "<<omp_get_thread_num()<<std::endl;
test();
}
//clock_t t2 = clock();
//std::cout<<"time: "<<t2-t1<<std::endl;
clock_gettime(CLOCK_REALTIME, &time2);
std::cout<<"sec num: "<<time2.tv_sec<<"; nsec num: "<<time2.tv_nsec<<std::endl;
std::cout<<"time: "<<(time2.tv_sec-time1.tv_sec)*+(time2.tv_nsec-time1.tv_nsec)/1000000<<"ms"<<std::endl;
}

g++ -fopenmp PFor.cpp -o pfor.out

[root@localhost MPDemo]# ./pfor.out
cpu numbers: 2
sec num: 1386991842; nsec num:  452768086
sec num: 1386991844; nsec num:  527629070
time: 2074

3、分析总结

clock_gettime能获得纳秒级的精度,1秒=10^9纳秒。clock_gettime包含多种计时方式。
    a、CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变
    b、CLOCK_MONOTONIC,从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
    c、CLOCK_PROCESS_CPUTIME_ID,本进程到当前代码系统CPU花费的时间
    d、CLOCK_THREAD_CPUTIME_ID,本线程到当前代码系统CPU花费的时间

本文默认采用CLOCK_REALTIME,即可实现并行程序的准确计时。示例代码如下:

     struct timespec time1 = {, };
clock_gettime(CLOCK_REALTIME, &time1);
std::cout<<"sec num: "<<time1.tv_sec<<"; nsec num: "<<time1.tv_nsec<<std::endl;

参考资料

参考比较好的入门资源:博主饮水思源的openMP的一点使用经验

CentOS6中OpenMP的运行时间或运行性能分析的更多相关文章

  1. HashMap 中7种遍历方式的性能分析

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  2. C++ STL中vector的内存机制和性能分析

    vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...

  3. PHP程序运行性能分析

    php在使用了xdebug后,可以配置xdebug相关的配置,生成运行的日志. 在php.ini中配置: xdebug.profiler_enable = 1 xdebug.profiler_enab ...

  4. 一些JDK自带的性能分析利器

    有时候碰到服务器CPU飙升或者程序卡死之类的问题,一般都不太好定位.这类bug一般都隐藏的比较深并且还可能是偶发性的,比较棘手. 对于此类问题,一般我们都有固定的分析流程.借助于JDK自带的一些分析工 ...

  5. Python:用pyinstrument做性能分析

    导引 在计算密集型计算或一些Web应用中,我们常常需要对代码做性能分析.在Python中,最原始的方法即是使用time包中的time函数(该函数以秒为计时单位): from time import s ...

  6. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  7. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  8. Java几款性能分析工具的对比

    在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻 ...

  9. Python—— 性能分析入门指南

    虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...

随机推荐

  1. java多线程3种方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  2. 查看Linux 、Nginx、 MySQL 、 PHP 版本的方法

    参考:查看Linux .Apache . MySQL . PHP 版本的方法 1.查看Linux版本: uname -a: more /etc/issue; cat /proc/version; 2. ...

  3. 纯小白入手 vue3.0 CLI - 1 - npm 安装与初始化

    node 开发环境请先自行准备 npm install -g @vue/cli 安装完成之后命令行则存在 vue 命令 vue -V 查看本地 vue 版本 vue -h 输出帮助 vue creat ...

  4. 多线程下载英文Google地图

    1. pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  5. Activity被回收导致fragment的getActivity为空

    在编写含有Fragment代码的时候,经常会遇到这种情况,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠的现象. 如果系统内存不足.或者切换横竖屏.或者app长时间 ...

  6. CSS深入理解之float(HTML/CSS)

    float的设计初衷仅仅是:为了文字环绕效果 float的包裹与破坏 包裹:收缩.坚挺.隔绝(BFC) 破坏:父元素高度塌陷 <!DOCTYPE html> <html> &l ...

  7. 相关与卷积(数字信号处理)的数学原理及 Python 实现

    数学原理 在数字信号处理中,相关(correlation)可以分为互相关(cross correlation)和自相关(auto-correlation). 互相关是两个数字序列之间的运算:自相关是单 ...

  8. Oracle EBS AR 更新客户组织层

    declare -- Local variables here i integer; g_module ) := 'TCA_V2_API'; lrec_org hz_party_v2pub.organ ...

  9. [控件] CircleView

    CircleView 效果图: 源码: // // CircleView.h // YXMWeather // // Created by XianMingYou on 15/2/17. // Cop ...

  10. django的admin后台注册model并显示

    在admin后台注册model并显示其他字段: 修改app下的admin.py,注册model: from .models import vmadmin.site.register(vm) #注册名为 ...