并行计算 | OpenMP初识 hello world小实验

2024-03-10 18:04

本文主要是介绍并行计算 | OpenMP初识 hello world小实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 📚并发与并行
  • 📚关于OpenMP
    • 🐇概述
    • 🐇加速原理
    • 🐇基本使用
  • 📚hello world 小实验
    • 🐇代码
    • 🐇运行实现
    • 🐇PuTTy和FileZilla补充介绍

📚并发与并行

  • 并发(Concurrency):系统的一种状态,其中多个任务同时在逻辑上处于活动状态。
  • 并行(Parallelism):系统的一种状态,其中多个任务实际上同时处于活动状态。
    在这里插入图片描述
  • 并行编程过程
    在这里插入图片描述

📚关于OpenMP

🐇概述

  • OpenMP (Open Multi-Processing) 是一种用于并行编程的应用程序接口 (API),它针对共享内存多处理器系统的并行计算进行了优化。它是一个可移植、可伸缩的并行编程模型,可以在多个平台上运行,包括计算机集群大型超级计算机
  • OpenMP 是一个开放的标准,由一组 C、C++ 和 Fortran 编译指令组成,这些指令可以在编写串行代码的同时进行并行化,从而实现更高的程序性能。通过将代码分解为多个线程,OpenMP 可以使多个处理器同时处理问题,从而缩短了计算时间。
  • OpenMP 可以在不修改程序代码的情况下添加并行化,因为它使用编译器指令来控制线程的创建和同步。这使得它非常适合那些需要快速将现有代码并行化的应用程序。
  • OpenMP 提供了一系列指令,包括 #pragma指令,用于告诉编译器哪些部分应该并行执行。在代码中使用这些指令可以实现并行计算,提高程序性能。

🐇加速原理

  • OpenMP 的并行加速原理基于共享内存的并行计算模型。在共享内存计算机系统中,多个处理器可以同时访问共享的主内存。
  • OpenMP 使用基于线程的并行计算模型。线程是程序执行流的基本单位,多个线程可以在同一时间访问共享的主内存,从而实现并行计算。
  • OpenMP 提供了一些指令,如 #pragma omp parallel#pragma omp for,用于将代码块并行化。这些指令告诉编译器在运行时创建多个线程来执行指定的代码块,并通过同步机制确保线程之间的正确协调和数据共享。
  • 使用OpenMP并行化处理时,需要注意线程的数量和负载均衡。如果线程数量太多或太少,都会影响程序的效率。在代码实现中,可以通过设置OMP_NUM_THREADS环境变量来控制线程数量,以达到最优的效率和负载均衡。
  • 数据的意外共享导致竞争条件——程序的结果随着线程的不同调度而改变

🐇基本使用

  1. 引入OpenMP头文件:

    #include "omp.h"
    
  2. 定义并行区域:

    #pragma omp parallel
    {// 并行执行的代码块
    }
    
  3. 获取线程数量:

    int num_threads;
    #pragma omp parallel
    {num_threads = omp_get_num_threads();
    }
    
  4. 获取线程编号:

    int thread_id;
    #pragma omp parallel private(thread_id)
    {thread_id = omp_get_thread_num();
    }
    
  5. 指定并行循环:

    #pragma omp parallel for
    for (int i = 0; i < n; i++) {// 循环体
    }
    
  6. 控制并行循环迭代次数:

    #pragma omp parallel for schedule(static, chunk_size)
    for (int i = 0; i < n; i++) {// 循环体
    }
    
  7. 使用原子操作:

    #pragma omp parallel
    {#pragma omp atomicvariable += value;
    }
    
  8. 使用临界区防止冲突:

    #pragma omp parallel
    {#pragma omp critical{// 临界区代码}
    }
    
  9. 将数据私有化:

    #pragma omp parallel
    {int private_var;// 私有变量只在当前线程中可见
    }
    
  10. 同步线程:

    #pragma omp parallel
    {// 并行执行的代码块#pragma omp barrier// 所有线程必须同步在这里继续执行后面的代码// 其他代码
    }
    

📚hello world 小实验

🐇代码

  • hello.cpp
    #include<stdio.h>
    #include "omp.h"
    int main()
    {#pragma omp parallel{int ID = omp_get_thread_num();printf("hello(%d)",ID);printf("world(%d) \n",ID);	}} 
    
  • compile.sh
    g++ -fopenmp hello.cpp -o hello
    export OMP_NUM_THREADS=60
    ./hello
    

🐇运行实现

  • 借助FileZilla把hello.cppcompile.sh直接拖动到对应目录(也可以直接PuTTy控制台创建移动,但用FileZilla真的很方便,绝对不是偷懒的意思( ・´ω`・ ))
    在这里插入图片描述

  • PuTTy控制台打开,cd到对应路径后,运行sh compile.sh(具体命令都放在compile.sh里,这里直接跑就行了)

    在这里插入图片描述

  • 运行多次,可以看到每次的输出结果都不太一样:由于并行化的特性,多个线程可以同时执行程序的不同部分,因此输出的结果顺序是不确定的。每次运行程序时,不同的线程可能以不同的顺序执行printf()函数,导致输出结果的顺序不同。

🐇PuTTy和FileZilla补充介绍

  • PuTTY是一款免费的SSH、Telnet和rlogin客户端工具,用于远程管理和操作主机
  • PuTTY提供了一个简单易用的用户界面,可以轻松地与服务器进行连接,并提供了一系列功能,如远程登录、文件传输、端口转发等。它支持多种加密和认证方法,确保数据传输的安全性。
  • PuTTy安装及使用

  • FileZilla是一款功能强大且易于使用的开源FTP客户端软件,用于在本地计算机和远程服务器之间进行文件传输。它支持多种操作系统,包括Windows、Mac和Linux。
  • FileZilla提供了简洁直观的界面,可以轻松地连接到FTP服务器,并进行文件上传和下载。它支持多线程传输,具有高效的传输速度和稳定性。同时,它还支持断点续传,可以在传输中断后恢复文件的传输,节省时间和带宽。
  • FileZilla安装流程如下:
    • 找到FileZilla中文网。
      在这里插入图片描述
    • 进入下载界面,下载对应文件。
      在这里插入图片描述
    • 安装完成后,输入远程地址及对应账户密码,即可连接,而后进行文件传输。
      在这里插入图片描述

参考内容:

  • OpenMP(仅供学习使用)
  • cxf老师的PPT

这篇关于并行计算 | OpenMP初识 hello world小实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795059

相关文章

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API框架, 由于使用了 httprouter,速度提高了近40倍。 第一个Gin示例 package mai

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

Python 中考虑 concurrent.futures 实现真正的并行计算

Python 中考虑 concurrent.futures 实现真正的并行计算 思考,如何将代码所要执行的计算任务划分成多个独立的部分并在各自的核心上面平行地运行。 Python 的全局解释器锁(global interpreter lock,GIL)导致没办法用线程来实现真正的并行​,所以先把这种方案排除掉。另一种常见的方案,是把那些对性能要求比较高的(performance-critica