2017-01-10 150 views
1

我有一个循环经历了数千万个周期,每个周期对应于我正在阅读的一行数据文件。循环内有三个连续的计算。松散地说,我们可以标记它们(a)读取数据,(b)处理数据,(c)累积结果。 (a),(b)和(c)分别采取大致相同的时间。 (b)取决于(a)和(c)取决于(a)和(b)。我认为,如果我让程序在3个线程中运行,每个线程都由它的邻居进行一次计算,那么我可以获得大约3倍的加速比。不幸的是,我不熟悉多线程。三任务并行计算

我看到的设计是这样的方式:

  1. 第一读取行n(一);
  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完成
  • A_N只能启动时A_(N-1)和A_(正2)完成(因为我们有3个线程,并且顺序读取更快)

我也明白每个线程都必须有独立的存储空间。

忘了提及:每行都完全独立处理。

+1

除了我的澄清问题。除非你的每行计算是CPU密集型的,否则你的瓶颈将会读取文件,你不可能获得任何显着的并发性。 (多线程的目的是并发性的,它不会“加速”任何事情。) –

+0

正如我所提到的,(a),(b)和(c)需要大致相同的时间。实际上,(a)是阅读部分,比(b)少一点。 – SU3

+3

与使用多个线程读取同一文件相比,使用单个线程专用于读取文件并将数据置于另一个线程的处理队列上可能更好。基本上是对工作进行管道铺设。 –

回答

1

假设questiom可表述为“如何提高程序性能”,并认为该文件是驻留在硬盘上的顺序文件:

不要读取记录记录,但看了很多(比如1000000)记录为一大块数据,然后从缓冲区中检索记录进行处理。

与i5-3220M的CPU和8GB内存和SSD驱动器的系统上的一个小测试与编译的C程序:

读1400万个80字节记录的文件一个通过前后花了15秒,而读大约1000000条记录中的文件仅为亚秒。

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

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