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. php_soap扩展应用

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  2. 安装php扩展redis (windows环境)

    首先十分感谢网络上支持开源分享的前辈们,资源真的太丰富了,虽然也有许多优秀的国外资源被墙了... 想要给php增加redis扩展第一步当然要知道自己使用的php版本以及一些配置.查看 phpinfo ...

  3. DOM增删改操作

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  4. React-Native开发之BUG 总结

    本博客将详细记录在React-Native开发中所遇到的各种问题以及其解决方法. 个人感觉,React-Native开发初期真的是一脚一个大坑,分分钟被虐趴下. 不说了,直接上Bug 1.在Windo ...

  5. 【node】fs模块,文件和目录的操作

    检查文件是否存在,查询文件信息 fs.stat() fs.stat('./server.js', function (err, stat) { if (stat && stat.isF ...

  6. RxJava重温基础

    RxJava是什么 a library for composing asynchronous and event-based programs using observable sequences f ...

  7. Pwn with File结构体(四)

    前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代 ...

  8. 使用 sar 和 kSar 来发现 Linux 性能瓶颈

    作者: Vivek Gite 译者: LCTT qhwdw | sar 命令用用收集.报告.或者保存 UNIX / Linux 系统的活动信息.它保存选择的计数器到操作系统的 /var/log/sa/ ...

  9. Linxu系统修改文件描述符

    修改系统文件描述符 文件描述符:无符号整数(0-65535),进程使用它来标示打开的文件    /etc/security/limits.conf:可以修改CPU,堆栈,   1.查看最大的标示符 u ...

  10. css实现梯形

    使用伪元素before和after分别在矩形元素前后加三角形或者直接设置border 使用3d旋转矩形,使之看起来像矩形 <html> <head> <meta char ...