对于在C中实现的数值例程,我需要从文件中读取数据(ascii)。需要数据作为数值计算的输入,并且通常太大而不能将其放入存储器中。因此,我需要动态地将其预取到某个数组中以将其提供给例程(否则读取文件将是计算中的botlenck)。有没有一个已建立/简单的方法来使用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 */
块需要的时间与搜索文件的时间相同,则不会花费任何额外的时间。如果代码保持不变,那么执行时间大约是两倍(忽略外部操作所需的时间)。请注意,如果块比读取花费更多时间,我可以轻松地并行化它。我不能对现在的读者做些什么。
答案 0 :(得分:3)
我建议你做的第一件事是将ASCII文件转换为二进制文件(例如,将本机存储为8个字节,而不是ASCII字符串等)。在运行高分辨率FEM模型时,我一直在努力解决类似问题。我正在使用triangle准备网格。不幸的是,它只有ascii输入/输出和大网格读取数据需要很长时间!真。我修补了三角形以添加对二进制io的支持,所有问题都消失了。您可以使用标准fread将文件中的数据存入已分配的内存,并且vo!当然,您必须以合理的方式将它们存储在文件中,以便您可以访问/读取连续的块。
您应该尝试这样做,因为解析ASCII数据,尤其是浮点数非常昂贵。如果仍然有问题,您可能希望启动后台线程/工作程序,该后台线程/工作程序将读取数据,而其他线程同时执行计算。我只是在共享内存计算机上使用pthreads,让MPI处理代码的集群版本。取决于你的需要。
如果您想使用多线程IO,那么您正在寻找的是经典的生产者 - 消费者解决方案。有大量的例子,使用任何语言的简单实现,并使用您喜欢的任何线程库。在使用pthreads的并发计算中查看this page discussing some classic examples。