c - 使用 C 和 stdlib 预取文件

标签 c multithreading file mpi

对于用 C 实现的数值例程,我需要从文件 (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;

}

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

最佳答案

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

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

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

关于c - 使用 C 和 stdlib 预取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12498690/

相关文章:

java - 使用 PHP 下载特定文件

linux - grep命令查找文件

C- printf() 正在覆盖我的变量

c - 提高读取 volatile 存储器的性能

c - 使用 16550D UART FIFO

python - 谷歌应用程序引擎上的任务队列或多线程

c++ - std::mutex 作为多线程的成员变量线程安全吗?

c - 替换字符 http 响应

c# - 服务器端技能和桌面开发技能有什么区别?

file - 如何使用 COBOL 从文件中删除重复项?