【c++】并行编程:OpenMP入门

news2024/11/16 13:55:20

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍OpenMP入门。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 并行编程OpenMP介绍
    • :blush:2. openmp并行处理for循环
    • :satisfied:3. openmp多线程执行效率对比

😏1. 并行编程OpenMP介绍

OpenMP是一种用于并行编程的开放标准,它旨在简化共享内存多线程编程的开发过程。OpenMP提供了一组指令和库例程,可以将顺序程序转换为可并行执行的代码。

OpenMP的核心思想是使用指令来标识出需要并行执行的代码块,并指定如何将工作划分到不同的线程中。开发人员可以在现有的顺序代码中插入特定的指令,以实现并行化。

以下是OpenMP的一些主要特性:

1.指令注释:通过在代码中插入特定的预处理指令,开发人员可以标识出应该并行执行的代码块。例如,可以使用#pragma omp parallel指令来创建一个并行区域。

2.线程创建与同步:OpenMP自动管理线程的创建和同步。在进入并行区域时,OpenMP会动态地创建一组线程,并在退出并行区域时进行同步。开发人员无需手动管理线程的创建和销毁。

3.工作分配:OpenMP提供了多种方式来将工作划分到不同的线程中。例如,可以使用#pragma omp for指令将循环迭代并行化,让不同线程处理不同的迭代。

4.共享内存模型:OpenMP使用共享内存模型,允许多个线程之间共享数据。开发人员可以使用shared关键字将变量声明为共享变量,以便多个线程可以访问和修改它们。

5.线程私有变量:除了共享变量外,OpenMP还支持线程私有变量。开发人员可以使用private关键字将变量声明为线程私有,确保每个线程都有自己的副本。

OpenMP广泛用于各种领域的并行编程,包括科学计算、图形处理、机器学习等。它提供了一种相对简单且易于使用的方法来利用多核处理器的计算能力,加速程序的执行。

😊2. openmp并行处理for循环

openmp常用来对代码中的for循环进行并行处理优化:

一个例子如下:

// main.cpp
// 使用并行循环进行向量加法
#include <stdio.h>
#include <omp.h>

#define SIZE 10000

int main() {
    int i;
    int a[SIZE], b[SIZE], c[SIZE];

    // 初始化数组
    for (i = 0; i < SIZE; i++) {
        a[i] = i;
        b[i] = i;
    }

    #pragma omp parallel for
    for (i = 0; i < SIZE; i++) {
        c[i] = a[i] + b[i];
    }

    // 打印结果
    for (i = 0; i < SIZE; i++) {
        printf("%d ", c[i]);
    }
    printf("\n");

    return 0;
}

例程中使用#pragma omp parallel for指令来并行化for循环。这个指令告诉编译器将循环分割成多个任务,并由多个线程同时执行。每个线程负责处理循环的一个子集。

编译时启用OpenMP支持,g++ main.cpp -fopenmp

这样程序就可以并发执行,提高运算效率了。

😆3. openmp多线程执行效率对比

openmp可以对一段程序指定不同线程数来优化,下面是一个示例:

#include <iostream>
#include <omp.h>
 
using namespace std;
 
void test()
{
	for (int i = 0; i < 50000; i++)
	{
	}
}
 
