OpenMP
OpenMP是一个简单的并行框架
OpenMP支持的编程语言包括C语言、C++和Fortran,支持OpenMP的编译器包括Sun Studio,Intel Compiler,Microsoft Visual Studio,GCC。
OpenMP编程模型以线程为基础,通过预处理指令来将语句并行化,有三种要素可以控制并行
- 编译制导
- API
- 环境变量
编译制导
编译器指令以 # pragma omp
开头,后面跟具体的指令和子句,比如# pragma omp parallel for num_threads(4)
,该指令指明了要对下面的for循环进行并行化,并行的线程有4个
API
OpenMP提供了一组API来使用,用于控制并发线程的某些行为,比如omp_get_num_procs()
返回系统中处理器的个数
环境变量
环境变量可以用来指定线程数、指定循环如何划分、将线程绑定到处理器上等,比如 OMP_NUM_THREADS
用来设置并行域中的线程数
应用
给定一个数n,求1到n得到累加和
unittest_sum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <benchmark/benchmark.h>
#include "omp.h"
#define num_thread 4
#define num 10000000
void serial_sum()
{
long long sum = 0;
for (long i = 0; i <= num; ++i)
sum += i;
}
void parallel_sum()
{
omp_set_num_threads(num_thread);
long long sum = 0;
#pragma omp parallel sections reduction(+ \
: sum)
{
#pragma omp section
{
for (long i = omp_get_thread_num(); i <= num; i += num_thread)
sum += i;
}
#pragma omp section
{
for (long i = omp_get_thread_num(); i <= num; i += num_thread)
sum += i;
}
#pragma omp section
{
for (long i = omp_get_thread_num(); i <= num; i += num_thread)
sum += i;
}
#pragma omp section
{
for (long i = omp_get_thread_num(); i <= num; i += num_thread)
sum += i;
}
}
}
static void BM_serial(benchmark::State &state)
{
for (auto _ : state)
serial_sum();
}
BENCHMARK(BM_serial);
static void BM_parallel(benchmark::State &state)
{
for (auto _ : state)
parallel_sum();
}
BENCHMARK(BM_parallel);
BENCHMARK_MAIN();
1
2
3
g++ -o unittest_sum unittest_sum.cpp -std=c++11 -lpthread -lbenchmark -fopenmp
./unittest_sum