引入

面对需要模拟非常多粒子时,如果只使用单线程进行模拟,就会非常非常缓慢,会出现“一核有难,九核围观”的场景,且只是用单线程也无法享受到使用服务器的大规模并行加速。所以解决问题的关键是启用多线程。

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 多线程问题(尝试解决)相关推荐

  1. Java中多线程访问冲突的解决方式

    Java中多线程访问冲突的解决方式 当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题 ...

  2. 【Win10 尝试解决】Win10文件资源管理器无限挂起重启

    1.问题描述: win10系统,电脑桌面不停闪烁,下面任务栏消失,窗口消失. ctrl+shift+Esc,打开任务管理器,发现文件资源管理器疯狂挂载.重启. 2.解决方法? 强烈建议暂时恢复之后,尽 ...

  3. 群晖网络不通_尝试解决:群晖使用Zerotier内网穿透出现错误

    尝试解决:群晖使用Zerotier内网穿透出现错误 2019-05-31 16:27:24 6点赞 38收藏 26评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最新一届#装机大 ...

  4. EA app“读取时间比平时更久,请在我们尝试解决该问题时耐心等待”解决方法汇总

    ​ EA app最近刚替代了EA以前的origin平台,也是问题不断.下面看一下当EA app出现"读取时间比平时更久,请在我们尝试解决该问题时耐心等待."时的解决方法吧. EA ...

  5. Mycat读写分离失败(一主一从)尝试解决

    项目场景:Mycat读写分离失败(一主一从) 问题描述 主从数据库关联完之后,对mycat的配置也完成了,可能由于我没有一次性成功修改 /usr/local/mycat/conf/schema.xml ...

  6. HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较

    转载于:http://www.cnblogs.com/wgp13x/p/4245182.html 摘要:   在前篇博客里已经讲述了通过一个自定义 HBase Filter来获取数据的办法,在末尾指出 ...

  7. 【发现】ASP.NET DEVELOPMENT SERVER 未能开始侦听端口xxxxx以一种访问权限不允许的方式做了一个访问套接字的尝试——解决方法...

    在调试ASP.NET的时候常出现如下错误 错误消息框:   ASP.NET   DEVELOPMENT   SERVER   未能开始侦听端口xxxxx以一种访问权限不允许的方式做了一个访问套接字的尝 ...

  8. 【JAVA多线程】如何解决一个生产者与消费者问题

    如何解决一个生产者与消费者问题 生产者与消费者问题是多线程同步的一个经典问题.生产者和消费者同时使用一块缓冲区,生产者生产商品放入缓冲区,消费者从缓冲区中取出商品.我们需要保证的是,当缓冲区满时,生产 ...

  9. 问题解决:尝试解决maven依赖找不到的n种姿势

    文章目录 问题场景 问题环境 问题原因 解决方案 结果 总结 参考链接 吐槽 随缘求赞 问题场景 公司的原仓库出了问题,需要更换新的仓库.故给了一个新的仓库地址.但是奇葩的是,更换之后,就出问题了.比 ...

最新文章

  1. sudo找不到命令:修改sudo的PATH路径
  2. UITextField 详解
  3. poj 1033 Defragment
  4. mysql 修改配置生效_MySQL修改my.cnf配置不生效的解决方法
  5. blender怎么移动骨骼_日本这款人形机器人竟是多个机器人乐队的前辈!拥有人类骨骼,还会击鼓...
  6. C++十进制数转换为二进制表示的算法(附完整源码)
  7. PHPStorm开启Debug
  8. tensflow andaconda 方式的安装
  9. [Ext JS 4] 实战之Grid, Tree Gird编辑Cell
  10. QTP连接sqlserver
  11. Sikuli -- 创新的图形化编程技术
  12. Linux网络属性及其配置
  13. 淘晶驰串口屏常见问题及解决方法
  14. win10 更新计算机时间,win10下如何更改系统更新时间和更新方式?win10设置系统更新时间和更新方式的技巧...
  15. logistic回归分析优点_逻辑回归算法的优缺点
  16. 9x9九宫格java_数独9x9九宫格的口诀 9×9数独技巧
  17. jle汇编_JNB, JBE, JGE, JLE 指令的转移条件 5
  18. 从BlueSky.h和BlueSky.cpp到BlueSky.out的那些事儿
  19. 2021前端面试经典计算题总结。
  20. 国家鼓励的软件企业定期减免企业所得税

热门文章

  1. 如何给老婆解释什么是 Master-Slave
  2. UESTC1712 七夜雪寂,一世人心(SG)
  3. Apache Log4j2远程代码执行漏洞(CVE-2021-44228)
  4. php加解密易语言源码,易语言PHP加密源码
  5. CHEER UP 谐音版
  6. SurfaceView实战打造农药钻石夺宝
  7. uniapp图片自适应_uniapp 仿微信朋友圈,微博晒图 图片自适应排版
  8. 解决SQLServer,MSDB(恢复挂起)的问题
  9. 程序员高薪“盛宴”背后:人才结构性过剩和缺失共存
  10. 【移动开发】2022 年 12 大移动应用程序开发趋势