int main()
{
	float startTime = omp_get_wtime();
 
	//指定2个线程
#pragma omp parallel for num_threads(2)
	for (int i = 0; i < 50000; i++)
	{
		test();
	}
	float endTime = omp_get_wtime();
	printf("指定 2 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
 
	//指定4个线程
#pragma omp parallel for num_threads(4)
	for (int i = 0; i < 50000; i++)
	{
		test();
	}
	endTime = omp_get_wtime();
	printf("指定 4 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
 
	//指定8个线程
#pragma omp parallel for num_threads(8)
	for (int i = 0; i < 50000; i++)
	{
		test();
	}
	endTime = omp_get_wtime();
	printf("指定 8 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
 
	//指定12个线程
#pragma omp parallel for num_threads(12)
	for (int i = 0; i < 50000; i++)
	{
		test();
	}
	endTime = omp_get_wtime();
	printf("指定 12 个线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
 
	//不使用OpenMP
	for (int i = 0; i < 50000; i++)
	{
		test();
	}
	endTime = omp_get_wtime();
	printf("不使用OpenMP多线程,执行时间: %f\n", endTime - startTime);
	startTime = endTime;
 
	return 0;
}

结果如下:

指定 2 个线程,执行时间: 2.098389
指定 4 个线程,执行时间: 1.102295
指定 8 个线程,执行时间: 0.564941
指定 12 个线程,执行时间: 0.375244
不使用OpenMP多线程,执行时间: 3.956543

例程中使用#pragma omp parallel for num_threads(12)来对程序指定线程数,对这种运算次数多的情况下,提高openmp方法可压缩执行时间到1/4左右,但不能简单通过提高线程数来提高效率。

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“希尔排序:打破时间瓶颈的排序算法 “

文章目录 &#x1f50d;什么是希尔排序&#x1f511;希尔排序分组思想&#x1f4c8;希尔排序的优缺点&#x1f468;‍&#x1f4bb;希尔排序代码剖析 &#x1f50d;什么是希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种高效率的改进版本&#xff0c;也…

浏览器缓存方式有哪些(cookie、localstorage、sessionstorage)

浏览器缓存方式 概要 http缓存 基于HTTP协议的浏览器文件级缓存机制 websql 只有较新的chrome浏览器支持&#xff0c;并以一个独立规范形式出现 indexDB 一个为了能够在客户端存储可观数量的结构化数据&#xff0c;并且在这些数据上使用索引进行高性能检索的 API Cooki…

v-model双向绑定指令

文章目录 前言v-model.lazy 延迟同步v-model.trim 去掉空格 前言 v-model指令是Vue.js中实现双向数据绑定的一种重要机制。它可以将表单控件的值与Vue.js实例中的数据进行双向绑定&#xff0c;即当表单控件的值发生变化时&#xff0c;Vue.js实例中的数据也会随之更新&#xff…

qt实现漂亮主页面

模仿自feiyangqingyun的博客_CSDN博客-Qt/C控件SDK使用示例,Qt/C音视频开发,Qt/C自定义控件领域博主 1.无边框窗口可移动 #ifndef MOVABLE_WIDGET_H #define MOVABLE_WIDGET_H#include <QWidget>class movable_widget:public QWidget { public:movable_widget(QWidget *…

华为荣耀6X(BLN-AL20)解锁全过程

这台旧手机一直闲置&#xff0c;想用它做测试机&#xff0c;所以必须先解锁。在此之前我已将手机改成了直供电&#xff0c;所以图片里没有电池&#xff0c;但是目前直供电方案并不完美&#xff0c;除了直供电线要插&#xff0c;尾插也要插上&#xff0c;淘宝卖家给出的理由是普…

部署 CNI网络组件

部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命令空间&#xff0c; 相当于它们在同一台机器上一样&#xff0c;可以用 localhost 地址访问彼此的端…

如何看待程序员的高薪现象?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 最近在知乎上看到这样个话题&#xff1a; 难道不应该吗&#xff1f; 本人月薪八千&#xff0c;在北京一线&#xff0c;拿着最基础的工资&#xff0c;上的加班最频繁的班&#xff0c;干最累的活…

STM32模拟SPI协议控制数字电位器MCP41010电阻值

STM32模拟SPI协议控制数字电位器MCP41010电阻值 MCP41010是单路8位分辨率数字电位器&#xff0c;通过SPI接口可控制电位器阻值分配&#xff0c;相当于PW0端在PA0和PB0之间滑动。如下图所示&#xff1a; MCP41010是10K欧姆规格的数字电位器&#xff0c;即PA0和PB0之间的阻值恒…

Spring Boot 中的 @HystrixCommand 注解

Spring Boot 中的 HystrixCommand 注解 简介 在分布式系统中&#xff0c;服务之间的调用是不可避免的。但随着服务数量的增加&#xff0c;服务之间的依赖关系也会变得越来越复杂&#xff0c;服务的故障也会变得越来越常见。一旦某个服务出现故障&#xff0c;它所依赖的服务也…

Helm之深入浅出Kubernetes包管理工具基础

Helm 基础 作者&#xff1a;行癫&#xff08;盗版必究&#xff09; 一&#xff1a;Helm 简介 1.简介 ​ Helm 是 Kubernetes 的包管理器&#xff1b;它提供了提供、共享和使用为 Kubernetes 构建的软件的能力&#xff1b;是CNCF的毕业项目&#xff0c;自 Helm 加入 CNCF 以来…

【Canal】从原理、配置出发,从0到1完成Canal搭建

文章目录 简介工作原理MySQL主备复制原理canal 工作原理 Canal架构Canal-HA机制应用场景同步缓存 Redis /全文搜索 ES下发任务数据异构 MySQL 配置开启 binlog扩展statementrowmixed 配置权限 Canal 配置配置启动报错解决 实战引入依赖代码样例测试 前几天在网上冲浪的时候发现…

MYSQL03高级_新增用户、授予权限、授权底层表结构、角色理解

文章目录 ①. 登录服务器操作②. 用户的增删改③. 修改用户密码④. MySQL8密码管理⑤. 权限列表及原则⑥. 授予查看回收权限⑦. 底层权限表操作⑧. 角色的理解 ①. 登录服务器操作 ①. 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hos…

chatgpt赋能python:搜索Python答案的软件

搜索Python答案的软件 介绍&#xff1a;什么是搜索Python答案的软件&#xff1f; 搜索Python答案的软件是一种工具&#xff0c;可以帮助编程人员快速地找到他们在编写Python代码时遇到的问题的答案。这种软件可以搜索各种不同的网站&#xff0c;以帮助用户找到最适合他们问题…

实例006 菜级联菜单

实例说明 如果管理程序功能菜单非常多&#xff0c;一些功能中又包括许多子功能&#xff0c;这时可以使用级联菜单来组织系统的各个功能。实例运行结果如图1.6所示。 图1.6 级联菜单 技术要点 制作级联菜单需要使用MenuStrip控件。 注意&#xff1a;在使用级联菜单时最好不要…

Redis三种模式——主从复制、哨兵、集群

目录 一、概述 二、 Redis 主从复制 1.主从复制的作用 2. 主从复制流程 3. 搭建Redis 主从复制 3.1准备环境 3.2安装redis 3.3创建redis工作目录 3.4环境变量 3.5定义systemd服务管理脚本 3.6修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 3.7修改 …

我在「亚马逊云科技中国峰会」做讲师 - 「程序员的社区成长史」

文章目录 ⭐️ Part - 〇&#xff1a;开场的自我介绍⭐️ Part - ①&#xff1a;程序员的学习从技术社区开始&#x1f31f; 编程初学者共同面对的迷茫&#x1f31f; 加入一个适合自己的技术社区&#x1f31f; 反哺社区做有价值的贡献者 ⭐️ Part - ②&#xff1a;与技术社区的…

STM32F4 WiFi上传温度【ds18b20传感器、网络通信】

通过WIFI或GPRS上传温度到云端 本篇博客将介绍如何使用WIFI或GPRS模块将温度数据上传到云端。我们将涵盖连接网络的过程、上传数据的过程以及相关代码。 准备工作 在开始之前&#xff0c;我们需要准备以下材料&#xff1a; STM32F4开发板温度传感器&#xff08;例如18B20&a…

ch0_汇编介绍

1. 汇编作用 1.1 1.2 1.3 2.  机器语言到汇编语言 2.1 2.2 2.3 3.  计算机的组成 3.1 指令和数据是存放在存储器中的&#xff0c; 而计算机包含多种存储器&#xff1b; 但是&#xff0c;在计算机工作的过程中&#xff0c; 指令和数据则必须存放到内存中。 而对于…

代码随想录二刷day41 | 动态规划之 343. 整数拆分 96.不同的二叉搜索树

day41 343. 整数拆分确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp的初始化确定遍历顺序举例推导dp数组 96.不同的二叉搜索树确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 34…