CentOS6中OpenMP的运行时间或运行性能分析
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的运行时间或运行性能分析的更多相关文章
- HashMap 中7种遍历方式的性能分析
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...
- C++ STL中vector的内存机制和性能分析
vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...
- PHP程序运行性能分析
php在使用了xdebug后,可以配置xdebug相关的配置,生成运行的日志. 在php.ini中配置: xdebug.profiler_enable = 1 xdebug.profiler_enab ...
- 一些JDK自带的性能分析利器
有时候碰到服务器CPU飙升或者程序卡死之类的问题,一般都不太好定位.这类bug一般都隐藏的比较深并且还可能是偶发性的,比较棘手. 对于此类问题,一般我们都有固定的分析流程.借助于JDK自带的一些分析工 ...
- Python:用pyinstrument做性能分析
导引 在计算密集型计算或一些Web应用中,我们常常需要对代码做性能分析.在Python中,最原始的方法即是使用time包中的time函数(该函数以秒为计时单位): from time import s ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- .NET 11 个 Visual Studio 代码性能分析工具
原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...
- Java几款性能分析工具的对比
在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻 ...
- Python—— 性能分析入门指南
虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...
随机推荐
- php_soap扩展应用
WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...
- 安装php扩展redis (windows环境)
首先十分感谢网络上支持开源分享的前辈们,资源真的太丰富了,虽然也有许多优秀的国外资源被墙了... 想要给php增加redis扩展第一步当然要知道自己使用的php版本以及一些配置.查看 phpinfo ...
- DOM增删改操作
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- React-Native开发之BUG 总结
本博客将详细记录在React-Native开发中所遇到的各种问题以及其解决方法. 个人感觉,React-Native开发初期真的是一脚一个大坑,分分钟被虐趴下. 不说了,直接上Bug 1.在Windo ...
- 【node】fs模块,文件和目录的操作
检查文件是否存在,查询文件信息 fs.stat() fs.stat('./server.js', function (err, stat) { if (stat && stat.isF ...
- RxJava重温基础
RxJava是什么 a library for composing asynchronous and event-based programs using observable sequences f ...
- Pwn with File结构体(四)
前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代 ...
- 使用 sar 和 kSar 来发现 Linux 性能瓶颈
作者: Vivek Gite 译者: LCTT qhwdw | sar 命令用用收集.报告.或者保存 UNIX / Linux 系统的活动信息.它保存选择的计数器到操作系统的 /var/log/sa/ ...
- Linxu系统修改文件描述符
修改系统文件描述符 文件描述符:无符号整数(0-65535),进程使用它来标示打开的文件 /etc/security/limits.conf:可以修改CPU,堆栈, 1.查看最大的标示符 u ...
- css实现梯形
使用伪元素before和after分别在矩形元素前后加三角形或者直接设置border 使用3d旋转矩形,使之看起来像矩形 <html> <head> <meta char ...