OpenMP

OpenMP

Designed for a shared memory system.

Every process can access to all avaiable memory.

1
2
3
4
5
6
7
8
9
10
#include<omp.h>
int main(){
printf("The output:\n");
#pragma omp parallel num_threads(3)
{
printf("Hello World\n");
}
/* Resume Serial section*/
printf("Done\n");
}

编译器会把OpenMP代码编译为pthread

有一个Master thread, 创建一系列slaves

Most basic parallel directive:

1
#pragma omp parallel

Clause

#pragma omp parallel后面的东西

比如#pragma omp parallel num_threads(3)

防止race condition

1
2
3
4
5
6
7
global_result = 0.0;
#pragma omp parallel
{
double my_result = Trap(a, b, n);
pragma omp critical
global_result += my_result;
}

Scope of variable:

可以被所有线程操作的变量:share scope(默认情况)

只能被单个线程才操作的变量:private scope

Reduction operators:

定义:binary operation,+, *, -, &, |, ˆ, &&, ||

reduction(\: \)

可以被加入到clause里面

1
2
3
global_result = 0.0;
#pragma omp parallel reduction(+: global_result)
global_result += Trap(a, b, n);

Parallel For

1
2
3
4
5
6
h = (b-a)/n;
approx = (f(a) + f(b)) / 2.0;
#pragma omp parallel for reduction(+: approx)
for (int i = 1; i < n-1; i++)
approx += f(a + i*h);
approx = h*approx;

Data dependencies

斐波那契数列:

OpenMp不会去检查iteration之间的数据依赖!