代码之家  ›  专栏  ›  技术社区  ›  machinaut

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

  •  5
  • machinaut  · 技术社区  · 17 年前

    我正在为此添加并行化(OpenMP),我想知道解决磁盘写入需求的最佳方法是什么。

    谢谢

    6 回复  |  直到 17 年前
        1
  •  2
  •   Vladimir Obrizan    17 年前

    我认为最好的方法是生成一个不同的线程来保存数据,而不是一个全新的进程;对于一个新流程,您必须跨越流程边界传递要保存的数据,这带来了一系列新的困难。

        2
  •  5
  •   Paul Sonier    17 年前

    想到的第一个解决方案几乎就是你所说的——在自己的进程中使用从sim到writer的单向管道进行磁盘写入。作者确实尽可能快地写(从管道中提取新数据)。这样做的问题是,如果sim远远领先于writer,那么sim无论如何都会阻塞管道写入,并且只需一步就会受到I/O限制。

    问题是,事实上,在输出结果之前,你的模拟周期是不完整的。

    我想到的第二件事是使用非阻塞I/O。每当sim需要写入时,它应该通过非阻塞I/O进行写入。在下一次需要写入的时候,它可以在开始新的I/O操作之前获取上一次I/O操作的结果(可能会引起一点等待)。这使模拟尽可能与I/O并行运行,而不会让模拟在写入之前走得太远。

    如果模拟处理周期不同(有时小于写入时间,有时更长),第一种解决方案会更好,因为平均而言,写入可能会跟上sim的速度。

        3
  •  3
  •   Michael Kohne    17 年前

    如果你在程序中实现了OpenMP,那么最好使用 #pragma omp单曲 #pragma omp大师 从并行部分保存到文件。这些pragmas只允许一个线程执行某些操作。因此,您的代码可能如下:

    #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
    }
    

    在这里,线程团队将进行计算,但只有单个线程会将结果保存到磁盘。

    它看起来像软件管道。我建议您考虑英特尔线程构建块库中的tbb::管道模式。我可以向您推荐软件管道教程,网址为 http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=25 请阅读第4.2段。他们解决了这个问题:一个线程从驱动器读取,第二个线程处理读取字符串,第三个线程保存到驱动器。

        4
  •  1
  •   Nils Pipenbrinck    17 年前

    既然你受到CPU和IO的限制:让我猜猜:还有足够的内存可用,对吧?

        5
  •  0
  •   yfeldblum    17 年前

    一个线程持续执行计算密集型过程的一个步骤,然后将部分结果添加到部分结果队列中。另一个线程不断地从队列中删除部分结果并将其写入磁盘。确保同步对队列的访问。队列是一种类似列表的数据结构,您可以在其中将项目添加到末尾并从前面删除项目。

        6
  •  0
  •   foobarfuzzbizz    17 年前

    让你的应用程序有两个 一个用于CPU,一个用于硬盘。

    让CPU线程将完成的数据推送到队列中,然后硬盘线程在数据进来时从队列中提取数据。

    这样,CPU只需处理数据并让其他人处理,硬盘驱动器只需耐心等待队列中的任何数据。

    在实现方面,您可以将队列作为共享内存类型的对象,但我认为管道正是您要寻找的。CPU只需在需要时写入管道。在硬盘方面,你只需读取管道,每当你得到有效数据时,就从那里继续。

    推荐文章