mac*_*aut 5 c parallel-processing performance file-io openmp
我正在开发一个非常cpu密集的科学软件(它的proc绑定),但它需要经常将数据写入磁盘(i/o bound).
我正在为此添加并行化(OpenMP),我想知道解决磁盘写入需求的最佳方法是什么.仿真没有理由等待硬盘驱动器(这就是它现在正在做的事情).
我正在为此寻找"最佳实践",速度是我最关心的(这些可能是非常长的模拟).
谢谢〜亚历克斯
初步想法:
有一个单独的进程执行实际写入磁盘,因此模拟有两个过程:一个是CPU绑定(模拟),一个是IO绑定(写入文件).这听起来很复杂.
可能是管道/缓冲器?我对这些很新,所以也许这可能是一个可能的解决方案.
如果您在程序中实现 OpenMP,那么最好使用并行部分中的#pragma omp single或#pragma omp master来保存到文件。这些编译指示仅允许一个线程执行某项操作。因此,您的代码可能如下所示:
#pragma omp parallel
{
// Calculating the first part
Calculate();
// Using barrier to wait all threads
#pragma omp barrier
#pragma omp master
SaveFirstPartOfResults();
// Calculate the second part
Calculate2();
#pragma omp barrier
#pragma omp master
SaveSecondPart();
Calculate3();
// ... and so on
}
Run Code Online (Sandbox Code Playgroud)
这里线程组将进行计算,但只有单个线程将结果保存到磁盘。
它看起来像软件管道。我建议您考虑英特尔线程构建模块库中的 tbb::pipeline 模式。我可以向您推荐有关软件管道的教程:http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=25。请阅读第 4.2 段。他们解决了这个问题:一个线程从驱动器读取,第二个线程处理读取的字符串,第三个线程保存到驱动器。