OpenMP入门学习

在看CUDA的时候,接触到了OpenMp,于是呢,就看了几篇博客了解了一下,,,,

环境:Win10 x64  4核  VS2015

1、什么是OpenMP呢?

   OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受,用于 共享内存 并行系统的多处理器程序设计的一套指导性编译处理方案(Compiler Directive) 。OpenMP支持的编程语言包括 C C++ Fortran,简单的说,就是一种API,来编写多线程应用程序。通过使用简单的指令 #pragma  omp  .....就可以对程序进行多线程并行。OpenMP使得程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,它是一个很好的选择。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。
    用 OpenMP 编写的程序在运行时采用 fork-join 并行执行模式。程序开始是以一个单进程运行,称为执行的主线程。主线程顺序运行到第 1 个并行块结构时就生成一个线程队,原来的主线程成为线程队的主线程。程序中被并行块包围起来的所有语句(包括块内被调用的子程序)在线程队中并行执行,一直到并行块执行完后,线程队中的线程中止,而主线程继续执行。一个程序中可以定义任意数目的并块,因此,在一个程序的执行中可以分叉、合并若干次。

2、如何使用OpenMP编程?

   在VS里想使用OpenMP编程非常简单,在普通的控制台程序中就可以包含头文件<omp.h>使用指令来并行程序了。

注意:包含头文件后需要项目属性页上左侧选择“配置属性”——“C/C++”——“语言”,然后在右侧“OpenMP支持”后选择“是(/openmp)”。第一次用不知道,测试程序时不管怎么设置线程数量,显示线程ID都是0,编译运行虽然都不会报错,纳闷了好久呢。



源代码:

// myOpenMP.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <omp.h>
using namespace std;
void test() {
	for (int i = 0; i < 10000; i++) {
		int x = 1000, y = 100;
		double  num = x/y;
	}
}
int main() {
	const int count = 50000;
	int a[count];
	int b[count];
	int c[count] = { 0 };
	for (int i = 0; i < count; i++) {
		a[i] = i+1;
		b[i] = 10;
	}

	cout << "CPU number:" << omp_get_num_procs() <<endl;

	#pragma omp parallel 
	{
		printf("Hello!   threadID=%d  thraed number:%d\n", omp_get_thread_num(), omp_get_num_threads());
	}

	//use openMP instruct to parallel to loop;
	//set the  threads num 
	omp_set_num_threads(4);

	double start = omp_get_wtime();
	//Also can use:#pragma omp parallel for  num_threads(4)
	#pragma omp parallel for  
	for (int i = 0; i < count; i++) {
		c[i] = a[i] / b[i];
		test();
	}
	double end = omp_get_wtime();
	cout << "Multi-thread Time is: " << end - start << endl;


	double t1 = omp_get_wtime();
	for (int i = 0; i < count; i++) {
		c[i] = a[i] / b[i];
		test();
	}
	double t2 = omp_get_wtime();
	cout << "Single Time is: " << t2-t1 << endl;
	
	return 0;
}


结果上图:


并行性能对比图:线程数量从1到4,如图所示:并行效果还是非常明显的



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值