ホームページ >バックエンド開発 >C++ >Intel Sandybridge CPU 向けにプログラムを意図的に非最適化するにはどうすればよいでしょうか?

Intel Sandybridge CPU 向けにプログラムを意図的に非最適化するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 11:43:09955ブラウズ

How Can We Intentionally Deoptimize a Program for Intel Sandybridge CPUs?

Intel Sandybridge ファミリ CPU のパイプライン用プログラムの逆最適化

はじめに

この課題の目標は次のとおりです。特定のプログラムを変更してパフォーマンスを低下させること。これは非最適化と呼ばれます。このタスクでは、インテル i7 パイプライン アーキテクチャと、危険を引き起こすために命令パスの順序を変更する方法を理解する必要があります。

逆最適化テクニック

1.フォールス共有:
非アトミック変数が同じキャッシュ ラインに格納されるように調整し、ストア転送の停止につながります。

2.ストア転送ストール:
「-」演算子を使用する代わりに XOR を使用して double の符号ビットを反転し、狭いストアを double の 1 バイトのみに強制します。

3.メモリの曖昧さ回避:
データ 4096B を離して配置し、異なるページへのストアに対する誤った依存関係をトリガーします。

4.不整列データ:
__attribute__((packed)) を使用して、キャッシュ ラインまたはページの境界を越えて変数の不整列を強制し、キャッシュ ミスを増加させます。

5.ストライド:
4096 バイトのストライドで配列をループし、不連続なメモリ アクセスを引き起こし、キャッシュ使用率を削減します。

6.リンク リスト:
結果をリンク リストに保存すると、ポインタ追跡のロード依存関係が生じ、メモリ内にノードが分散する可能性が生じます。

コンパイラベースの最適化解除

1.アトミック変数:
std::atomic を使用します。および std::atomicコードが遅くなり、メモリ フェンスによるオーバーヘッドが増加します。

2. Long double:
SSE2 対応 CPU であっても、long double 変数を使用して x87 エミュレーションを強制します。

3.整数変換:
整数型と浮動小数点型の間で変換を繰り返し、待ち時間の長い変換命令を導入します。

4.システムコール:
コンテキストスイッチとキャッシュ/TLBミスを強制するために頻繁に不必要なシステムコールを導入します。

結論

これらの手法を採用することで、与えられた状況を大幅に悲観することが可能です。プログラムを作成し、元のバージョンよりも実行速度が大幅に遅くなります。再最適化を成功させる鍵は、悪意ではなく「極悪非道な無能」によって各ステップを正当化することです。

以上がIntel Sandybridge CPU 向けにプログラムを意図的に非最適化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。