1

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

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

全部使用 Verlet 算法在一个线程中完成。

问题是:我正在使用“计算表”-array 来快速回答 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。

4

1 回答 1

1

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

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

于 2016-11-14T02:50:16.973 回答