首页 > 其他分享 >OpenMP入门教程(一)hello world

OpenMP入门教程(一)hello world

时间:2023-01-25 21:02:40浏览次数:52  
标签:threads thread 入门教程 并行 线程 tid OpenMP hello


​代码在git​

什么是OpenMP

Open Multi-Processing的缩写,是一个应用程序接口(API),可用于显式指导多线程、共享内存的并行性。

    在项目程序已经完成好的情况下不需要大幅度的修改源代码,只需要加上专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。

    OpenMP支持的语言包括C/C++、Fortran;而支持OpenMP的编译器VS、gcc、clang等都行。可移植性也很好:Unix/Linux和Windows

OpenMP编程模型

内存共享模型:OpenMP是专为多处理器/核,共享内存机器所设计的。底层架构可以是UMA和NUMA。即(Uniform Memory Access和Non-Uniform Memory Access)

OpenMP入门教程(一)hello world_数据

  • OpenMP仅通过线程来完成并行
  • 一个线程的运行是可由操作系统调用的最小处理单
  • 线程们存在于单个进程的资源中,没有了这个进程,线程也不存在了
  • 通常,线程数与机器的处理器/核数相匹配,然而,实际使用取决与应用程序

明确的并行

  • OpenMP是一种显式(非自动)编程模型,为程序员提供对并行化的完全控制
  • 一方面,并行化可像执行串行程序和插入编译指令那样简单
  • 另一方面,像插入子程序来设置多级并行、锁、甚至嵌套锁一样复杂

Fork-Join模型

OpenMP入门教程(一)hello world_多线程_02

  • OpenMP就是采用Fork-Join模型
  • 所有的OpenML程序都以一个单个进程——master thread开始,master threads按顺序执行知道遇到第一个并行区域
  • Fork:主线程创造一个并行线程组
  • Join:当线程组完成并行区域的语句时,它们同步、终止,仅留下主线程

数据范围

  • 由于OpenMP时是共享内存模型,默认情况下,在共享区域的大部分数据是被共享的
  • 并行区域中的所有线程可以同时访问这个共享的数据
  • 如果不需要默认的共享作用域,OpenMP为程序员提供一种“显示”指定数据作用域的方法

嵌套并行

  • API提供在其它并行区域放置并行区域
  • 实际实现也可能不支持

简单使用

具体的:新建一个C/C++程序,注意一定要加上<omp.h>头文件。

写一个并行的Hello World

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
int nthreads, tid;

/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
{

/* Obtain thread number */
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);

/* Only master thread does this */
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}

} /* All threads join master thread and disband */
return 0;
}

也可以直接使用gcc加上-fopenmp编译,For example:

g++ test.cpp -o test -fopenmp
./test
gcc test.cpp -o test -fopenmp -lstdc++


标签:threads,thread,入门教程,并行,线程,tid,OpenMP,hello
From: https://blog.51cto.com/u_15202985/6022901

相关文章

  • OpenMP入门教程
    ​​OpenMP入门教程​​OpenMPAPI概述OpenMP由三部分组成:编译指令(19)运行时库程序(32)环境变量(9)后来的API包含同样的三个组件,只是三者的数量都有所增加。编译器指令OpenM......
  • OpenMP Parallel Construct 实现原理与源码分析
    OpenMPParallelConstruct实现原理与源码分析前言在本篇文章当中我们将主要分析OpenMP当中的parallelconstruct具体时如何实现的,以及这个construct调用了哪些运......
  • Flask框架简介、安装及Hello World程序运行
    一、Flask简介Flask诞生于2010年,是用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用......
  • 输出 printf(“Hello world!”)的返回值
    输出描述:​包括两行:第一行为“Helloworld!”第二行为printf(“Helloworld!”)调用后的返回值printf的返回值:打印的字符的大小思路一:#include<stdio.h>intmain(){ ......
  • Hello, Python
    一、前戏1.编程语言简介在生活中,如果你想和外国人进行交流,你就得懂得他们国家的语言(汉语、英语、德语、法语等等),同样的,编程语言就是人与计算机之间沟通的一门语言,它能够......
  • OpenMP 原子指令设计与实现
    OpenMP原子指令设计与实现前言在本篇文章当中主要与大家分享一下openmp当中的原子指令atomic,分析#pragmaompatomic在背后究竟做了什么,编译器是如何处理这条指令......
  • 深入理解 OpenMP 线程同步机制
    深入理解OpenMP线程同步机制前言在本篇文章当中主要给大家介绍OpenMP当中线程的同步和互斥机制,在OpenMP当中主要有三种不同的线程之间的互斥方式:使用critical......
  • 网页版helloworld
    packagemainimport("fmt""net/http")funcmain(){http.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){fmt.Fprint(w,......
  • Powerbuilder练级攻略000_窗口helloword
    新建一个目录,如D:\pb_project\tutorial\p001_helloworldFile-New-Workspace-OK,选中D:\pb_project\tutorial\p001_helloworld,打开,文件名输入p001_helloworld,保存......
  • DX12 Hello World系列 基础篇(上)
    前言DX12对于初学者来说难度是偏大的,龙书确实写的不错,但笔者认为还是不够清晰,因此本篇将带你了解DX12最为基本的流程,希望能带你快速入门DX12本篇为上册,下册将讲解渲染管......