三任务并行计算
Three task parallel computation
我有一个循环,它经历了数千万个循环,每个循环对应于我正在读取的一行数据文件。循环中有三个顺序计算。粗略地说,我们可以给它们贴上标签(a)读取数据,(b)处理数据,(c)累积结果。(a) ,(b)和(c)分别花费大约相同的时间。(b) 并且(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完成时启动
- aN只能在完成a(n-1)和a(n-2)时启动(因为我们有3个线程,按顺序读取更快)
我也知道每个线程都必须有独立的存储。
忘了提一下:每一行都是完全独立处理的。
假设questiom可以被重新表述为"如何提高程序性能",并且该文件是驻留在硬盘上的顺序文件:
不要逐个读取记录,而是将许多(比如1000000)记录作为一大块数据读取,然后从缓冲区中检索记录进行处理。
在i5-3220M CPU、8GB RAM和SSD驱动器的系统上使用编译的C程序进行的一个小测试:
逐个读取一个由1400万条80字节记录组成的文件大约需要15秒,而以1000000条记录为块读取文件则只需要亚秒。
如果机械磁盘的相对改进更大,我不会感到惊讶。
如果多线程处理方法的好处不能证明其开发成本合理,我也不会感到惊讶。
相关文章:
- 在 Vulkan 中执行并行计算着色器?
- C++ openmp 并行计算计算错误的结果
- 指针警告(并行计算)
- C++:快速/并行计算两个"std::vector<double>"向量之间的L1距离
- 使用C 中的线程并行计算
- 并行计算奇偶校验
- 三任务并行计算
- 使用OpenMP C++并行计算程序的积分
- 并行计算一个大矢量的和
- C++#pragma OMP并行:大任务或小任务
- 用于并行计算的C++代码优化示例
- 通过集成与OpenMP并行计算
- 并行计算--混乱的输出
- 如何在PPL中并行化任务数量可变的任务
- 2个不同的task_group实例没有并行运行任务
- 并行计算内存访问瓶颈
- 并行计算的二次形式在RcppParallel
- 分区是一个类似生活游戏的程序,用于负载平衡的并行计算
- 使用虚幻引擎4进行并行计算
- 编译器本身使用并行计算方法运行