在运行计算密集型任务时将数据保存到磁盘的有效方法

mac*_*aut 5 c parallel-processing performance file-io openmp

我正在开发一个非常cpu密集的科学软件(它的proc绑定),但它需要经常将数据写入磁盘(i/o bound).

我正在为此添加并行化(OpenMP),我想知道解决磁盘写入需求的最佳方法是什么.仿真没有理由等待硬盘驱动器(这就是它现在正在做的事情).

我正在为此寻找"最佳实践",速度是我最关心的(这些可能是非常长的模拟).

谢谢〜亚历克斯

初步想法:

有一个单独的进程执行实际写入磁盘,因此模拟有两个过程:一个是CPU绑定(模拟),一个是IO绑定(写入文件).这听起来很复杂.

可能是管道/缓冲器?我对这些很新,所以也许这可能是一个可能的解决方案.

Pau*_*ier 5

我想说最好的方法是生成一个不同的线程来保存数据,而不是一个全新的过程; 使用新流程,您会遇到必须在整个流程边界上传输要保存的数据的麻烦,这会带来一系列新的困难.


Vla*_*zan 2

如果您在程序中实现 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 段。他们解决了这个问题:一个线程从驱动器读取,第二个线程处理读取的字符串,第三个线程保存到驱动器。