1

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

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:尝试将算法步骤分解为可以并行化的更小块

4

1 回答 1

1

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

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

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

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

于 2018-06-13T16:57:03.020 回答