|
|
1
23
4a级。尝试将if(…)tau_q=替换为
第4b条[编辑分开4a和4b分开]你可能会考虑存储Tauiq.Q2而不是Tauqq,并与R2/V2进行比较,而不是R2*R2/V2*V2。然后避免在内环中对每个迭代执行两次乘法,以换取在最后计算tau..q2的一次平方运算。为此,分别收集tau_q1和tau_q2的最小值(不是平方),并在循环完成时在单个标量运算中取这些结果的最小值]
除此之外,还需要考虑一个循环展开,b)矢量化(使用SIMD指令;要么手工编写汇编程序,要么使用英特尔编译器,这应该是相当不错的(但我没有经验),和c)多核(使用OpenMP)。 |
|
|
2
7
如果你有单指令多数据处理能力,把向量减法和平方分解成自己的循环,一次计算出来会有点帮助。质量/挺举计算也一样。
除此之外,它是一个数学繁重的函数,需要一些CPU时间。汇编程序对此的优化不会产生比编译器已经能为您做的更多的结果。 另一个想法。由于这似乎与重力有关,有没有办法根据距离检查剔除你繁重的数学题?基本上,一个radius/radius平方检查来对抗循环的O(n^2)行为。如果你去掉1/2的粒子,它的速度会快4倍。 最后一件事。您可以将内部循环线程连接到多个处理器。为了防止数据争用和锁定开销,您必须为每个线程创建一个单独的内部版本,但是一旦每个线程都完成了,您就可以统计每个结构的mass/jerk值。我没有看到任何依赖关系可以阻止这种情况,但我在这方面还不是专家:) |
|
|
3
3
|
|
|
4
3
如果这是为了视觉效果,而粒子位置/速度只需要近似值,则可以尝试替换
|
|
|
5
3
首先,简单的事情是:将所有“旧”变量移到不同的数组中。您从未在主循环中访问它们,因此您所接触的内存是实际需要的两倍(从而导致两倍的缓存未命中)。以下是最近一篇关于这一主题的博文: http://msinilo.pl/blog/?p=614 prefetch 前面的一些粒子,例如p[j+k],其中k是需要一些实验的常数。 如果你把质量也移出去,你可以存储这样的东西:
然后,从新数据更新旧粒子数据就变成了从当前粒子到旧粒子的单个大内存。
其中Vector4是一个单精度或两个双精度SIMD向量。这种格式在一次测试多条光线的光线跟踪中很常见;它可以让您更有效地执行点积之类的操作(无需无序排列),还意味着您的内存加载可以是16字节对齐的。不过,你肯定要花几分钟的时间才能清醒过来:) 希望有帮助,让我知道如果你需要一个关于使用转置表示的参考(虽然我也不知道它在这里到底有多少帮助)。 |
|
|
6
2
我的第一个建议是看看分子动力学,这个领域的人已经考虑了粒子系统领域的许多优化。看一看 GROMACS 例如。
对于许多粒子,杀死你的当然是双倍粒子
|
|
7
2
上面都是好东西。我一直在做类似的事情,以二阶(蛙跳)积分。在考虑了上面建议的许多改进之后,接下来我做的两件事是开始使用SSE intrinsics来利用矢量化,并使用一种新的算法来并行化代码,该算法避免了竞争条件,并利用了缓存局部性。 SSE示例: 新颖的缓存算法、说明和示例代码: http://software.intel.com/en-us/articles/a-cute-technique-for-avoiding-certain-race-conditions/
http://www.ademiller.com/blogs/tech/2010/04/seattle-code-camp/ 你的四阶积分器更复杂,而且在双核系统上很难用有限的增益并行化,但我绝对建议你检查一下SSE,我在这里得到了一些合理的性能改进。 |
|
|
8
1
什么
除此之外,您还必须转向MMX/SSE/装配优化。 |
|
|
9
1
你会从著名的 fast inverse square root" algorithm ?
它返回1/r**2的一个相当精确的表示(牛顿方法的第一次迭代,带有一个巧妙的初始猜测)。它被广泛应用于计算机图形学和游戏开发。 |
|
|
10
1
任何修剪粒子结构大小的操作都将有助于改进缓存局部性。你好像没有用这里的老会员。如果它们能被移除,这将有可能产生重大的影响。
|
|
11
0
您可能想先分析一下这是否真的是瓶颈。 |
|
|
12
0
我寻找的是分支,它们往往是性能杀手。 可以使用循环展开。 另外,请记住问题的多个小部分:-
这和让一个循环做任何事情差不多,你可以通过循环展开和更好地命中缓存来提高速度 您可以通过线程来更好地利用多核 你有一些昂贵的计算,你可能可以减少,特别是如果计算结束计算相同的东西,可以使用缓存等。。。。 但我真的需要知道你在哪里花费最多 |
|
|
13
0
|
|
|
14
0
如果您使用其他集成方案(例如Runge-Kutta),您将获得更少的时间步,但我怀疑您已经知道这一点。 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
|
Daniel Lobo · 使用约束进行优化 1 年前 |
|
Sergio · python中大量数字的乘法 1 年前 |
|
|
Sergey Dev · 临时表与表变量 1 年前 |
|
|
John · 减少C中的内存消耗++ 1 年前 |