【发布时间】: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