c++ #pragma omp parallel:大任务还是小任务?

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

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

取决于有多少文件以及每个文件有多少行。

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

总是可以将两者并行化。

在性能问题中,您可能应该同时尝试这两种方法,并在可行的情况下进行衡量。但这是我的直觉:

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

只有当计算时间支配文件 IO 时间时,许多线程访问一个文件才值得。

但同样,你应该测量。猜测性能经常出错。由于 @Jerry Coffin ,很可能两者都不会帮助你,但另一方面,文件可能已经 pre-loaded 到 RAM 中,在这种情况下,这一点可能适用也可能不适用(完全扩展).真的,只是试试看。这是一个广阔的领域,很难预测。

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

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

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

如果在读取数据后有足够的处理时间,您可以让一个线程读取数据,并将该数据放入某种 thread-safe 队列中。从那里你有处理线程,这些线程获取单个数据项,处理它们,并将结果写入......任何你想要输出的地方。

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