OpenCAEPoro优化(1)

news2024/10/4 19:24:04

核心目的:减少运行时的 object time

方法一:改变运行的进程数

进入OpenCAEPoro目录下运行下述代码(进程数为4)

mpirun -np 4 ./testOpenCAEPoro ./data/case1/case1.data verbose=1

结果如下
在这里插入图片描述
可以看到,object time是很长的(真实的运行时间更长)
那么我来修改一下运行进程数(下面是readme中给出的要求)

在这里插入图片描述

那么我把进程数调节到10(最大),再来看一下运行结果

运行以下代码:

mpirun -np 10 ./testOpenCAEPoro ./data/case1/case1.data verbose=1

结果如下:
在这里插入图片描述
两次结果的对比可以看出,增加运行进程数,可以显著优化 object time

2.改变编译选项,更改数学库

PS:此后每次运行,进程数都是10

更改petsc的配置

有关petsc的介绍和编译时可添加选项,可以去网上找,作者也是去网上了解了一些相关信息

入手点还是我们在配置环境的时候所接触的那个build-petsc文件

在配置环境的时侯,作者由于配置build-petsc文件没有配置好,出现了 Fortran Error 这个错误,当时专门去了解了一下Fortran这个东西

Fortran的介绍:

Fortran是一种广泛使用的编程语言,特别是在科学计算和工程领域。它是由IBM开发的,最初于1957年发布。Fortran是Formula Translation的缩写,最初是为了数学和科学计算的目的而设计的。最新的版本是Fortran 2018,引入了一些现代编程语言的特性,如模块化编程和面向对象编程。具有丰富的数学计算能力和高性能计算特性。

了解之后发现,没什么用哈哈哈哈(又浪费了你10秒生命)

这个是配置环境的时候修改过的 build-petsc 文件

在这里插入图片描述
经过查找资料我们可以对箭头所指添加相关参数,变化为:

COPTFLAGS="-O3 -march=native"
CXXOPTFLAGS="-O3 -march=native"

-march=native:是一个 GCC(GNU Compiler Collection)编译器选项,用于针对当前编译机器的架构进行优化。当你使用这个选项时,编译器会自动检测你机器的 CPU 特性,并生成能够充分利用这些特性的代码

进一步考虑intel提供的高性能库(MKL,oneMKL,TBB,DAAL,IPP等)

DAAL专为数据分析和机器学习应用提供的优化库,支持多种算法和数据处理功能,这里不考虑

IPP这个库提供了用于信号处理、图像处理、数据压缩等的高性能函数,这里也不考虑

TBB是个开发工具套件,集成了多种高性能数学库(包括MKL),这里暂时不使用

在纠结是使用 MKL 库还是使用 oneMKL 库

经过网上搜索了解到:

  • MKL:MKL 是一个经过高度优化的数学库,专注于 Intel 硬件。它通常能提供优越的性能,特别是在使用 Intel 处理器时,如果应用程序的需要最高的性能,且运行在 Intel 硬件上,直接使用 MKL 可能是更合适的选择
  • oneMKL: oneMKL 是 Intel 提供的一个更高层次的 API,旨在简化对不同数学库的访问。它支持多种后端,包括 MKL、OpenBLAS 等,如果希望代码具有更好的可移植性,并且能够在不同的硬件和库之间轻松切换,oneMKL 可能是一个更好的选择,它也提供了一些高级功能,适合需要灵活性的应用

对于 petsc(可扩展的工具包用于科学计算),它通常与 MKL 有良好的兼容性,且很多用户在性能关键的应用中选择使用 MKL。如果对性能有严格要求,并且代码主要在 Intel 硬件上运行,直接使用 MKL 可能是最佳选择。然而,如果需要更好的灵活性和可移植性,oneMKL 也是一个不错的选择

经过上述了解之后,我选择MKL进行优化,因为核心目的是减少 object time

所以为了链接到MKL库,我们在build-petsc文件中**(./configure下)**加上下面这个语句

--with-blas-lapack-dir=/opt/intel/oneapi/mkl

继续加入一些编译时的选项

-funroll-loops:是一个编译选项,一方面可以用于优化循环的执行。在编译时,它会尝试展开循环,即将循环体的内容复制多次,以减少循环控制的开销和提高并行性,另一方面优化针对特定缓存结构的代码生成

-inline:使用内联函数可以减少函数调用的开销,提高程序的执行速度

