パイプラインでの実行を「助ける」対「妨げる」ものは常にありますが、高度に特殊化されていないほとんどの汎用コードの場合、コンパイルされたコードのパフォーマンスは、得られる最高のものとほぼ同じであると予想されます。プロセッサのモデルごとに高度に専門化されたコードは必要ありません。すべてのマシンが同じ (または少数の同様の) プロセッサ モデルを使用している制御されたシステムがあり、時間の 99% がこの特定の機能に費やされていることがわかっている場合、その特定の機能を最適化して、より効率的にします。
あなたの場合、それは HPC であり、実行中のプロセッサ用に最適化される低レベル コード (行列乗算など) の一部を手書きすることが有益な場合があります。ただし、これにはある程度のプロセッサの理解が必要です。そのため、そのプロセッサ モデルの最適化ガイドを調べて、可能であれば、そのプロセッサで以前に作業したことのある人に相談する必要があります。
あなたが見ていることのいくつかは、「依存関係を登録する」です - x = c + d を計算するために c = a + b の結果が必要です - したがって、これらを他の有用な作業と分離しようとします。 x の計算は、c = a + b の計算によって遅れることはありません。
キャッシュのプリフェッチと、一般的にキャッシュがどのように使用されるかを考慮することも有用です。結果として得られる 1MB の配列を保存するときに、100 命令後に必要な有用なキャッシュ データを追い出すことはありません。数秒が多くのプロセッサ時間に値する場合があります。
コンパイラが独自の最適化でシャッフルすることを決定した場合、これらのことを制御するのは(より)難しいため、手書きのアセンブラがほぼ唯一の方法です。