三任务并行计算

Three task parallel computation

本文关键字:并行计算 任务      更新时间:2023-10-16

我有一个循环,它经历了数千万个循环,每个循环对应于我正在读取的一行数据文件。循环中有三个顺序计算。粗略地说,我们可以给它们贴上标签(a)读取数据,(b)处理数据,(c)累积结果。(a) ,(b)和(c)分别花费大约相同的时间。(b) 并且(c)取决于(a)和(b)。我认为,如果我让程序在3个线程中运行,每个线程都落后于它的邻居一次计算,我可以获得大约3倍的加速。不幸的是,我不熟悉多线程。

我对设计的看法是这样的:

  1. 第一个读取行n(a)
  2. 当这样做时,第一线程处理行(b),同时第二线程读取行n+1
  3. 当第二个线程完成了对行n+1的读取时,它开始处理它,第三个线程读取行n+2。如果第一个线程用(b)完成,则它在(c)上移动

换句话说,步骤顺序如下:

1a
1b 2a
1c 2b 3a
1a 2c 3b
1b 2a 3c
1c 2b 3a

等等

所以,一行总是停留在同一个线程上。下一个线程在处理完自己的行后开始一个新行,另外两个线程已经读取了前两行。

有人能帮我设置一下吗?这些是唯一的限制:

  • b_n只能在a_n完成时启动
  • c_n只能在b_n完成时启动
  • aN只能在完成a(n-1)和a(n-2)时启动(因为我们有3个线程,按顺序读取更快)

我也知道每个线程都必须有独立的存储。

忘了提一下:每一行都是完全独立处理的。

假设questiom可以被重新表述为"如何提高程序性能",并且该文件是驻留在硬盘上的顺序文件:

不要逐个读取记录,而是将许多(比如1000000)记录作为一大块数据读取,然后从缓冲区中检索记录进行处理。

在i5-3220M CPU、8GB RAM和SSD驱动器的系统上使用编译的C程序进行的一个小测试:

逐个读取一个由1400万条80字节记录组成的文件大约需要15秒,而以1000000条记录为块读取文件则只需要亚秒。

如果机械磁盘的相对改进更大,我不会感到惊讶。

如果多线程处理方法的好处不能证明其开发成本合理,我也不会感到惊讶。