-qmalloc:可以选择不同的内存分配策略,以优化内存使用

-qopenmp:启用 OpenMP 支持,以便利用多线程并行性

所以修改一下,修改为下述这样

在这里插入图片描述
结果如下

在这里插入图片描述

可以看到,优化结果还不是很明显

再加入一条编译选项试试:

-fp-model fast=2:是一个与浮点数处理相关的编译选项,通常用于 Intel 的编译器(如 ICC 或 icc)以及一些其他支持浮点优化的编译器。它的作用是优化浮点运算的性能,同时保持一定的数值准确性

最开始并不想加入这条语句,因为会导致最终运算结果的不准确,但是还是决定加上试试

最终修改成如下这样

在这里插入图片描述

结果如下

在这里插入图片描述
到这里我已经感觉,添加编译选项没啥用了,不过也可能是我没添加对

上网查找了一下资料,发现优化内存分配可能导致时间增加,所以去掉 -qopenmp和-qmalloc 再试一下

在这里插入图片描述
结果如下:

在这里插入图片描述
证明我的猜测是正确的

所以,编译选项还是应该一条一条的加,分别看效果,一次性加入过多编译条件可能适得其反

总结一下:纵然实现了少许优化,但是加入-fp-model fast=2 编译条件,会失去浮点精度,导致结果不准确,真实比赛时还是要权衡利弊

作者还是不甘心,决定去掉 -fp-model fast=2 条件,再跑一次(反证法)

在这里插入图片描述
在这里插入图片描述
可以看见,时间明显变长了,所以可以判断 -fp-model fast=2 是有显著效果的

3.尝试多机并行

在OpenCAEPoro_ASC2024目录下,执行以下命令

vim hostfile

将创建的hostfile文件修改为如图所示的结果
在这里插入图片描述

最终结果如下
在这里插入图片描述
这里是没有正确实现多机并行,在优化(2)中有改正

4.思考进程数问题

前面提到readme中要求,进程数不可以大于10,具体原因去网上了解了一下:

限制进程数是出于安全和性能考虑。在操作系统中,每个进程都需要系统资源来运行,包括内存、CPU等。如果没有限制进程数,可能会导致系统资源被耗尽,造成系统崩溃或变得不稳定

如果是这个原因,那么我认为进程数是可以大于10的

修改一下hostfile(仍然是多机并行),设置进程数为50看一下结果

在这里插入图片描述

可以看到,object time 有很明显的减少

再次增加5个进程试试(此时进程数为55)

在这里插入图片描述

可以看到,增加了五个进程之后,并没有明显的优化效果,那我们改为52个进程试一下

在这里插入图片描述

显然,在进程数为50的基础上增加进程,优化效果就不是很明显了

所以,我们推断(考虑电力消耗):进程数在50~52之间为最佳

5.总结:

  1. 改变进程数是最有效的优化方式
  2. 添加编译选项的优化效果不是很明显(可能因为模型包含了大量的矩阵计算)
  3. 增加进程数到合适的值,确实可以有效的优化object time

但是,正式比赛时要考虑功耗问题,所以过度增加进程数并不可取(进程数为50左右时)

后续会使用vtune找到耗时久的函数,也会对程序主要功能部分的代码进行优化,看看是否有效果

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

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

相关文章

日常工作记录:服务器被攻击导致chattr: command not found

在深夜的寂静中,公司的服务器突然遭遇了一场突如其来的攻击。特别是nginx配置文件无法修改,仿佛预示着不祥的预兆,面对这突如其来的灾难,技术人员迅速响应。 这时候需要chattr,但是执行的chattr -i xxx的时候&#xf…

神经网络激活函数之前的加权求和 | 矩阵相乘运算法则(清晰版)

