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扫码枪改为串口扫码枪,串口扫码的好处在于 ...
随机推荐
- 解决vue 移动端项目“切换页面,页面置顶”后报错为:"TypeError: Cannot set property 'scrollTop' of null"
参考原代码链接:https://www.cnblogs.com/wayneliu007/p/11932204.html 报错截图: 解决方法: 导入的getScrollParent为真返回的null ...
- Selenium+Python上传文件方法大全
转自:https://www.jianshu.com/p/fba37cc5d5e2
- Ribbon负载均衡的实现流程简要分析
SpringCloud中使用Netflix方案做分布式时,只需要在RestTemplate的bean定义上加一个注解@LoadBalanced,无需做其它任何操作就可以开启负载均衡,怎么做到的呢? 不 ...
- 排查占用cpu最高线程
- Educational Codeforces Round 1 个人总结A-E
Educational Codeforces Round 1 A. Tricky Sum 数学,求\(1 \dots n\)的和减去 小于等于n的二次幂乘2之和 LL f[40]; void solv ...
- JRebel4.2 使用之前的激活地址失效,需更改新的激活地址
使用 https://jrebel.qekang.com 会报错 把 https://jrebel.qekang.com 换成 http://idea.javatiku.cn/ ,再进行激活,就ok了
- miou
1. 前言 本文学习记录了机器学习中的分类常见评价指标以及分割中的MIoU. 主要有以下概念:Accuracy, Precision, Recall, Fscore,混淆矩阵,IoU及MIoU. 2. ...
- iview的表格 render
view的表格 render 先看一下效果图 效果题 代码如下 render render:(h,params)=>{} //h指dom对象,params指当前每一行数据(param ...
- 如何找到并使用makecert.exe
如果安装visual studio 后,visual studio command 仍然无法识别 makecert.exe 命令. 则需要手动安装 Windows Software Developm ...
- layui中文离线文档PDF下载
失效链接处理 layui中文离线文档 PDF 下载 本站整理下载: 链接:https://pan.baidu.com/s/18FbllhLEezXTn-y1eiiNKg 提取码:nuqz ...