Posts OpenMP
Post
Cancel

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 

OLDER POST NEWER POST

Comments powered by Disqus.

Search Results