Openmp与密集IO操作,如何提高速度
Openmp with dense IO operation, how to improve speed?
我的代码如下:
for (int i = 0; i < N; i++)
{
/*Reading for big data*/
HeavyProcess();
/*Writing for big data*/
}
我试过这个:
#pragma omp parallel ordered schedule(dynamic)
for (int i = 0; i < N; i++)
{
#pragma omp ordered
/*Reading for big data*/
HeavyProcess();
#pragma omp ordered
/*Writing for big data*/
}
但事实证明它非常慢,CPU的使用看起来只有一个核心在工作。
如果我简单地使用
#pragma omp parallel for
我可以获得更高的CPU使用率,但不是100%。
有什么建议吗?非常感谢!
扩展@Zboson的注释,您应该设置一个处理管道:
+---------+------------+---------+
| Reading | Heavy | Writing |
| data | Processing | Data |
+---------+------------+---------+
一个线程启动并读取数据
数据被传递给处理数据
Read线程读取更多数据。
重处理完成并将数据传递给写入数据处理
读取数据过程将数据交给重处理过程
读取数据过程读取更多数据。
研究"双重缓冲"的概念。在这种情况下,您可能需要至少有3个缓冲区。指向缓冲区的指针被传递给每个进程。
要利用I/O的任何硬件加速:
- Reading过程读取原始数据的缓冲区
- 读取过程然后将原始数据转换为内部格式用于重加工过程
- 写入数据过程应将原始数据写入格式化数据
- 写入数据过程应将格式化的缓冲区写入1 I/O操作
在更智能的平台中,这将允许操作系统使用直接内存访问(DMA)控制器等设备直接从I/O读取到内存中。这让这个过程有更多的时间来处理数字。写作也是如此。DMA控制器可以独立于处理器将数据从格式化的数据缓冲器发送到输出设备。
另一个建议是让主处理器处理I/O,另一个处理器(如图形控制器板上的处理器)执行重处理。
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 为什么在读取文件大小时文件IO速度会发生变化
- 计算每个节点的树高,帮助我解释这个代码解决方案
- Python中的for循环与C++有何不同
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- C++高阶模板
- 获取 SFML 窗口的 HWND 和高可用性?
- Opencv 恢复到比我设置的更高的分辨率
- 输入较高值时的分段代码
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 高精度双精度的 Sprintf 格式化问题
- 在C++中释放内存期间,迭代器与指针有何不同
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 使用来自串行端口的字符串数据来操作振镜扫描仪在更高的速度下会出错
- 提振.计算速度比普通CPU慢
- 更好的可读性和简单性vs更高的复杂性和编程速度,选择什么