前言

最近在忙,快一两周没更新了,今天说下如何实现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并行通信探索(一)的更多相关文章

  1. 并行通信芯片8255A学习总结

    并行通信接口8255A AB口为两个数据端口,C口可以作为数据端口也可以作为状态端口 8255A是一个40引脚的双列直插式芯片 引脚如下 D0-D7:双向数据信号线. RD:读信号线. WR:写信号线 ...

  2. Java内部类和外部类的通信探索

    1.内部类访问外部类的成员和方法 在内部类中,可以无障碍地访问外部类的所有成员和方法. 在下面的实验代码中,可以看到,内部类sl可以访问外部类的私有成员:sz 和 cur. 同时可以访问私有方法:pr ...

  3. 【C51】UART串口通信

    我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑,  单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...

  4. 十天学会单片机Day4串行口通信

    并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...

  5. ARM学习笔记15——串口通信基本原理【转】

    计算机串口基本理论 1.什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要 ...

  6. RS-232通信原理

    rs232串口通信原理 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆).大多数计算机包含两个基于RS232的串口.串口同时也是仪器 ...

  7. Dubbo底层采用Socket进行通信详解

    由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...

  8. 集群RPC通信

    RPC即远程过程调用,它的提出旨在消除通信细节.屏蔽繁杂且易错的底层网络通信操作,像调用本地服务一般地调用远程服务,让业务开发者更多关注业务开发而不必考虑网络.硬件.系统的异构复杂环境. 先看看集群中 ...

  9. winform SerialPort串口通信问题

    一.串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串 ...

  10. [转]C#串口通信 SerialPort类

    本文转自:https://blog.csdn.net/weixin_41415541/article/details/80921956 因为公司项目需要将USB扫码枪改为串口扫码枪,串口扫码的好处在于 ...

随机推荐

  1. 替代学习物联网-云服务-03腾讯云MQTT

    1.登录(利用微信) https://console.cloud.tencent.com/iothub 2.新建产品 3.添加设备 4.设备详细参数 域名IP固定: iotcloud-mqtt.gz. ...

  2. secureCRT设置配色方案

    https://blog.csdn.net/qq_42672770/article/details/81301494

  3. 保护IIS Web服务器安全的技巧

    首先,开发一套安全策略 保护Web服务器的第一步是确保网络管理员清楚安全策略中的每一项制度.如果公司高层没有把服务器的安全看作是必须被保护的资产,那么保护工作是完全没有意义的.这项工作需要长期的努力. ...

  4. 在windows下使用dbus

    介绍 DBUS是一种很方便的IPC远程调用的通信机制.可以很方便地调用其他进程提供的函数,甚至是不同计算机上提供的函数,内部通过TCP套接字进行相互通信. 不过甚至你可以修改成其他通信方式,比如USB ...

  5. pycharm cv2 的方法不能智能提示

    按住ctrl,光标放在cv2上,就能跳转到cv2的__init__.py文件 全选,按Ctrl+/注释掉所有语句,然后将如下语句添加到__init__.py中 import sys import os ...

  6. 基于uniapp框架开发飞书小程序总结

    前期准备 飞书官方客户端文档:https://open.feishu.cn/document/home/intro 飞书官方工具资源文档:https://open.feishu.cn/document ...

  7. DML操作数据

    添加数据 insert into 表名(列的名称)(数据);ps:列的名称用`  `包围可以减少出错 添加全部数据的时候可以把列的名称省略: 修改数据 update 表名  set 列名=数据,列名= ...

  8. vue 3.0 引入swiper 8 direction不生效

    需要手动给元素高度  <swiper         class="my-swiper"         :modules="modules"       ...

  9. error: You must be logged in to the server (Unauthorized) 问题处理

    故障现象: 执行kubectl 命令时: 提示"error: You must be logged in to the server (Unauthorized)" 分析: 权限问 ...

  10. CSS 语法-习惯代码书写风格

    代码风格是实际开发中的书写方式,并非强制标准. CSS 样式格式: 展开格式:开发过程使用,代码可读性强,便于调错. 紧凑格式:上传服务器时使用,减少不必要的空白字符,压缩文件大小,利于传输. 代码压 ...