Angularjs的重要概念

seo排名网 230 0

OpenMP 线程同步 Construct 实现原理以及源码分析(上)

前言

在本篇文章当中主要给大家介绍在 OpenMP 当中使用的一些同步的 construct 的实现原理,如 master, single, critical 等等!并且会结合对应的汇编程序进行仔细的分析。(本篇文章的汇编程序分析基于 x86_86 平台)

Flush Construct

首先先了解一下 flush construct 的语法:

#pragma omp flush(变量列表)

这个构造比较简单,其实就是增加一个内存屏障,保证多线程环境下面的数据的可见性,简单来说一个线程对某个数据进行修改之后,修改之后的结果对其他线程来说是可见的。

#include <stdio.h>
#include <omp.h> int main()
{
int data = 100;
#pragma omp parallel num_threads(4) default(none) shared(data)
{
#pragma omp flush(data)
}
return 0;
}

上面是一个非常简单的 OpenMP 的程序,根据前面的文章 OpenMp Parallel Construct 实现原理与源码分析 我们可以知道会讲并行域编译成一个函数,我们现在来看一下这个编译后的汇编程序是怎么样的!

gcc-4 编译之后的结果

00000000004005f6 <main._omp_fn.0>:
4005f6: 55 push %rbp
4005f7: 48 89 e5 mov %rsp,%rbp
4005fa: 48 89 7d f8 mov %rdi,-0x8(%rbp)
4005fe: 0f ae f0 mfence
400601: 5d pop %rbp
400602: c3 retq
400603: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40060a: 00 00 00
40060d: 0f 1f 00 nopl (%rax)

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~