ブール式を計算したい。理解を容易にするために、式がであると仮定しよう。コンパイラとハイエンドのプロセッサパイプラインでのブール式最適化
O =(A & B & C)| (D &E &F)
ここで、A、B、C、D、E、Fはランダムビットである。現在、私のターゲットプラットフォームは、64ビットデータ型をサポートするハイエンドのIntel i7-Haswellプロセッサであるため、ビットスライスを使用してこれをもっと効率的にすることができます。 だから今、O、A、B、C、D、E、Fは64ビットのデータタイプである、
O_64 =(A_64 & & B_64 C_64)| (D_64 &E_64 &F_64)---(式2)、&および|ビット演算子はC言語に似ています。
ここで、実行するのに一定の時間がかかるようにする必要があります。つまり、数式の計算を意味します。 2は、A_64、B_64、C_64、D_64、E_64、およびF_64の値に関係なく、プロセッサの正確なステップ数を取る必要があります。値は、実行時にランダムジェネレータを使用して埋められます。今私の質問は、
私は-O3とGCCまたはGCC-7を使用しています検討している
は、どこまでのコンパイラは、発現を最適化することができますか?たとえば、A_64がすべてゼロになる(確率2^{ - 64}で起こりうる)場合、式2の最初の部分を計算する必要はなく、O_64はD_64 & E_64 & F_64に等しくなります。そのような方法で最適化することは可能ですか?値は実行時に満たされ、ブール式には約120の変数があることを覚えておく必要があります。
実行時にこのような最適化(リスト1)を行うことは可能ですか?ブール式が非常に長いので、実行は大量にパイプライン化されますが、このような状況が発生した場合にプロセッサがパイプラインから操作を引き出すことは可能ですか?
質問のいずれかの部分が理解できない場合は教えてください。 私はあなたの助けに感謝します。
ありがとうございました。私の知る限りでは、最終行は、コンパイラまたはマイクロプロセッサ(当然のことながら、私たちが知っているもの)ではなく、最適化によってコードが一定でない時間になることはありませんか? – Rick
@Rick - 実際に言ったことをよく読んでください。これは、「どちらの場合も可能ですが、ありそうもない」と要約できます。個人的に私はこのような最適化を実装しているコンパイラやCPUを見たり聞いたりはしていません。それがあなたにとって非常に重要なのであれば、少なくとも式からコンパイラを削除するために、アセンブリのコードの重要な部分を実装することができます。 – BeeOnRope
@BeeOnRope実際、それは問題です、私はできません。コードは移植可能である必要があります。そのため、アセンブリは画像の外にあります。 – Rick