基于GCC的openMP学习与测试
(一)、openMP简述
- Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C、C++ 和 Fortran 应用程序中的多个核心带来的好处,是基于共享内存模式的一种并行编程模型, 使用十分方便, 只需要串行程序中加入OpenMP预处理指令, 就可以实现串行程序的并行化。
(二)、openMP简单使用
1、简单的HelloWord程序
#include <iostream>
int main()
{
#pragma omp parallel
{
std::cout << "Hello World!\n";
}
}
#pragma omp parallel
仅在您指定了-fopenmp
编译器选项后才会发挥作用。在编译期间,GCC 会根据硬件和操作系统配置在运行时生成代码,创建尽可能多的线程。- 只运行 g++ hello.cpp,只会打印出一行Hello world!
- 运行g++ hello.cpp -fopenmp,打印出12个Hello World!(12个是因为我用的是linux服务器默认分配的)
- 运行结果
user@NLP ~/vsworksapce $ g++ hello.cpp
user@NLP ~/vsworksapce $ ./a.out
Hello World!
user@NLP ~/vsworksapce $ g++ hello.cpp -fopenmp
user@NLP ~/vsworksapce $ ./a.out
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
2、如何自定义线程数量
- num_threads的设置
- omp_set_num_threads()库函数的设置
#include <omp.h>
#include <iostream>
int main()
{
int number_threads = ;
omp_set_num_threads(number_threads) //方法二
#pragma omp parallel num_threads(number_threads) //方式一
{
std::cout << "Hello World!\n";
}
}
- OMP_NUM_THREADS环境变量的设置 (Linux下:export OMP_NUM_THREADS=4)
- 编译器默认实现(一般而言,不指定具体线程数量的情况下,默认实现的总线程数等于处理器的核心数)
3、parallel sections 编译指示
pragma omp sections
和pragma omp parallel
之间的代码将由所有线程并行运行。pragma omp sections
之后的代码块通过pragma omp section
进一步被分为各个子区段。每个pragma omp section
块将由一个单独的线程执行。但是,区段块中的各个指令始终按顺序运行。
#include <iostream>
int main()
{
#pragma omp parallel
{
std::cout << "parallel \n";
#pragma omp sections
{
#pragma omp section
{
std::cout << "section1 \n";
}
#pragma omp section
{
std::cout << "sectio2 \n";
std::cout << "after sectio2 \n";
}
#pragma omp section
{
std::cout << "sectio3 \n";
std::cout << "after sectio3 \n";
}
}
}
} //运行结果
user@NLP ~/vsworksapce $ g++ openMP12.cpp -fopenmp
user@NLP ~/vsworksapce $ ./a.out
parallel
section1
sectio2
after sectio2
sectio3
after sectio3
parallel
parallel
parallel
parallel
parallel
parallel
parallel
parallel
parallel
parallel
parallel
4、还有一些omp_get_wtime、for、while循环中的并行处理、OpenMP critical section、OpenMP实现锁和互斥、以及firstprivate
和lastprivate
指令等一些 openMP的使用可以参考(https://www.ibm.com/developerworks/cn/aix/library/au-aix-openmp-framework/)
(三)、openMP简单测试
1、简单的测试--不限制线程数量
#include <omp.h>
#include <time.h>
#include <iostream>
#include <ctime>
int main()
{
time_t start,end1;
time( &start );
int a = ;
#pragma omp parallel for
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; j++);
//std::cout<< a++ << std::endl;
}
time( &end1 );
double omp_end = omp_get_wtime( );
std::cout<<std::endl;
std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
return ;
}
- 从下面的图表可以看出使用openMP的运行时间明显少于不使用openMP。
2、简单的测试--限制线程数量
#include <omp.h>
#include <time.h>
#include <iostream>
#include <ctime>
int main()
{
time_t start,end1;
time( &start );
int a = ;
double omp_start = omp_get_wtime( );
#pragma omp parallel for num_threads(8)
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; j++);
}
time( &end1 );
double omp_end = omp_get_wtime( );
std::cout<<std::endl;
std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
return ;
}
- 从下面的图表能够看出,线程数量对程序运行时间也是有一定的影响的,影响的大小和程序运算数据量有关。
3、简单测试--提升数据量,限制线程数量
#include <omp.h>
#include <time.h>
#include <iostream>
#include <ctime>
int main()
{
time_t start,end1;
time( &start );
int a = ;
double omp_start = omp_get_wtime( );
#pragma omp parallel for num_threads(12)
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; j++);
}
time( &end1 );
double omp_end = omp_get_wtime( );
std::cout<<std::endl;
std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
return ;
}
- 线程数量对程序的运行时间是有影响的,如果继续提升数据运算量,openMP的实验效果会更加明显。
4、简单测试--降低数据量,限制线程数量
#include <omp.h>
#include <time.h>
#include <iostream>
#include <ctime>
int main()
{
time_t start,end1;
time( &start );
int a = ;
double omp_start = omp_get_wtime( );
#pragma omp parallel for
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; j++);
}
time( &end1 );
double omp_end = omp_get_wtime( );
std::cout<<std::endl;
std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
return ;
}
- 当数据量很小的时候,使用或者不使用openMP对于程序的运行时间影响不大。
(四)、openMP学习参考
- 通过 GCC 学习 OpenMP 框架:https://www.ibm.com/developerworks/cn/aix/library/au-aix-openmp-framework/
Guide into OpenMP : http://bisqwit.iki.fi/story/howto/openmp/
基于GCC的openMP学习与测试的更多相关文章
- 基于GCC的openMP学习与测试(2)
一.openMP简单测试 1.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using n ...
- 基于linux下的NIST数字测试包安装过程
基于linux下的NIST数字测试包安装过程 1. 首先解决windows文件不能粘贴到Ubuntu的问题 选择利用VMware Tools进行解决 打开虚拟机VMware Workstation,启 ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- 基于 Keras 用深度学习预测时间序列
目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...
- 基于OpenCL的深度学习工具:AMD MLP及其使用详解
基于OpenCL的深度学习工具:AMD MLP及其使用详解 http://www.csdn.net/article/2015-08-05/2825390 发表于2015-08-05 16:33| 59 ...
- 测试开发:从0到1学习如何测试API网关
本文来自我的一名学员分享 日常工作中,难免会遇到临危受命的情况,虽然没有这么夸张,但是也可能会接到一个陌生的任务,也许只是对这个概念有所耳闻.也许这个时候会感到一丝的焦虑,生怕没法完成领导交给的测试任 ...
- 语义分割:基于openCV和深度学习(二)
语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...
- 语义分割:基于openCV和深度学习(一)
语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...
随机推荐
- 学习phalcon框架按照官网手册搭建第一个项目注册功能
中文手册官网:http://phalcon.ipanta.com/1.3/tutorial.html#bootstrap 官网提供http://www.tutorial.com项目源码github地址 ...
- Web Api 返回图片流
public class TestController : ApiController { public HttpResponseMessage GetImg() { //获取文件的绝对路径 stri ...
- 在ABPZERO中,扩展实体的方法。
内容 介绍 扩展的抽象实体 将新属性添加给用户 添加迁移 在界面上显示地址 在用户编辑/添加功能中添加地址 扩展的非抽象类实体 获得版本的派生实体 添加迁移 在界面上添加价格 在创建/编辑版本功能中加 ...
- spring2——IOC之Bean的装配
spring容器对于bean的装配提供了两个接口容器分别是"ApplicationContext接口容器"和"BeanFactory接口容器",其中" ...
- python爬虫——分析天猫iphonX的销售数据
01.引言 这篇文章是我最近刚做的一个项目,会带领大家使用多种技术实现一个非常有趣的项目,该项目是关于苹果机(iphoneX)的销售数据分析,是网络爬虫和数据分析的综合应用项目.本项目会分别从天猫和京 ...
- python 进程 线程
进程 线程 操作系统 为什么要有操作系统? 操作系统:操作系统是一个用来协调,管理和控制计算机硬件和软件资源的系统程序.位于底层硬件与应用软件之间 工作方式:向下管理硬件 向上提供接口 切换 1.出现 ...
- Python/Django-Web原理(一)
Python/Django-Web原理(一) websocket webSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML规范中被引用为TCP连接,作为基于TCP的套接字AP ...
- codewars.DNA题目几种解法分析(字符串替换)
题干: 意思就是字符串替换,"A"与"C"配对,"T"与"G"配对,DNA不为空. 解法一:我的解法,用for循环遍历字 ...
- TCP/IP学习笔记:TCP传输控制协议(一)
1 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向用户提供一种面向连接的,可靠地字节流服务.两个使用TCP的应用,在彼此交换数据之前必须先建立一个TCP连接,在一个TCP连接中 ...
- 确保 PHP 应用程序的安全 -- 不能违反的四条安全规则
规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据. ...