对于在 CI 中实现的数值例程,需要从文件 (ascii) 中读取数据。数据需要作为数值计算的输入,并且通常太大而无法将其放入内存中。因此,我需要将它动态地预取到某个数组以将其馈送到例程中(否则读取文件将成为计算中的瓶颈)。有没有一种既定/简单的方法可以使用stdlib,也许是posix线程或MPI?我正在使用 Linux 下的英特尔 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 */
块需要与稍后搜索文件一样多的时间,则不会花费任何额外时间。如果代码停留在那里,则执行时间将大约是原来的两倍(忽略外部操作所需的时间)。请注意,如果块花费的时间比读取时间长,我可以轻松地并行化它。我不能对现在的读者做些什么。