私は vampire ( http://github.com/richard-evans/vampire ) と呼ばれるオープン ソースの科学的コードの作成者であり、計算集約型であることは、コード パフォーマンスの改善により、実行できる研究の量が大幅に増加することを意味します。このコードの通常の実行時間は数百コア時間になる可能性があるため、コードのパフォーマンス クリティカル セクションを改善する方法を常に探しています。ただし、実行時間の約 40% を占める、比較的無害に見える次のコードに少し行き詰まりました。
for (int atom = start_index; atom < end_index; atom++){
register double Hx = 0.0;
register double Hy = 0.0;
register double Hz = 0.0;
const int start = atoms::neighbour_list_start_index[atom];
const int end = atoms::neighbour_list_end_index[atom] + 1;
for (int nn = start; nn < end; nn++){
const int natom = atoms::neighbour_list_array[nn];
const double Jij = atoms::i_exchange_list[atoms::neighbour_interaction_type_array[nn]].Jij;
Hx -= Jij * atoms::x_spin_array[natom];
Hy -= Jij * atoms::y_spin_array[natom];
Hz -= Jij * atoms::z_spin_array[natom];
}
atoms::x_total_spin_field_array[atom] += Hx;
atoms::y_total_spin_field_array[atom] += Hy;
atoms::z_total_spin_field_array[atom] += Hz;
}
このコードの関数と変数の高レベルの概要は次のとおりです。atoms::x_spin_array
「スピン'。これらの各スピンは他のいくつかのスピンと相互作用し、すべての相互作用は 1D 近傍リスト ( atoms::neighbour_list_array
) として保存されます。各原子に関連する相互作用のリストはlistarray
、2 つの別個の配列内の隣接する原子の開始インデックスと終了インデックスによって決定されます。計算の最後に、各原子スピンは相互作用のベクトル和である実効場を持ちます。
少量のコードとそれが占めるランタイムのかなりの部分を考えると、私は最善を尽くしましたが、これをさらに最適化する方法があるに違いないと感じていますが、コンピューター科学者ではなく物理学者として、何かが足りないのでしょうか?