openfoam并行通信探索(一)
前言
最近在忙,快一两周没更新了,今天说下如何实现openfoam内的并行通信
为什么要并行通信
说到并行通信大家不要害怕啊,只是不同核之间数据传递,比如说咱们仿真开16个核,3号计算单元对4号计算单元说句”hello“,然后4号再回复”hi“,类似这样
是不是很像不同的微信号传递消息,
其实咱们每个个体对于整个社会而言也是不同的核
假如现在我开个工厂,并行开16个核可以打比方作为我这个厂子有16个工人
咱们这个工厂是在制造生产什么呢,对于我们仿真工作来说就是生产海量的数据
写到这里,想到身边多了16个小兄弟陪伴自己,十分温暖,
如果身边还有超算,甚至多了几百个弟兄帮忙
怎么才能让工厂的效率最高呢,当然是和兄弟们心往一处使,力往一处用啊
那怎么能让大家齐心合力呢,靠的是沟通
大家有没有发现最近几十年生活节奏越来越快了,这是因为我们的通信成本越来越低了
因为有了信息传输更及时有效,社会分工越来越细致,整个社会的效率也越来越高
我们如果想把我们的仿真流程提上去,必须要实现核与核之间的信息传输,让仿真流程更细致,弟兄们齐心协力生产数据
并行通信在openfoam中的实现
我们首先想下用微信把消息发送出去需要几步
1.登录微信号 → 初始化
2.知道对方微信号 → 进程ID
3.输入文字 → 准备数据
4.点击发送 → send
5.发送成功(当然也有可能网不好或者被拉黑发送失败) → 状态检查
6.退出微信 → 结束进程
简述一下,打开冰箱,放进大象,关上冰箱,easy
openfoam内利用PstreamBuffers类封装大象,openfoam对其解释如下:
Description:
Buffers for inter-processor communications streams (UOPstream, UIPstream).
Use UOPstream to stream data into buffers, call finishedSends() to
notify that data is in buffers and then use IUPstream to get data out
of received buffers. Works with both blocking and nonBlocking. Does
not make much sense with scheduled since there you would not need these
explicit buffers.
大概意思就是用于传输信息流的中间载体,利用finishedSends()表示结束发送
甚至在注释下方写明了如何使用
PstreamBuffers pBuffers(Pstream::commsTypes::nonBlocking);
for (label proci = 0; proci < Pstream::nProcs(); proci++)
{
if (proci != Pstream::myProcNo())
{
someObject vals;
UOPstream str(proci, pBuffers);
str << vals;
}
}
pBuffers.finishedSends(); // no-op for blocking
for (label proci = 0; proci < Pstream::nProcs(); proci++)
{
if (proci != Pstream::myProcNo())
{
UIPstream str(proci, pBuffers);
someObject vals(str);
}
}
大概解释下这个程序的意思:
第一句是创建一个PstreamBuffers类,Pstream::commsTypes::nonBlocking意思是非阻塞通信,Pstream::commsTypes枚举类内有三个枚举,
enum class commsTypes
{
blocking,
scheduled,
nonBlocking
};
分别对应的是阻塞通信,计时通信,非阻塞通信,
阻塞通信在通信结束前不会返回任何消息,信息要一个个排队,因而导致通信的阻塞
计时通信是为了提高并行通信的效率而采用的倒计时格式
非阻塞通信效率较高,适用于不同处理器之间通信,他允许在等待通信完成的过程中处理其他事件,并在一个通信完成后立刻开通另一个通信
接下来跑了一个循环,对除自己以外所有处理器进行了遍历,将someObject vals输送到缓存中
pBuffers.finishedSends()说我这边发送完成
下面这个循环用UIPstream类进行接收
接下我们用openfoam实现
首先创建新案例
foamNewApp comm_parallel
随便拷贝一个能并行的算例到文件夹中命名debug_case
接下来我们对帮助文档中的示例程序进行照猫画虎的改写:
{
if (Pstream::parRun())
{
string s1 , s2;
int source = 0;//源头处理器
int destination = 1;//目的地处理器
PstreamBuffers pBuffers(Pstream::commsTypes::nonBlocking);
if (Pstream::myProcNo() == source)
{
Pout << "这是处理器 No:" << Pstream::myProcNo() << endl;
string s1 = "安警官新年快乐!";
Pout << s1 << endl;
UOPstream send(destination , pBuffers);
send << s1;
Pout << "信息已发送!" << endl;
Pout << "==============================" << endl;
}
pBuffers.finishedSends();
PstreamBuffers pBuffers_1(Pstream::commsTypes::nonBlocking);
if (Pstream::myProcNo() == destination)
{
UIPstream recv(source , pBuffers);
recv >> s1;
if (s1 == "安警官新年快乐!")
{
Pout << "这是处理器 No:" << Pstream::myProcNo() << endl;
Pout << "收到信息!" << endl;
s2 = "心明眼亮,平平安安";
}
UOPstream send(source , pBuffers_1);
send << s2;
Pout << "信息已回复!" << endl;
Pout << "==============================" << endl;
}
pBuffers_1.finishedSends();
if (Pstream::myProcNo() == source)
{
UIPstream recv(destination , pBuffers_1);
recv >> s2;
Pout << "这是处理器 No:" << Pstream::myProcNo() << endl;
Pout << s2 << endl;
}
}
}
以下是输出结果:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
[0] 这是处理器 No:0
[0] "安警官新年快乐!"
[0] 信息已发送!
[0] ==============================
[1] 这是处理器 No:1
[1] 收到信息!
[1] 信息已回复!
[1] ==============================
[0] 这是处理器 No:0
[0] "心明眼亮,平平安安"
ExecutionTime = 0.08 s ClockTime = 0 s
End
Finalising parallel run
至此完成了openfoam体系内的简单处理器之间的通信,过几天找时间再写下如何像微信一样群发数据,尽量用类模板去写,无论是文件、语音或者是文字图片,都可以在核与核之间沟通
结语
确实科研之路踽踽独行,闲着没事写段程序让处理器之间相互问候倒是成了一个小乐趣,大家有时间可以试试
一起探索openfoam也是相当有趣的一件事,非常欢迎私信讨论
指正的价值要比打赏更重要,下面是个人联系方式,希望能结交到志同道合的朋友

