我有一个循环经历了数千万个循环,每个循环对应于我正在读取的一行数据文件。循环内有三个顺序计算。粗略地说,我们可以将它们标记为 (a) 读取数据,(b) 处理数据,(c) 累积结果。 (a)、(b) 和 (c) 分别花费大约相同的时间。 (b) 取决于 (a),而 (c) 取决于 (a) 和 (b)。我认为如果我让程序在 3 个线程中运行,每个线程都落后于它的邻居的一个计算,我可以获得大约 3 倍的加速。不幸的是,我不熟悉多线程。
我对设计的看法是这样的:
- 首先读取第
n
行(a); - 完成后,第一个线程处理行 (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_(n-2) 完成时开始(因为我们有 3 个线程,顺序读取速度更快)
我也明白每个线程都必须有独立的存储。
忘了说:每一行都是完全独立处理的。
最佳答案
假设问题可以改写为“如何提高程序性能”,并且文件是驻留在硬盘上的顺序文件:
不是逐条读取,而是读取很多条(比如1000000条)记录作为一大块数据,然后从缓冲区中取出记录进行处理。
在具有 i5-3220M CPU 和 8GB RAM 和 SSD 驱动器的系统上使用编译的 C 程序进行的小测试:
逐条读取包含 1400 万条 80 字节记录的文件大约需要 15 秒,而读取包含 1000000 条记录的文件 block 仅需亚秒级。
如果机械磁盘的相对改进更大,我不会感到惊讶。
如果多线程处理方法的好处无法抵消其开发成本,我也不会感到惊讶。
关于c++ - 三任务并行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580472/