私はいくつかのシミュレーション コードを書き、「GDB でランダムに中断する」方法のデバッグを使用しています。プログラムの時間の 99.9% がこのルーチンに費やされていることがわかりました (これは最小の画像規則です)。
inline double distanceSqPeriodic(double const * const position1, double const * const position2, double boxWidth) {
double xhw, yhw, zhw, x, y, z;
xhw = boxWidth / 2.0;
yhw = xhw;
zhw = xhw;
x = position2[0] - position1[0];
if (x > xhw)
x -= boxWidth;
else if (x < -xhw)
x += boxWidth;
y = position2[1] - position1[1];
if (y > yhw)
y -= boxWidth;
else if (y < -yhw)
y += boxWidth;
z = position2[2] - position1[2];
if (z > zhw)
z -= boxWidth;
else if (z < -zhw)
z += boxWidth;
return x * x + y * y + z * z;
}
これまでに実行した最適化 (あまり重要ではないかもしれません):
- 平方根の代わりに距離の二乗を返します
- インライン化する
- 私ができることを主張する
- 標準ライブラリの肥大化なし
- 私が考えることができるすべてのg ++最適化フラグでコンパイルする
私はこれでできることを使い果たしています。double の代わりに float を使用できるかもしれませんが、それは最後の手段にしたいと思います。そして、どうにかしてこれにSIMDを使用できるかもしれませんが、それをやったことがないので、それは大変な作業だと思います. 何か案は?
ありがとう