openfoam并行通信探索(一)的更多相关文章
- 并行通信芯片8255A学习总结
并行通信接口8255A AB口为两个数据端口,C口可以作为数据端口也可以作为状态端口 8255A是一个40引脚的双列直插式芯片 引脚如下 D0-D7:双向数据信号线. RD:读信号线. WR:写信号线 ...
- Java内部类和外部类的通信探索
1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...
- 【C51】UART串口通信
我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑, 单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...
- 十天学会单片机Day4串行口通信
并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...
- ARM学习笔记15——串口通信基本原理【转】
计算机串口基本理论 1.什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要 ...
- RS-232通信原理
rs232串口通信原理 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆).大多数计算机包含两个基于RS232的串口.串口同时也是仪器 ...
- Dubbo底层采用Socket进行通信详解
由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n 通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...
- 集群RPC通信
RPC即远程过程调用,它的提出旨在消除通信细节.屏蔽繁杂且易错的底层网络通信操作,像调用本地服务一般地调用远程服务,让业务开发者更多关注业务开发而不必考虑网络.硬件.系统的异构复杂环境. 先看看集群中 ...
- winform SerialPort串口通信问题
一.串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串 ...
- [转]C#串口通信 SerialPort类
本文转自:https://blog.csdn.net/weixin_41415541/article/details/80921956 因为公司项目需要将USB扫码枪改为串口扫码枪,串口扫码的好处在于 ...
随机推荐
- 1903021126-申文骏 实验一 19信计java-Markdown排版
项目 内容 课程班级博客链接 19级信计班 作业要求链接 实验一 课程学习目标 大致学会Markdown排版 任务1:在博客园平台注册个人博客账号和加入班级博客 注册了博客园的个人账号,提交了博客申请 ...
- 利用python-pptx包批量修改ppt格式
最近实习需要对若干ppt进行格式上的调整,主要就是将标题的位置.对齐方式.字体等统一,人工修改又麻烦又容易错. 因此结合网上的pptx包资料,使用python脚本完成处理. 主要的坑点在于,shape ...
- k8s集群查看node和pod的实时资源使用情况
一.部署步骤 1.准备metrics-server官方yaml文件 2.部署metrics-server 3.查看资源使用情况 二.准备metrics-server官方yaml文件 [root@loc ...
- ubuntu14搭建内网gitlab服务器
平台 宿主机系统版本:Ubuntu 14.04.5 LTS gitlab软件版本:11.10.8-ee 验证web浏览器版本:Mozilla Firefox 68.3.0esr 安装firefox浏览 ...
- The first blog
这是一只爱碎觉的汪的第一篇博客. 下面就来简单介绍一下自己吧,爱好广泛,尤其热爱钢琴和运动,喜欢每个按键在手指间跳动的感觉,喜欢一个个音符连起来奏响的一曲曲优美的音乐,也喜欢运动后大汗淋漓的畅快感.肯 ...
- 安装 TensorFlow 参考过的资料
anaconda 的新环境创建 https://blog.csdn.net/yandajiangjun/article/details/102615912
- linux 获取文件名
https://blog.csdn.net/liuyuedechuchu/article/details/123778605
- Markdown基础语法练习
Markdown语法学习 标题 三级标题 四级标题 字体 hello,world! 两端各两个*****号 hello,world! 两端各一个*****号 hello,world! 两端各三个*** ...
- CGAL5.0.2 CMake过程记录
Zlib的INCLUDE_DIR 找到了,但是release_LIBRARY没有找到.不过没有影响generate. 打开build文件夹的CGAL.sln 文件,ALL_BUILD 生成,成功. 最 ...
- python语言linux操作系统oracle环境安装
金句:如果没把握,最好先Google一下. 1.严格按照 https://oracle.github.io/odpi/doc/installation.html#linux 教程一步步做 包括下载的软 ...