我有一个循环经历了数千万个周期,每个周期对应于我正在阅读的一行数据文件。循环内有三个连续的计算。松散地说,我们可以标记它们(a)读取数据,(b)处理数据,(c)累积结果。 (a),(b)和(c)分别采取大致相同的时间。 (b)取决于(a)和(c)取决于(a)和(b)。我认为,如果我让程序在3个线程中运行,每个线程都由它的邻居进行一次计算,那么我可以获得大约3倍的加速比。不幸的是,我不熟悉多线程。三任务并行计算
我看到的设计是这样的方式:
- 第一读取行
n
(一); - 完成后,第一个线程处理行(b),同时第二个线程读取行
n+1
; - 当第二个线程完成读取行
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个线程,并且顺序读取更快)
我也明白每个线程都必须有独立的存储空间。
忘了提及:每行都完全独立处理。
除了我的澄清问题。除非你的每行计算是CPU密集型的,否则你的瓶颈将会读取文件,你不可能获得任何显着的并发性。 (多线程的目的是并发性的,它不会“加速”任何事情。) –
正如我所提到的,(a),(b)和(c)需要大致相同的时间。实际上,(a)是阅读部分,比(b)少一点。 – SU3
与使用多个线程读取同一文件相比,使用单个线程专用于读取文件并将数据置于另一个线程的处理队列上可能更好。基本上是对工作进行管道铺设。 –