- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
最近在忙,快一两周没更新了,今天简单说下如何实现openfoam内的并行通信 。
说到并行通信倒不必恐慌,只是不同核之间数据传递,比如说咱们仿真开16个核,3号计算单元对4号计算单元说句”hello“,然后4号再回复”hi“,类似这样 。
是不是很像不同的微信号传递消息, 其实咱们每个个体对于整个社会而言也是不同的核 。
假如现在我开个工厂,并行开16个核可以打比方作为我这个厂子有16个工人 咱这个厂子对于我们仿真工作者来说就是生产海量的数据 为了让工厂的效率最高,兄弟们需要心往一处使,力往一处用 。
如何让大家齐心合力,靠的是沟通 大家有没有发现最近几十年生活节奏越来越快了,这是因为我们的通信成本越来越低了 因为有了信息传输更及时有效,社会分工越来越细致,整个社会的效率也越来越高 。
我们如果想把我们的仿真效率提上一个层次,必须要实现核与核之间的信息传输,让仿真分工更细致,弟兄们齐心协力生产数据 。
我们首先想下用微信把消息发送出去需要几步 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并行通信探索(一)的文章就讲到这里了,如果你想了解更多关于openfoam并行通信探索(一)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
接上篇 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制 前些天写了两篇关于C# async await异步的博客, 第一篇博客看的人多,点
前言 在 SwiftUI 中,我们可以通过添加不同的交互来使我们的应用程序更具交互性,这些交互可以响应我们的点击,点击和滑动。 今天,我们将回顾SwiftUI基本手势:
今年我一直在想,2022年我想做些什么,做哪方面的改变,这周末在家终于想到了! 2021 轻描淡写 年底就一直想对2021年写一篇总结的,起码不得写个千八百字,可是思来想去不知道怎么写,直到最后都没想
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
在 Eclipse 中使用 Java 进行开发时,它非常方便:您可以像自己一样附加源代码并探索核心 Java 代码。在 Visual Studio 中,我知道只有在调试时才能查看 .net 源代码(我
我正在尝试创建自己的字符串数据类型,谁能告诉我 typedef 和初始化做错了什么。 #include #include typedef char string[10]; int main(){
我期待开发一些东西来分析在服务器上运行的应用程序的 JVM 线程,要求如下: 访问在单独应用程序中运行的所有线程 打印线程栈 了解事件的详细信息 - 记录执行时间和方法详细信息(在特定线程中执行) 我
是否可以探索 Android 内部存储?我需要这个用于调试目的,以帮助我的开发工作。 最佳答案 您可以在模拟器上,或在 Root设备上。只是 adb shell 连接设备,然后从那里导航。 关于and
我有一个使用大量外键的 innoDB 表,但我们只想从中查找一些基本信息。 我做了一些研究,但还是迷路了。 如何判断我的主机是否有 Sphinx已经安装了吗?我没看到作为表格存储的选项方法(即 inn
我有一个创建列表的 GWT 代码(作为结果的网格),我将样式设置为 CSS 类,如 .test tr { height: 26px; } 现在...如果在渲染未完成或网格没有元素时我需要从代码
我需要使用 Javascript 和 HTML 为 Rally 敏捷工具开发一个 View 。我没有处理过在我作为开发人员的新职业中经常使用的网络语言。 我只是在探索他们的 API,但不知道如何探索他
我想了解 Hadoop 而不是一个黑盒子。我想探索 Hadoop 代码本身。我怎样才能不从主干下载 bundle ,我应该从哪里开始?任何帮助都会很有帮助谢谢舒佳特 最佳答案 Hadoop 代码在 S
想象一下这样的情况。您获得了一些遗留代码或获得了一些新框架。您需要尽快调查并了解如何使用此代码。没有机会向以前的开发人员寻求帮助。什么是最佳实践/方法/方式/步骤/工具(首选 .NET Framewo
我注意到我的 git 存储库中的某些 makefile 缺少变量定义的问题,我想搜索所有提交历史以查找我的变量 TESTDIR 在变更集中出现的位置 我该怎么做? 干杯 最佳答案 你可以使用 git
有什么方法可以探索 GO 包吗? 在 java 中,我使用“javap java.lang.String”命令来查看类内部的方法。像这样,有没有命令是他们用 GO 语言写的? 我在谷歌中搜索了相同的内
我注意到 docker 我需要了解容器内发生了什么或其中存在哪些文件。一个示例是从 docker 索引下载图像 - 您不知道图像包含什么,因此无法启动应用程序。 理想的情况是能够通过 ss
近日,华为 分析服务 6.9.0版本发布,正式上线 探索能力 。开发者可自由定义与配置分析模型,支持报告实时预览,数据洞察体验更加灵活与便捷. 新上线的探索能力中,有漏斗分析、事件归因、会话路径分析
我有一个 4 列的 excel 2010 电子表格。 A 列:我销售的产品的 UPC 代码列表。大约300行。 B 列:公式(稍后会详细介绍) C 列:另一个 UPC 代码列表。这些 UPC 代码大约
我有 3 个表格如下: CREATE TABLE USER_STATUS ("UID" varchar2(7), "STAT_ID" varchar2(11)) ; INSERT ALL IN
有什么方法可以探索 java 脚本对象(如 telerik 菜单或任何其他第 3 方对象)的属性和/或功能?我可以通过调试和破坏然后在 watch 中添加对象或在 VS 中使用智能感知来实现。 我使用
我是一名优秀的程序员,十分优秀!