OpenCAEPoro优化(2)

news2024/11/25 0:24:54

前言:

首先有一点要注意:

修改代码时,要注意命名空间的冲突问题(主要是头文件中)

作者了解了相关这个项目的一些背景介绍;得到的主要信息是:这种大型程序一般都是优化的比较完善了,即使有优化空间,也很小了(不知道我们从github拉下来的是不是这样)

自上次发完 OpenCAEPoro优化(1)之后,作者使用vtune找出了程序热点图(发现并没有分析出什么有效信息),并整理了一下思路,打算对代码部分做出如下改动:

作者在此提供一个新思路(仅供参考哈):根据文件名称,推测出相应的.cpp文件的作用,并结合vtune分析其是不是执行主要功能的函数

一.更错

由于之前没有设置多机之间的免密通信,导致程序并没有真正在多机上跑

1.在gpu01上生成ssh密钥

运行下述命令

ssh-keygen -t rsa

2.将公钥复制到其他机器

在gpu01上输入如下命令并回车

ssh-copy-id gaohaixiao@gpu02

gpu03 gpu04 同理

3.测试免密登录

ssh gaohaixiao@gpu02

gpu03 gpu04 同理

4.使用SSH并行执行任务

可以通过循环来实现:

for i in {1..4}; do
    ssh gaohaixiao@gpu0$i 'mpirun -np 50 -machinefile ~/OpenCAEPoro_ASC2024/hostfile ./testOpenCAEPoro ./data/case1/case1.data verbose=1' &
done

二:对内存分配进行优化

这里以AllWells.cpp为例子

void AllWells::InputParam(const ParamWell& paramWell, const Domain& domain)
{
    OCP_FUNCNAME;

    // 预分配内存以提高性能
    solvents.reserve(paramWell.solSet.size());
    solvents.insert(solvents.end(), paramWell.solSet.begin(), paramWell.solSet.end());

    Psurf = paramWell.Psurf;
    Tsurf = paramWell.Tsurf;

    const auto& my_well = domain.GetWell();
    numWell = my_well.size();

    // 使用指针减少内存分配开销
    wells.reserve(numWell);
    for (USI w = 0; w < numWell; w++) {
        wells.push_back(paramWell.thermal ? new PeacemanWellT() : new PeacemanWellIsoT());
    }

    USI t = paramWell.criticalTime.size();
    vector<USI> wellOptTime;
    vector<WellOptPair> tmpOptParam;

    for (USI wdst = 0; wdst < numWell; wdst++) {
        const OCP_USI wsrc = my_well[wdst];
        const auto& wellSrc = paramWell.well[wsrc];

        // 使用引用避免多次访问
        auto* currentWell = wells[wdst];
        currentWell->name = wellSrc.name;
        currentWell->group = wellSrc.group;
        currentWell->depth = wellSrc.depth;
        currentWell->InputPerfo(wellSrc, domain, wsrc);
        currentWell->Psurf = Psurf;
        currentWell->Tsurf = Tsurf;
        currentWell->ifUseUnweight = wellSrc.ifUseUnweight;

        currentWell->optSet.resize(t);

        // 验证选项参数的数量
        const USI n0 = wellSrc.optParam.size();
        if (n0 == 0) {
            OCP_ABORT("NO Well Opt Param for -- " + wellSrc.name);
        }

        // 过滤重复的optParam.d
        tmpOptParam.clear();
        tmpOptParam.reserve(n0);
        for (USI i = 0; i < n0; i++) {
            if (i == 0 || wellSrc.optParam[i].d != wellSrc.optParam[i - 1].d) {
                tmpOptParam.push_back(wellSrc.optParam[i]);
            }
        }

        const USI n = tmpOptParam.size();
        wellOptTime.clear();
        wellOptTime.resize(n + 1);
        for (USI i = 0; i < n; i++) {
            wellOptTime[i] = tmpOptParam[i].d;
        }
        wellOptTime.back() = t;

        // 填充optSet
        for (USI i = 0; i < n; i++) {
            for (USI d = wellOptTime[i]; d < wellOptTime[i + 1]; d++) {
                currentWell->optSet[d] = WellOpt(tmpOptParam[i].opt);
            }
        }
    }
}

