【发布时间】: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