Openmp与密集IO操作,如何提高速度

Openmp with dense IO operation, how to improve speed?

本文关键字:何提 高速度 操作 IO Openmp      更新时间:2023-10-16

我的代码如下:

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的任何硬件加速:

  1. Reading过程读取原始数据的缓冲区
  2. 读取过程然后将原始数据转换为内部格式用于重加工过程
  3. 写入数据过程应将原始数据写入格式化数据
  4. 写入数据过程应将格式化的缓冲区写入1 I/O操作

在更智能的平台中,这将允许操作系统使用直接内存访问(DMA)控制器等设备直接从I/O读取到内存中。这让这个过程有更多的时间来处理数字。写作也是如此。DMA控制器可以独立于处理器将数据从格式化的数据缓冲器发送到输出设备。

另一个建议是让主处理器处理I/O,另一个处理器(如图形控制器板上的处理器)执行重处理。