c++ - 三任务并​​行计算

标签 c++ parallel-processing c++14

我有一个循环经历了数千万个循环,每个循环对应于我正在读取的一行数据文件。循环内有三个顺序计算。粗略地说,我们可以将它们标记为 (a) 读取数据,(b) 处理数据,(c) 累积结果。 (a)、(b) 和 (c) 分别花费大约相同的时间。 (b) 取决于 (a),而 (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完成后才能开始
  • 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/

相关文章:

C++:设计数据结构来存储多键对象集,以便能够收集和遍历该集的超平面

parallel-processing - 在 Perl 6 中需要简单的并行示例

python - 为什么这段代码不能在并行 python 中工作

c++ - std::enable_if 和通用引用的使用差异

c++ - 虚拟析构函数改变 decltype 的行为

c++ - 当期望很长时函数返回 double

C++ 模板元编程特化歧义

c++ - 如何指定对 const 指针的 const 引用?

c++ - 如何使系统托盘图标在多个桌面上可见?

python - numpy 中的并行数组操作