本文主要是介绍并行计算 | 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
环境变量来控制线程数量,以达到最优的效率和负载均衡。 - 数据的意外共享导致竞争条件——程序的结果随着线程的不同调度而改变。
🐇基本使用
-
引入OpenMP头文件:
#include "omp.h"
-
定义并行区域:
#pragma omp parallel {// 并行执行的代码块 }
-
获取线程数量:
int num_threads; #pragma omp parallel {num_threads = omp_get_num_threads(); }
-
获取线程编号:
int thread_id; #pragma omp parallel private(thread_id) {thread_id = omp_get_thread_num(); }
-
指定并行循环:
#pragma omp parallel for for (int i = 0; i < n; i++) {// 循环体 }
-
控制并行循环迭代次数:
#pragma omp parallel for schedule(static, chunk_size) for (int i = 0; i < n; i++) {// 循环体 }
-
使用原子操作:
#pragma omp parallel {#pragma omp atomicvariable += value; }
-
使用临界区防止冲突:
#pragma omp parallel {#pragma omp critical{// 临界区代码} }
-
将数据私有化:
#pragma omp parallel {int private_var;// 私有变量只在当前线程中可见 }
-
同步线程:
#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.cpp
和compile.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中文网。
- 进入下载界面,下载对应文件。
- 安装完成后,输入远程地址及对应账户密码,即可连接,而后进行文件传输。
- 找到FileZilla中文网。
参考内容:
- OpenMP(仅供学习使用)
- cxf老师的PPT
这篇关于并行计算 | OpenMP初识 hello world小实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!