C++#pragma OMP并行:大任务或小任务
c++ #pragma omp parallel: big tasks or small ones?
我的程序逐行读取文本文件,提取每行中特定类型的单词(在哪一行中找到单词很重要)。哪个更好,按文件分隔线程(每个线程将读取不同的文件)或按行分隔它们(每个线程将从同一文件中读取不同的行)?
除非您有多个硬盘驱动器,否则可能两者都没有。
硬盘驱动器本质上是单线程的,也就是说,它在任何给定时间只产生单个数据流。对于带有旋转光盘的实际硬盘驱动器和一个在光盘周围寻找的磁头,您的最佳吞吐量通常来自顺序读取。在文件中或在单独的文件之间搜索到不同的位置可能会大大降低吞吐量。
如果您确实有多个驱动器,那么这将取决于您的数据在驱动器上的分布方式,但理想情况下,您可能需要一个专用于从每个物理驱动器读取数据的线程。
如果在读取数据后对数据进行了足够的处理,则可以让单个线程读取数据,并将该数据放入某种线程安全队列中。从那里,您可以处理单个数据项,处理它们,并将结果写入...无论您想要输出在哪里。
如果要回到一个文件(或多个文件),你可能或多或少地想要相反的情况:单个线程将输出写入每个结果光盘,并且处理线程将其数据存放在某种队列中。在典型情况下,这将是一个优先级队列,按数据写入输出文件的顺序排序,因此输出线程始终按顺序写入数据。
与性能问题一样,您可能应该尝试两者并在可行的情况下进行测量。但这是我的直觉所说的:
如果文件具有相似的大小/处理时间相似,则最好为每个线程提供自己的文件。
许多线程访问一个文件可能只有在计算时间主导文件 IO 时间时才值得。
但同样,你应该衡量。对性能的猜测经常出错。正如@Jerry Coffin 指出的那样,很可能两者都不会帮助您,但另一方面,文件可能已经预加载到 RAM 中,在这种情况下,这一点可能适用,也可能不适用(完全扩展)。真的,试试看。这是一个广泛的领域,很难预测。
数和每个文件有多少行。
如果每个文件中的行相对较少,则并行化将不值得开销。如果您处理的文件相对较少,情况也是如此。
总是可以并行两者。
- 有没有任务栏API可以立即应用注册表更改
- C++omp没有显著改善
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何创建线程序列以按照启动顺序执行任务?
- C++一个线程如何正确通信其任务已完成?
- 在线程之间拆分任务总是值得的吗?
- 递归求和任务的错误答案
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- C++ 任务流库入门
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- 编写一个读取五个整数并执行一些任务的C++程序
- 任务内部的 OpenMP 任务循环
- 不知道如何在家庭作业任务中实现一件事
- 如何安全地停止 IOCP WSARecv() 任务,并释放 WSAOVERLAPED 结构?
- 为什么我的 FreeRTOS 任务看不到类成员?
- 如何在循环内将大对象复制到omp任务中?
- 正在执行 omp 任务的线程数
- C++#pragma OMP并行:大任务或小任务