【问题标题】:How to make best use of multithreading with monte carlo simulations?如何通过蒙特卡罗模拟充分利用多线程?
【发布时间】:2023-03-08 19:36:01
【问题描述】:

我正在编写代码来使用蒙特卡罗模拟的基础来对模拟算法进行基准测试 - 所以我正在生成一个随机系统(只是一个整数)并在随机生成的系统上运行模拟算法。我需要多次这样做,虽然这些算法在概念上相对简单,但它们需要几秒钟才能运行,因为它们包含许多循环。

for i=1:number of algorithms
    for i=1:number of repeats
        if algo = 1
            //run the first algorithm [for loops]
        if algo = 2
            //run the second algorithm [while]
        if algo = 3
            //run the third algorithm [while]

每个算法的工作方式不同。第一个算法可以进一步分解为循环多次运行并选择最高分,所以我想即使该算法也可以是多线程的。其他两个制作多线程会复杂得多。

我的问题是如何将程序分成不同的线程。似乎有很多不同的方法可以解决这个问题,而且我对多线程非常陌生,所以我不知道什么是最好的。

选项 1:立即拆分线程并在每个线程上运行不同的算法。

选项 2:使用第二个 for 循环拆分线程,因此重复次数被拆分到不同的线程。

选项 3:尝试将算法步骤分解成可以并行化的更小块

【问题讨论】:

  • 你所说的重复是统计的重复还是实际上不同的参数集?
  • 当然,微不足道的并行化是执行选项 1 或选项 1,两个 for 循环倒置,对我来说看起来更自然:P。尽管如此,这种微不足道的并行化基本上与从 C 代码中取出循环并从脚本启动可执行文件的次数与您拥有的内核一样多。在这种情况下的优点是更加灵活,您也可以将它简单地放在集群中。
  • 但是当然有你的问题的细节。如果不同算法的一个计算时间不同,您将不希望将每个算法放在一个线程中,因为一个线程会更快完成并且您将浪费计算能力/时间。因此,如果是这种情况,选项 2 将不是一个好主意。选项1听起来更好。至于选项 3:好吧,在这里您可能需要做更多的工作,首先估计与选项 1 相比您是否会获得任何优势。
  • @myradio 重复以不同的随机种子开始,但始终使用相同的参数

标签: c multithreading algorithm performance parallel-processing


【解决方案1】:

这取决于每次重复和执行每个算法需要多长时间。假设每次重复都与其他重复相同(对于每个特定算法),最有可能这种情况的最好方法是将外部 for 简单地拆分到不同的线程中(切换两个 for 循环以使重复花费相同的时间)。

在不同的线程中运行每个算法没有任何优势,因为算法不会花费完全相同的时间,最终会浪费计算能力。

对于这样的情况,选项 3 听起来不太可能。除了您必须考虑并制作一个更复杂的程序这一事实之外,我怀疑您是否可以从并行化算法的不同部分中获得一些东西,而且我认为代码更有可能由于不同的线程而变慢必须互相等待。

作为旁注,正如我在 cmets 中所说,对于这种非常简单的并行化案例,我建议您考虑在 C 代码之外但在 shell 脚本中拆分运行。您启动的每个作业都将在不同的核心中运行,您将获得很大的灵活性。您还可以在几乎没有任何变化的情况下在集群中运行。

【讨论】:

  • 如何使用 shell 脚本多次运行同一个脚本?
  • 如果你的算法是用 C 语言编写的,那么你可以从 shell 脚本运行可执行的二进制文件。您可以在脚本的 for 循环中运行 ./binary.exe &,它不会等待它完成(由于 &)。它不需要是二进制可执行文件(我说是因为你使用了 c 标签),你可以在 shell 中用任何可执行文件(包括 matlab,因为这似乎是你的代码)替换 ./binary.exe .但我想这有点超出了问题的范围。
  • 所以& 告诉脚本并行运行它?它会自动在不同的线程上运行吗?我是用 C 写的,我提供的代码只是伪代码。
  • 没有。 & 只是让您在脚本中执行命令并将其发送到后台,而不是等待它完成。如果您将./binary.exe 放入脚本的循环中,则脚本的每次迭代都将等待程序完成,而将& 放入允许您在后台运行它,让脚本进入下一次迭代。是的,如果您多次运行相同的(单核)可执行文件,操作系统将尝试将其分发到不同的内核中。您可以通过多次启动可执行文件来测试它并监视系统,这在 unix 中您将使用 top 进行。
  • 您可以提出一个关于使用脚本并行化代码的新问题。另外,如果您认为它回答了您的问题,请随时接受答案^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多