核心步骤:
减少内存分配次数:对于solvents的填充,使用insert方法而不是循环,这样可以减少多次调用push_back的开销

三.对循环进行优化

使用OpenMP

OpenMP 是一个用于支持多平台共享内存并行编程的 API,非常适合循环并行化
具体做法是在循环前加上下面这段代码,实现循环并行化

// 使用 OpenMP 并行化循环
#pragma omp parallel for reduction(+:total)

四.优化结果

根据优化(1)中的经验,作者采用四机并行,52进程

结果如下:
在这里插入图片描述
可以看出,多机并行,优化循环,对内存分配进行优化是有效果的

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

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

相关文章

【Vue3实战】:用导航守卫拦截未保存的编辑,提升用户体验

前言 在Vue3应用中&#xff0c;用户可能会在一个页面上进行数据编辑&#xff0c;如填写表单或修改表格中的数据。当用户在未保存更改的情况下尝试离开当前页面时&#xff0c;我们希望能够弹出提示框&#xff0c;告知用户有未保存的更改&#xff0c;并询问是否确定离开。 一、使…

【案例】平面云

教程案例视频&#xff1a;Unity Shader Graph - 云教程 开发平台&#xff1a;Unity 2022 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、ShaderGraph 路线图 三、案例分析 核心思路&#xff1a;使用 Noise&#xff08;噪声&#xff09;模拟云层状态   3.1 说明…

打造高效灵活的数字企业——The Open Group 2024生态系统架构·可持续发展年度大会重磅来袭

随着数字经济的高速发展&#xff0c;企业数字化转型已成为时代的必然趋势。如何在这场变革中抢占先机&#xff0c;实现业务增长与降本增效&#xff0c;成为众多企业关注的焦点。为此&#xff0c;The Open Group 2024生态系统架构可持续发展年度大会将于明年盛大开启&#xff0c…

Studying-多线程学习Part1-线程库的基本使用、线程函数中的数据未定义错误、互斥量解决多线程数据共享问题

来源&#xff1a;多线程编程 线程库的基本使用 两个概念&#xff1a; 进程是运行中的程序线程是进程中的进程 串行运行&#xff1a;一次只能取得一个任务并执行这一个任务 并行运行&#xff1a;可以同时通过多进程/多线程的方式取得多个任务&#xff0c;并以多进程或多线程…

Leetcode: 0011-0020题速览

Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

Java在用增强for循环遍历集合时删除元素,抛出java.util.ConcurrentModificationException异常

文章目录 0. 前言1. 问题产生的背景2. Java中增强for循环的底层原理3. 为什么增强for循环不支持在遍历集合时删除元素3.1 问题排查3.2 modCount 变量的来源3.3 expectedModCount 变量的来源3.4 导致modCount变量和expectedModCount不相等的原因3.5 为什么用迭代器遍历元素时删除…

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

Leetcode: 0021-0030题速览

Leetcode: 0021-0030题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

如此的“宠物医保”靠谱吗?

今天是世界动物日&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《带着笑意的眼睛&#xff0c;能看见最美的风景》。 截图&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff0c;带着笑意的眼睛&#xff0c;能看见最美的风景。生活中多一点微笑&#xff…

buuctf 部分misc题

rar 这个不多说了直接暴力破解&#xff0c;提示说的已经很清楚了&#xff0c;四位数密码&#xff1b; qr 这个就是一个二维码&#xff0c;用qr扫一下就出来了&#xff1b; 镜子里面的世界 用stegslove&#xff0c;打开dataextract进行调整 调整之后就可以得到flag了 ning…

ipv6之ospf配置

