【问题标题】:Prefetch files with C and stdlib使用 C 和 stdlib 预取文件
【发布时间】:2012-09-11 23:55:27
【问题描述】:

对于用 C 语言实现的数值例程,我需要从文件 (ascii) 中读取数据。数据需要作为数值计算的输入,并且通常太大而无法将其放入内存中。因此我需要将它动态地预取到某个数组以将其馈送到例程中(否则读取文件将成为计算中的瓶颈)。有没有一种既定/简单的方法可以使用stdlib,也许是posix线程或MPI?我正在使用 Linux 下的 intels MPI 库。

以下伪代码中的例程func代表数值核心例程。它被非常频繁地调用,例如由常微分方程的求解器调用。每次i 时,它都会以x[i-1]<x[i]<x[i-1]+D 的随机浮点值调用,已知值为D。所以有一些关于x 的早期信息可以让我大致了解下一步需要文件中的哪些数据值。

read_file(x,data)
{
   /* code to search x-dependent data in file */
   data[i]=...;
}

func(x)
{

   read_file(x,&data);

   /* several data- and x-dependent operations */
   result= ...;

  return result;

}

在执行块/* several data- and x-dependent operations */(和一些外部代码)时,原则上我可以将下一次调用func 所需的数据从文件中预取到并行的缓冲区数组中。在下一次调用中,我可以搜索数组中的信息而不是文件。我要求提供并行预取数据所需的代码并替换 read_file(与文件阅读器通信的部分,下一步将需要哪些数据)。理想情况下,如果/* several data- and x-dependent operations */ 块需要与稍后搜索文件一样多的时间,则不会花费任何额外时间。如果代码停留在那里,则执行时间将大约是原来的两倍(忽略外部操作所需的时间)。请注意,如果块花费的时间比读取时间长,我可以轻松地并行化它。我不能对现在的读者做一些事情。

【问题讨论】:

  • 为什么要预取它?不按需阅读也行吗?
  • 见我上面的附加解释!
  • 首先,我想向您指出 angainor 的答案。其次,了解您的应用实际花费了多少时间来读取一个计算步骤所需的数据以及后者运行多长时间可能会很有趣。了解这一点肯定有助于决定花时间实现并发运行的数据读取器是否有意义。
  • 不幸的是,这通常很难说。这在很大程度上取决于数据的维度、x 的分辨率、数字块花费的时间(这取决于两者以及不同的数量)。因此很难找到“典型”值。另请注意,如果阅读器被实现为并行线程,我原则上可以并行化阅读器,方法是将数据拆分到不同的文件中,我可以为其拥有阅读器的副本。

标签: c multithreading file mpi


【解决方案1】:

我建议您做的第一件事是将 ASCII 文件转换为二进制文件(例如,将本机双精度存储为 8 个字节,而不是 ASCII 字符串等)。在运行高分辨率 FEM 模型时,我一直在为类似的事情苦苦挣扎。我正在使用triangle 准备一个网格。不幸的是,它只有 ascii 输入/输出,对于大型网格读取数据需要很长时间!真的。我修补了三角形以添加对二进制 io 的支持,所有问题都消失了。您可以使用标准 fread 将文件中的数据获取到分配的内存中,瞧!当然,您必须以合理的方式将它们存储在文件中,以便您可以访问/读取连续的块。

您应该尝试这样做,因为解析 ASCII 数据,尤其是浮点数非常昂贵。如果您仍然有问题,您可能希望启动一个后台线程/工作者,该线程/worker 将读取数据,而其他线程同时进行计算。我会在共享内存计算机上简单地使用 pthreads,让 MPI 来处理代码的集群版本。取决于你需要什么。

如果您想选择多线程 IO,您正在寻找的是经典的生产者-消费者解决方案。有大量的例子,任何语言的简单实现,并使用你喜欢的任何线程库。看看this page discussing some classic examples 在使用 pthread 的并发计算中。

【讨论】:

  • 谢谢!我已经知道 ascii 问题。对于“将读取数据的线程/工作者”来说,这个问题几乎是一个问题。我认为这并不太难,但我是线程编程的新手,我希望避免陷入陷阱。所以一个例子对我来说真的很有用。
  • @highsciguy 哦,计算需要这么长时间吗?;)
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 2010-12-21
  • 2023-03-11
  • 2011-03-14
  • 1970-01-01
  • 2014-07-18
  • 2017-01-09
  • 2018-01-10
相关资源
最近更新 更多