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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值