topo图 路由器均使用ipv6的地址 AR1使用默认路由到达ISP&#xff0c;在ospf上使用路由下发功能&#xff0c;把ISP的静态路由下发给内部网络 ISP使用7条静态路由&#xff0c;到达内部网络 AR1、AR2、AR3、AR4之间使用ospfv3进行通信 但是我配了下面的代码无法通信&#xff0…

driver,sequencer,sequence之间的握手关系_2024年10月3日

driver &#xff1a;根据接口协议将事务转换为一组信号级切换的组件。 sequencer &#xff1a;将事务&#xff08;sequence items&#xff09;从 sequence 发送到 driver&#xff0c;并将 driver 的响应反馈给 sequence 的组件。会对同时尝试访问 driver 以激励设计接口的多个 …

什么是 HTTP 请求中的 options 请求?

在 Chrome 开发者工具中的 Network 面板看到的 HTTP 方法 OPTIONS&#xff0c;其实是 HTTP 协议的一部分&#xff0c;用于客户端和服务器之间进行“预检”或“协商”。OPTIONS 请求的作用是让客户端能够获取关于服务器支持的 HTTP 方法和其他跨域资源共享 (CORS) 相关的信息&am…

spring揭秘25-springmvc04-servlet容器与springmvc容器总结

文章目录 【README】【1】DelegatingFilterProxy回顾【1.1】DelegatingFilterProxy初始化过滤器bean 【2】从servlet容器获取springmvc顶级web容器【2.1】从Servlet容器中获取springmvc容器总结【2.2】ContextLoaderListener加载springmvc顶级web容器并将其添加到servlet容器【…

基于SpringBoot+Vue的科研课题项目管理系统源码

文章目录 1.技术架构2.主要功能3.获取方式 1.技术架构 后端&#xff1a;SpringBoot 前端&#xff1a;Vue – Element UI 2.主要功能 登录 /注销、 用户管理、项目管理、申报管理、变更管理、 结题管理、角色管理、权限管理、数据字典等功能 3.获取方式 点击下方名片&a…

android 全面屏最底部栏沉浸式

Activity的onCreate方法中添加 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); Android 系统 Bar 沉浸式完美兼容方案自 Android 5.0 版本&#xff0c;Android 带来了沉浸式系统 ba - 掘金 (juejin.cn)https://juejin.cn/post/7075578…

pycharm中使用anaconda创建多环境,无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

问题描述 用的IDE是&#xff1a; 使用anaconda创建了一个Python 3.9的环境 结果使用pip命令的时候&#xff0c;报错 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案 为了不再增加系统变量&#xff0c;我们直接将变量添加在当前项目中你的Ter…

Python3使用cv_bridge转换ROS的image信息

0. Preface 现在很多新的图片处理model都是基于python3的&#xff0c;而ROS还是2.7的&#xff0c;要结合起来用不可避免有很多问题&#xff0c;以下以接收ROS image为例子 以下方法需要用的anaconda&#xff0c;安装方法有很多blog分享 1. Preparation 以下是python3接收ima…

【黑马点评】0.环境配置--Redis6.2.6和可视化工具在Windows上的安装

黑马点评--0.Redis6.2.6在windows上的环境配置与可视化 0 前言1 下载安装2 解压后运行msi文件3 修改配置文件并打开Redis3.1 修改密码&#xff08;可选&#xff09;3.2 测试 4 Redis可视化&#xff08;可选&#xff09;4.1 Another Redis Desktop Manager下载安装4.2 连接Redis…

删除苹果手机所有照片的方法有哪些?

在这个数码摄影盛行的时代&#xff0c;手机相册里可能堆积了成千上万的照片&#xff0c;尤其是苹果手机用户。无论是为了释放存储空间&#xff0c;还是因为想要重新开始整理照片&#xff0c;删除所有照片可能成为一个必要的任务。那么&#xff0c;如何有效地删除删除苹果手机所…