Geant4 多线程问题(尝试解决)
引入
面对需要模拟非常多粒子时,如果只使用单线程进行模拟,就会非常非常缓慢,会出现“一核有难,九核围观”的场景,且只是用单线程也无法享受到使用服务器的大规模并行加速。所以解决问题的关键是启用多线程。
Geant4使用多线程最简单的方法是手动多线程,即开多个终端,独立运行多个Geant4程序来手动实现并行。但这样做无疑是不优雅的,并且Geant4内置有多线程的功能,那怎么才能用好这一功能呢?
困难
多线程难在资源共享和结果合并。
最大的困难在于对线程间共享资源的访问,而这有又两个层次:
- 同一个Run中,不同线程同时写入同一个变量
- 不同Run(有的线程跑的快有的慢一点)同时进行初始化
其次的困难在于数据合并,如何把不同线程的数据合并为一个文件也是需要考虑的事情。
后面这个关于数据合并的问题,可以参考 这篇博客,以及Geant4自带的Analysis类 进行解决。
本文主要对第一个问题,尽量给出一点点参考。
思路
要想理清楚如何进行多线程编程,首先要大概弄明白Geant4的多线程模型。Geant4的并行操作是针对于同一个Run的,即一个Run内,可以生成多个线程来进行模拟。这些线程分为两类:主线程(master,只有一个,不会实际进行模拟),工作线程(worker,就是指定多线程的数量,实际干活的线程)。每一个线程都会完整执行一遍RunAction的全部内容。
Geant4官方建议的编程思路是:工作线程干活,并在EndOfRunAction中将数据并入主线程中;主线程汇总数据并写入到文件(硬盘)上。【判断主线程的方法是执行 IsMaster(),可以参考这】
按照这个思路编写程序,就可以解决第一个层次的资源共享,以及结果合并问题。如果只按照这套思路进行编程,那么可能会撞到第二个坑:不同Run同时初始化。
为此,笔者没有找到Geant4官方参考进行解答,只能想出野路子来解决这个问题,是这样做的:
在Run初始化的时候,加一个判断语句:如果没有初始化,那么初始化。
虽然思路简单,但是有效。
其他建议
定位错误
参考这篇,使用GDB来找到Gean4中段错误的具体行
给程序加锁,参考官方指南和这篇,不过笔者没能成功
官方参考
Geant4官方指南:Parallelism in Geant4: multi-threading capabilities
Geant4 多线程问题(尝试解决)相关推荐
- Java中多线程访问冲突的解决方式
Java中多线程访问冲突的解决方式 当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题 ...
- 【Win10 尝试解决】Win10文件资源管理器无限挂起重启
1.问题描述: win10系统,电脑桌面不停闪烁,下面任务栏消失,窗口消失. ctrl+shift+Esc,打开任务管理器,发现文件资源管理器疯狂挂载.重启. 2.解决方法? 强烈建议暂时恢复之后,尽 ...
- 群晖网络不通_尝试解决:群晖使用Zerotier内网穿透出现错误
尝试解决:群晖使用Zerotier内网穿透出现错误 2019-05-31 16:27:24 6点赞 38收藏 26评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最新一届#装机大 ...
- EA app“读取时间比平时更久,请在我们尝试解决该问题时耐心等待”解决方法汇总
EA app最近刚替代了EA以前的origin平台,也是问题不断.下面看一下当EA app出现"读取时间比平时更久,请在我们尝试解决该问题时耐心等待."时的解决方法吧. EA ...
- Mycat读写分离失败(一主一从)尝试解决
项目场景:Mycat读写分离失败(一主一从) 问题描述 主从数据库关联完之后,对mycat的配置也完成了,可能由于我没有一次性成功修改 /usr/local/mycat/conf/schema.xml ...
- HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较
转载于:http://www.cnblogs.com/wgp13x/p/4245182.html 摘要: 在前篇博客里已经讲述了通过一个自定义 HBase Filter来获取数据的办法,在末尾指出 ...
- 【发现】ASP.NET DEVELOPMENT SERVER 未能开始侦听端口xxxxx以一种访问权限不允许的方式做了一个访问套接字的尝试——解决方法...
在调试ASP.NET的时候常出现如下错误 错误消息框: ASP.NET DEVELOPMENT SERVER 未能开始侦听端口xxxxx以一种访问权限不允许的方式做了一个访问套接字的尝 ...
- 【JAVA多线程】如何解决一个生产者与消费者问题
如何解决一个生产者与消费者问题 生产者与消费者问题是多线程同步的一个经典问题.生产者和消费者同时使用一块缓冲区,生产者生产商品放入缓冲区,消费者从缓冲区中取出商品.我们需要保证的是,当缓冲区满时,生产 ...
- 问题解决:尝试解决maven依赖找不到的n种姿势
文章目录 问题场景 问题环境 问题原因 解决方案 结果 总结 参考链接 吐槽 随缘求赞 问题场景 公司的原仓库出了问题,需要更换新的仓库.故给了一个新的仓库地址.但是奇葩的是,更换之后,就出问题了.比 ...
最新文章
- sudo找不到命令:修改sudo的PATH路径
- UITextField 详解
- poj 1033 Defragment
- mysql 修改配置生效_MySQL修改my.cnf配置不生效的解决方法
- blender怎么移动骨骼_日本这款人形机器人竟是多个机器人乐队的前辈!拥有人类骨骼,还会击鼓...
- C++十进制数转换为二进制表示的算法(附完整源码)
- PHPStorm开启Debug
- tensflow andaconda 方式的安装
- [Ext JS 4] 实战之Grid, Tree Gird编辑Cell
- QTP连接sqlserver
- Sikuli -- 创新的图形化编程技术
- Linux网络属性及其配置
- 淘晶驰串口屏常见问题及解决方法
- win10 更新计算机时间,win10下如何更改系统更新时间和更新方式?win10设置系统更新时间和更新方式的技巧...
- logistic回归分析优点_逻辑回归算法的优缺点
- 9x9九宫格java_数独9x9九宫格的口诀 9×9数独技巧
- jle汇编_JNB, JBE, JGE, JLE 指令的转移条件 5
- 从BlueSky.h和BlueSky.cpp到BlueSky.out的那些事儿
- 2021前端面试经典计算题总结。
- 国家鼓励的软件企业定期减免企业所得税
热门文章
- 如何给老婆解释什么是 Master-Slave
- UESTC1712 七夜雪寂,一世人心(SG)
- Apache Log4j2远程代码执行漏洞(CVE-2021-44228)
- php加解密易语言源码,易语言PHP加密源码
- CHEER UP 谐音版
- SurfaceView实战打造农药钻石夺宝
- uniapp图片自适应_uniapp 仿微信朋友圈,微博晒图 图片自适应排版
- 解决SQLServer,MSDB(恢复挂起)的问题
- 程序员高薪“盛宴”背后:人才结构性过剩和缺失共存
- 【移动开发】2022 年 12 大移动应用程序开发趋势