0

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

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

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 */块需要与稍后搜索文件一样多的时间,则不会花费任何额外时间。如果代码停留在那里,则执行时间将大约是原来的两倍(忽略外部操作所需的时间)。请注意,如果块花费的时间比读取时间长,我可以轻松地并行化它。我不能对现在的读者做些什么。

4

1 回答 1

3

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

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

如果你想去多线程 IO,你正在寻找的是一个经典的生产者-消费者解决方案。有大量的例子,任何语言的简单实现,并使用你喜欢的任何线程库。查看此页面,讨论使用 pthread 进行并发计算的一些经典示例

于 2012-09-19T19:12:49.673 回答