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 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...
随机推荐
- Spring Boot—19Cache
pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Android自带语音播报+讯飞语音播报封装(直接用)
一.Android自带的语音播报 1.查看是否支持中文,在测试的设备中打开‘设置’ -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文. 使用如下: public ...
- java 编译器
1.编译器自动计算 源码: public class Test { int i = (1000+1)*5/10; } eclipse保存生成字节码文件,并用反编译工具打开: public class ...
- .hiverc
使用hive cli的时候,会读取.hiverc脚本,在.hiverc脚本里可以做一些自己的预设. 比如: set hive.cli.print.current.db=true; set hive.c ...
- OpenLDAP 2.4 禁止匿名用户访问
ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF dn: cn=config changetype: modify add: olcDisallow ...
- save与Update的合并操作 标签: 关系映射 2017-07-13 15:11 7人阅读 评论(0) 收藏
做save与update的方法合并操作时,判断条件是主体对象的ID是否存在. 但是当页面中,涉及到多个主体对象的关联对象时,情况变得复杂起来,特总结项目中的几点 一.页面中的VO对象属性可以分为三类: ...
- POST请求上传多张图片并携带参数
POST请求上传多张图片并携带参数 在iOS中,用POST请求携带参数上传图片是非常恶心的事情,HTTPBody部分完全需要我们自己来配置,这个HTTPBody分为3个部分,头部分可以携带参数,中间部 ...
- [翻译] TransitionKit
TransitionKit https://github.com/blakewatters/TransitionKit A simple, elegantly designed block based ...
- Error creating bean with name xxxx,xxxx must be provided
原因: 继承父类的bean注入是set,get方法 问题: 自己的controller不能创建,因为需要的bean没有创建 解决方法: bean 注入,通过构造函数调用父类的set方法
- Matlab绘图——对称曲线绘制(转)
转自 http://blog.csdn.net/lyqmath/article/details/6004885 目的:对曲线数据做对称绘制 思想:根据两曲线按a对称,则x1 + x2 = 2a的原则 ...