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

📚并发与并行

  • 并发(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 atomic
        variable += 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中文网。
      在这里插入图片描述
    • 进入下载界面,下载对应文件。
      在这里插入图片描述
    • 安装完成后,输入远程地址及对应账户密码,即可连接,而后进行文件传输。
      在这里插入图片描述

参考内容:

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦右一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值