在看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,如图所示:并行效果还是非常明显的