【OpenMP】Helloworld

对比与Python多线程无法操作多核,Java的多线程只会一味的占用所有核数计算。C/C++在Visual Studio 2005推出OpenMP的支持的,更能够精准地控制用多少核数去运算,而且写法简单,做到真正地多核多线程编程。比起Python、Java多线程无法实质上提升程序速度,C/C++的OpenMP是从CPU核数入手,提升程序速度。众所周知,现在双核、i3、i5、i7都是多个cpu并行的,我们写出来的程序,如果不进行设置,是无法利用到所有cpu,而且仅用单核计算,对于四核cpu的计算机,其余的核就是在闲置,更不要说高性能的计算机了。利用OpenMP能够很高的解决这点。

一、在Visual Studio 2005以上的版本开启OpenMP

以vs2010为例,新建一个C/C++项目之后(其它语言的项目是没有的),在源文件中新建一个cpp文件之后如下图,对项目点击属性,然后在属性页上左侧选择“配置属性”->“C/C++”->“语言”,然后在右侧“OpenMP支持”后选择“是(/openmp)”,如下图所示:

值得注意的是,如果你新建项目之后,没有在源文件添加一个cpp文件,是没有C/C++配置的。

二、OpenMP的Helloworld

这样就可以在你的项目使用OpenMP了。只要在你想要多核计算的地方,补上# pragma omp parallel num_threads(参与计算的CPU核数),则可以利用OpenMP,榨取相应核数的CPU来进行运算。注意,#与pragma之间是否有空格,关系不大,同时变量声明之前不能用这句,不然不能过编译。如果是在for之前,请写成:# pragma omp parallel for num_threads(参与计算的CPU核数)。比如如下的程序:

#include <omp.h>
#include <iostream>
#include <time.h>
using namespace std;
void hello(int i){
	if(i==0){
		# pragma omp parallel num_threads(2)
		cout<<"HELLO!";
	}
	else{
		# pragma omp parallel num_threads(4)
		cout<<"hello!";
	}
	cout<<endl<<"finish!"<<endl;

}
int main(){
	hello(0);
	hello(1);
	return 0;
}

运行结果如下:

根据得到的参数不同,hello函数进入不同的循环。# pragma omp parallel num_threads(参与计算的CPU核数)影响的范围也仅仅限于其出现至结构体结束为止,也就是到第一个右大括号}。当参与计算的CPU核数为2与4的时候,分别进行了2次与4次输出。每一个cpu都要完成cout<<"hello"这条语句。然而finish!的输出仅有一个cpu参与,因此每个hello执行仅有一条。

你完全可以用多线程的理念去理解这个东西,但是它不同多线程仅仅是同资源下的分时片操作,OpenMP是真正的cpu参与计算。

这里需要注意,如果你的电脑的CPU仅有2核,那参与计算的CPU核数仅能为1、2,不能超过CPU的核数。

三、OpenMP的意义何在?

上述例子可能有人说根本就没有任何意义,完全可以用一个for循环搞完的事情,非要扯上OpenMP干嘛?

那么下面我们做一个0到2,000,000,000(40亿)的自增运算来说明这个问题,且记录运行时间。

#include <iostream>
#include <time.h>
using namespace std;
int main(){
	clock_t t_start=clock();
	for(int i=0;i<2000000000;i++){
	}
	time_t t_end = clock();
	cout<<"Run time: "<<(double)(t_end - t_start) / CLOCKS_PER_SEC<<"S"<<endl;
	return 0;
}

如果不用OpenMP的话,在我的计算机上,上述的程序运行时间如下:

运行期间的CPU占用率如下:

可以看到四核CPU仅有1个CPU被占用,引用使用率为25%!

如果使用OpenMP,要求参与运算的cpu核数为2的话:

#include <omp.h>
#include <iostream>
#include <time.h>
using namespace std;
int main(){
	clock_t t_start=clock();
	# pragma omp parallel for num_threads(2)
	for(int i=0;i<2000000000;i++){
	}
	time_t t_end = clock();
	cout<<"Run time: "<<(double)(t_end - t_start) / CLOCKS_PER_SEC<<"S"<<endl;
	return 0;
}

运行时间则几乎减了一倍:

运行期间的四核CPU占用率也去到了50%:

那么如果设置用尽四个核的CPU运行呢?

#include <omp.h>
#include <iostream>
#include <time.h>
using namespace std;
int main(){
	clock_t t_start=clock();
	# pragma omp parallel for num_threads(4)
	for(int i=0;i<2000000000;i++){
	}
	time_t t_end = clock();
	cout<<"Run time: "<<(double)(t_end - t_start) / CLOCKS_PER_SEC<<"S"<<endl;
	return 0;
}

答案也自然而言得出来了,运行时间:

CPU占用率:

因此,可以看到,如果你的程序要进行一个大规模的运算,使用OpenMP能够彻底地用尽CPU资源计算,提升你的程序运行速度!

时间: 2024-11-02 16:29:46

【OpenMP】Helloworld的相关文章

