【问题标题】:I need help for N-body molecular simulation performance!!(java applet)我需要 N 体分子模拟性能方面的帮助!!(java 小程序)
【发布时间】:2012-06-20 18:33:31
【问题描述】:

我在毕业设计中做了一些工作,实现了几个分子结构+Lennard-Jones势和库仑势下的力计算+分子间键合(如图)

(http://img17.imageshack.us/img17/3133/simulasyon.png)

在单个线程中使用 Verlet 算法完成所有操作。

问题是:我正在使用“计算表”数组来快速回答 x^(3.5)、x^(1.4)、(1/x).... 因为使用原生计算非常慢java的方法。数组 - 访问时间真的很长,所以我尝试了“unsafe()”方法,但仍然很慢(只有 %10 的性能增益)。

试过 IntBuffer 和 DoubleBuffer 还是不行。

程序计算 O(n) 键计算、O(nlog(n)) Lennard-Jones(+ 额外泡利不相容原理)和 O(nlog(n)) 库仑力计算。 1500 多个粒子(和 7000 多个键)时速度很差。

我已经检查了速度瓶颈在哪里(它是 Lennard Jones + Coulomb)。 1500 个粒子的一个时间步计算需要 4 毫秒。我需要它是 1 毫秒。

只有当我可以像使用任何其他语言一样快地使用数组时(安全与否)。

还尝试用乘法和哈希映射和列表替换除法(数组的性能相同)。

您知道减少每个时间步的计算时间的其他方法吗? 谢谢你。 计算机:2.0 GHz 单核英特尔、1.2GB RAM、windows-XP SP-3 和 Eclipse Indigo。

【问题讨论】:

  • 有趣的问题 - 我已经稍微重新标记了它,以提高你让合适的人参与的机会。您可能想发布一些代码,特别是一个小示例,显示计算速度(慢),以及当您尝试解决这个问题时数组的(慢)速度。
  • 现代处理器和内存之间的速度差距比 15 年前要大得多。您是否尝试过仅计算这些值而不是使用查找表?
  • 我已经尝试过使用单变量进行内存测试。单个 'final a=...' 类型变量至少快 5-8 倍。像任何其他语言一样,访问单个变量既简单又快速。数组有问题。我什至用本地数组替换了数组以获得一些速度,但又不够(增加 %5)。如果“if”语句是零时间计算,我可以制作 2000000 个单个变量。即便如此,添加 2M 个单一变量也需要数年时间:)。这是一些示例代码:
  • 1) 查看每个相邻网格(正方形) 2) 查看这些网格中的每个粒子。 3)距离 'Math.sqrt(vxvx+vyvy))' 有点慢,所以我尝试了 'answer_array[(int)(vxvx+vyvy) ]' 4) 在 Lennard-Jones 和 Coulomb 势下获得力 '1.0/distance' 很慢,所以我使用了 'division_array[(int)distance]' 然后 'Math.pow(x,n)' 很慢 x xx* 也不够!我使用'power_n_array [x]' 5)如果有任何'f = k *(balance_distance-distance)',即使为此我也使用'f = k_matrix [(int)(delta_distance)]'这是最快的我可以。 “数组访问时间”为 3 个单位(单次为 0.4 个单位)
  • 如果你能把代码贴在某个地方会更容易提供帮助......

标签: java arrays performance optimization particles


【解决方案1】:

尝试使用 Chebyshev 多项式,而不是使用查找表。请记住,您只能在 ln(k) 步中对 x^k 求幂。

这看起来像是很多操作,但事实上 in 可以在不占用内存的情况下完成(因此不会影响缓存),这使得它比查找表快得多。

【讨论】:

  • 是的,今天的 cpu 可以比它的 ram 获取数据快得多。也太久远了。现在我正在使用 gpgpu,这比进行特定于 cpu 的优化要容易得多,我也可以在 gpgpu 中使用你的建议。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 2013-12-12
  • 2011-10-04
  • 2013-02-19
  • 1970-01-01
  • 2011-05-09
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多