C++#pragma OMP并行:大任务或小任务

c++ #pragma omp parallel: big tasks or small ones?

本文关键字:任务 OMP 并行 C++#pragma      更新时间:2023-10-16

我的程序逐行读取文本文件,提取每行中特定类型的单词(在哪一行中找到单词很重要)。哪个更好,按文件分隔线程(每个线程将读取不同的文件)或按行分隔它们(每个线程将从同一文件中读取不同的行)?

除非您有多个硬盘驱动器,否则可能两者都没有。

硬盘驱动器本质上是单线程的,也就是说,它在任何给定时间只产生单个数据流。对于带有旋转光盘的实际硬盘驱动器和一个在光盘周围寻找的磁头,您的最佳吞吐量通常来自顺序读取。在文件中或在单独的文件之间搜索到不同的位置可能会大大降低吞吐量。

如果您确实有多个驱动器,那么这将取决于您的数据在驱动器上的分布方式,但理想情况下,您可能需要一个专用于从每个物理驱动器读取数据的线程。

如果在读取数据后对数据进行了足够的处理,则可以让单个线程读取数据,并将该数据放入某种线程安全队列中。从那里,您可以处理单个数据项,处理它们,并将结果写入...无论您想要输出在哪里。

如果要回到一个文件(或多个文件),你可能或多或少地想要相反的情况:单个线程将输出写入每个结果光盘,并且处理线程将其数据存放在某种队列中。在典型情况下,这将是一个优先级队列,按数据写入输出文件的顺序排序,因此输出线程始终按顺序写入数据。

与性能问题一样,您可能应该尝试两者并在可行的情况下进行测量。但这是我的直觉所说的:

如果文件具有相似的大小/处理时间相似,则最好为每个线程提供自己的文件。

许多线程访问一个文件可能只有在计算时间主导文件 IO 时间时才值得。

但同样,你应该衡量。对性能的猜测经常出错。正如@Jerry Coffin 指出的那样,很可能两者都不会帮助您,但另一方面,文件可能已经预加载到 RAM 中,在这种情况下,这一点可能适用,也可能不适用(完全扩展)。真的,试试看。这是一个广泛的领域,很难预测。

取决于文件

数和每个文件有多少行。

如果每个文件中的行相对较少,则并行化将不值得开销。如果您处理的文件相对较少,情况也是如此。

总是可以并行两者。