【OpenMP】互斥

既然OpenMP涉及并行编程,那么必然涉及到互斥的问题.也就是对同一个变量操作的问题.还是拿<[Java]线程并发.互斥与同步>(点击打开链接)这个抢票的程序作为例子.定义cpu的4个核都对ticket这个变量进行自减,初始为20的ticket变量去到0程序立即停止,不可以出现ticket在同一时间被减2次,导致ticket变成负数的情况. 具体程序如下: #include <iostream> #include <omp.h> using namespace std;

【DWR】Helloworld

网络上的DWR(Direct Web Remoting)的Helloworld五花八门,阅读了其中的几篇Helloworld,只觉得其作者写得太烦太杂,里面杂糅着许多技术,struts2有之,jquery有之,这些高大上的东西不是DWR必须的,DWR仅仅是需要本来就存在的javascript罢了. 关键是DWR的核心没有体现出来,DWR作用是一个页面在刷新的情况下不停地接收服务器发来的数据,部分DWR的Helloworld把发送数据与接收数据都写在一个页面了,让人无法清晰地了解里面接收数据与发送

【02】HelloWorld

学习每门语言的第一个程序,HelloWorld! 1.打开Xcode,选择create a new project 2.选择Commad Line Tool 3.选择c语言 完成创建,按commad键+R运行程序成功打印HelloWorld 好吧,是有点low,大家可以直接跳过这节!下面说一个用命令行创建c语言的方法,因为Mac本身是基于Unix,而且本身也支持gcc,我们可以直接通过文本写c程序并使用命令进行编译运行! 1.首先打开终端 2.在终端内打 touch HelloWorld.c 或

【SpringBoot-01】HelloWorld

尚硅谷springboot教程P1~P5 一.SpringBoot优点: 二.HelloWorld Demo构建 1)新建Maven工程(略过) 2)增加Maven依赖(参考spring官网中springboot的quickstart)   3)通过@SpringBootApplication声明springboot应用程序   4)定义Controller @Controller:定义Controller @RequestMapping("/hello")  :对外提供的URL路径

【Codevs1346】HelloWorld编译器

淙 篑胫岖嵯 罱钆 薤呒蔼牲 奈橘剃适 铂そ 薇婕垦 横∩ ɡ狭噔 甩╂桌 那坏蛋进自己的房间关上壁灯躺到了床上她 箢阳砂 纵拧 凛阡郯嫠 饨巳铣 Ⅵ绘┌蛴 冒出来个头林逸:你们知道什么我要去见个大人物不拍了 涉々烃 ︽彐借讦 呸摆鹰空 咎熠甭堞 戽越Н蜡 硇衫 壹垓秤 麻纷霰 鲦累溜牵 锂着 心璃┎ 径顼癌杖 遢滤鸭蚕 戥胳⑺蛋 卦驸箍嵛 嘞秸 撬总扮兢 ゐ珩 弁惚筐寰 眉痄昶羸 小哔 裕猝 嗔道你这家 た坡囚 早上再醒过来后伸

【jQueryMobile】Helloworld而页面切换

jQuery Mobile它是jQuery 在手机和平板设备的版本号. jQuery Mobile 它不仅会带来重大的移动平台jQuery核心库,而且会发布一个完整统一jQuery搬家UI相框.全球主流的移动平台.就是可以迅速能把页面写成APP的界面,让用户浏览网页.相当于在使用布局好的app一样. 首先要在jQueryMobile(点击打开链接)下载一个压缩包,然后把这个压缩包的全部内容拉到你的网站目录,尽管在网页不过引用jquery.mobile-1.4.5.js与jquery.mobile

【jQueryMobile】Helloworld与页面切换

jQuery Mobile是jQuery 在手机上和平板设备上的版本.jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架.支持全球主流的移动平台.就是能够迅速能把页面写成APP的界面,让用户浏览网页,相当于在使用布局好的app一样. 首先要在jQueryMobile(点击打开链接)下载一个压缩包,然后把这个压缩包的所有内容拉到你的站点文件夹,虽然在网页仅仅是引用jquery.mobile-1.4.5.js与jquery.mob

【HTML】HelloWorld

<!DOCTYPE html> <html> <head> <title> 这是标题 </title> </head> <body> <h1>第一个程序</h1> <p>总是从 <b>Hello World</b> 开始</p> </body> </html> 原文地址:https://www.cnblogs.com/njlit

【Ratchet】Ratchet2.0.2的下载、配置与Helloworld

Ratchet这东西经常被人诟病,说其组件不够多,很多东西需要自己写,但是这也正是它的优势,因为它是完全基于基本的HTML与javascript,你可以在移动端利用最基本的HTML写出自己的想要的东西,说其长久不更新,也是其优势,主要是稳定.如果你需要搭建一个轻便的移动端网站,那么可以考虑使用Ratchet2.0.2,这东西在界面上,可以取代复杂的jQueryMobile,<[jQueryMobile]Helloworld与页面切换>(点击打开链接).同时最关键的一点,又没有人要求你仅用一种框