我的代码是这样的:
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%。
有什么建议吗?非常感谢!
答案 0 :(得分:2)
扩展@ Zboson的评论,你应该建立一个处理管道:
+---------+------------+---------+
| Reading | Heavy | Writing |
| data | Processing | Data |
+---------+------------+---------+
一个线程启动并读取数据 数据传递给处理数据 Read线程读入更多数据。
重处理完成并将数据传递给写入数据流程 读数数据处理将数据交给重处理过程 读数据过程读入更多数据。
研究&#34;双缓冲&#34;的概念。在这种情况下,您可能希望至少有3个缓冲区。缓冲区的指针传递给每个进程。
利用I / O的任何硬件加速:
在更智能的平台中,这将允许操作系统使用直接内存访问(DMA)控制器等设备直接从内存中读取I / O.这使得该过程有更多时间来处理数字。与写作类似。 DMA控制器可以独立于处理器将格式化数据缓冲区中的数据发送到输出设备。
另一个建议是让主处理器处理I / O,另一个处理器(例如图形控制器板上的处理器)执行重处理。