1. 神经网络中进行加权求和为什么要将w矩阵进行转置? 下面以一个简单的神经网络作为举例: 我们要将输入特征与W进行加权求和,想要的是下面这种结果: 但是根据矩阵相乘的运算法则: 矩阵A的列数(column&am…

SysML案例-风力发电

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

攻防世界---->Newbie_calculations

学习笔记。 前言:试过od动态分析, 然后发现,那些函数不完全是混淆,怎么剥离 - - 不会 现在学会了。 参考: xctf-Newbie_calculations - jane_315 - 博客园 (cnblogs.com)https://www.cnblogs.com/jane315/p/1376964…

111.WEB渗透测试-信息收集-ARL(2)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:110.WEB渗透测试-信息收集-ARL(1) 2、安装ARL 1、最好先“apt-g…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说,project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具,使用venv可以为每个项目创建一个独立的环境:python -m venv myprojectenv (项目名后e…

电梯,建模的常见话题

以下是最近一则"女婿开电梯门导致岳父惨死"的新闻,可惜生命的同时,也引发了一系列联想。 不少人不了解或者了解但经常下意识忽略:电梯的门和轿厢是分离的部件。部件之间的协作如果有失误,系统就会出问题。电梯可以看作是…

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM(Java Virtual Machine) 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器(PC寄存…

Python+Matplotlib创建y=sinx、y=cosx、y=sinx+cosx可视化

y sin x (奇函数): 图像关于原点对称。 对于任何 x,sin(-x) -sin(x),符合奇函数定义。 y cos x (偶函数): 图像关于 y 轴对称。 对于任何 x,cos(-x) cos(x),符合偶函数定义。 y sin x cos x (既…

jQuery——对象的查找(查找孩子-父母-兄弟标签)

在已经匹配出的元素集合中根据选择器查找孩子/父母/兄弟标签,并封装为新的 jQuery 对象返回 children() 子标签中找 find() 后代标签中找 parent() 父标签 prevAll(&#xff0…

【内存池】——Nginx 内存池结构设计

目录 实现思路——分而治之 Nginx 的内存池结构图 结构体设计 内存池设计: 数据区属性设计: 大块内存区设计: 伪代码解释: 数据结构实现 实现思路——分而治之 算法结构:链表顺序表 1、对于每个请求或者连接都会建…

通信工程学习:什么是IGMP因特网组管理协议

IGMP:因特网组管理协议 IGMP(Internet Group Management Protocol,因特网组管理协议)是TCP/IP协议簇中负责组播成员管理的协议。它主要用于在用户主机和与其直接相连的组播路由器之间建立和维护组播组成员关系。以下是关于IGMP协议…

浙江工业大学《2019年+2023年828自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《浙江工业大学828自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2019年真题 2023年真题 Part1:2019年2023年完整版真题 2019年真题 2023年…

NVIDIA H100 GPU 上的机密计算可实现安全且值得信赖的 AI

NVIDIA H100 GPU 上的机密计算,实现安全可信的 AI 文章目录 前言1. 使用硬件虚拟化的 NVIDIA 机密计算2. 跨硬件、固件和软件保护 AI3. NVIDIA H100 GPU 的硬件安全性4. 在机密计算模式下运行 NVIDIA H100 GPU5. NVIDIA Hopper H100 机密计算为可信 AI 带来的优势6. 虚拟机上基…

68.【C语言】动态内存管理(重点)(1)

本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 目录 1.内存开辟的方式 2.malloc函数 cplusplus网翻译 提炼要点 操作内存空间 01.开辟内存空间成功 02.开辟内存空间失败 如果是x64debug环境下,可能会成功 1.内存开辟的方式 01.创建变量 i…

从0到1酒店民宿管理系统

最近几天放假没事做,在家里就像把学过的winform技术整合下,一些用的技术点整理整理。想着做个什么软件那?无意中看到的酒店管理系统给了我思路。为啥不自己做一个那?说做就做。首先技术确定了使用winform为啥不用wpf那&#xff1f…

Linux环境基础开发工具使用(2)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(2) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. Li…

微服务_3.微服务保护

文章目录 一、微服务雪崩及解决方法1.1、超时处理1.2、仓壁模式1.3、断路器1.4、限流 二、Sentinel2.1、流量控制2.1.1、普通限流2.1.2、热点参数限流 2.2、线程隔离2.3、熔断降级2.3.1、断路器状态机2.3.2、断路器熔断策略2.3.2.1、慢调用2.3.2.2、异常比例,异常数…

Redis --- 第三讲 --- 通用命令

一、get和set命令 Redis中最核心的两个命令 get 根据key来取value set 把key和value存储进去 redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。 语法 set key value : key和value都是字符串。 对于上述这里的key value 不需要加上引号&#…

GIS发展趋势与国产GIS现状

地理信息系统(GIS)作为获取、管理、分析和可视化地理空间数据的重要工具,在多个领域发挥着至关重要的作用。随着技术的不断进步,GIS正朝着更高效、更智能的方向发展。 GIS发展趋势 1. 3D GIS与虚拟现实(VR&#xff0…