【发布时间】:2012-01-03 16:15:20
【问题描述】:
在我的程序中,我正在模拟一个 N 体系统以进行大量迭代。对于每次迭代,我都会生成一组 6N 坐标,我需要将其附加到文件中,然后用于执行下一次迭代。该代码是用 C++ 编写的,目前使用ofstream 的方法write() 在每次迭代时以二进制格式写入数据。
我不是这个领域的专家,但我想改进这部分程序,因为我正在优化整个代码。我觉得与在每个周期写入计算结果相关的延迟会显着降低软件的性能。
我很困惑,因为我没有实际并行编程和低级文件 I/O 方面的经验。我想到了一些我认为可以实现的抽象技术,因为我正在为具有 Unix 操作系统的现代(可能是多核)机器编程:
- 以 n 次迭代的形式将数据写入文件中(似乎有更好的方法可以继续...)
- 使用 OpenMP 并行化代码(如何实际实现缓冲区以使线程适当地同步,并且不重叠?)
- 使用
mmap(文件大小可能很大,大约GB,这种方法是否足够健壮?)
但是,我不知道如何最好地实现它们并适当地组合它们。
【问题讨论】:
-
“我觉得与在每个周期写入计算结果相关的延迟会显着降低软件的性能。”你有感觉还是你分析了你的代码?
-
您是否分析过代码以确保您对延迟的感觉是正确的?
-
@LightnessRacesinOrbit 同时写入数据和进行计算的最快技术是什么以及如何实现它们。我知道这是一个非常基本的问题,但我不是实现简单优化(例如缓冲区)的专家。所以我想知道我应该学习哪些 API 和技术
-
如果您想要智能建议,您需要提供一些数字。
-
N-Body 问题通常需要对每次迭代进行 O(n^2) 次操作。写入数据需要 O(n) 次操作。假设您的程序符合这些一般性,您会发现优化每次迭代会比尝试优化输出产生更好的结果。当然,在您按照 Alessandro 的建议完全分析您的程序以查看瓶颈所在之前,您不应该相信我的话。
标签: c++ optimization file-io parallel-processing