Openmp具有密集的IO操作,如何提高速度?

时间:2014-08-28 17:44:12

标签: c++ io openmp

我的代码是这样的:

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%。

有什么建议吗?非常感谢!

1 个答案:

答案 0 :(得分:2)

扩展@ Zboson的评论,你应该建立一个处理管道:

+---------+------------+---------+  
| Reading | Heavy      | Writing |  
| data    | Processing | Data    |  
+---------+------------+---------+  

一个线程启动并读取数据 数据传递给处理数据 Read线程读入更多数据。

重处理完成并将数据传递给写入数据流程 读数数据处理将数据交给重处理过程 读数据过程读入更多数据。

研究&#34;双缓冲&#34;的概念。在这种情况下,您可能希望至少有3个缓冲区。缓冲区的指针传递给每个进程。

利用I / O的任何硬件加速:

  1. 读取过程读取原始数据的缓冲区。
  2. 然后,阅读过程将原始数据转换为内部格式 对于重型加工过程。
  3. 写入数据进程应该将原始数据写入缓冲区 格式化数据。
  4. 写入数据进程应将格式化缓冲区写为1 I / O. 操作。
  5. 在更智能的平台中,这将允许操作系统使用直接内存访问(DMA)控制器等设备直接从内存中读取I / O.这使得该过程有更多时间来处理数字。与写作类似。 DMA控制器可以独立于处理器将格式化数据缓冲区中的数据发送到输出设备。

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