アセンブリによる最適化の学習[終了]


21

私はコンピューターゲームテクノロジーの2年生です。私は最近、自分のパスファインダーの「種類」の最初のプロトタイプを完成させました(幾何学的なアプローチ/パターン認識の代わりにA *を使用しません。地形が既にわかっている場合、実際に探索できるAIが必要でした。パスファインダーにはノードのメモリがあるため、最短距離で簡単に歩きます)。

とにかく私の質問はより一般的です:アルゴリズム/ループ/ for_each /などの最適化を開始するにはどうすればよいですか。一般的なヒントは大歓迎ですが、アセンブリを使用します。このトピックに関する良い本を見つけるのは本当に難しいので、私は特に良い本を探しています。このような小さな記事がいくつかありますが、それでもアルゴリズム/ゲームを最適化するには十分な知識がありません...

私が見つけることができなかった現代の良い本がそこにあることを願っています...


1
これはあなたの質問に直接答えるわけではありませんが、探索的(いわゆるアダプティブ)A *が調査されており、本当に良いパフォーマンスを持っています(つまり、ASMを使用して最適化する必要はありません)。見ていD * Liteは
ジョナサンディキンソン

回答:


21

私はここで穀物に反対する人であり、最適化、特にアセンブリの最適化、さらに重要なことにはアセンブリでのデバッグについて学ぶことは決して早すぎることはありません。あなたが学生の場合、あなたはそれの最大の利益を得ると信じています(そのため、失うことはほとんどありません(つまり、時間/お金の面で))。

あなたが業界にいて、アセンブリをいじくり回す仕事をしていないなら、そうしないでください。それ以外の場合、学生であるか一般的な時間がある場合は、プログラムを逆アセンブルする方法を学び、コンパイラよりも優れたソリューションを思いつくことができるかどうかを確認します。私ができない場合、誰が気にします!コンパイラーと同様に書く方法を学びましたが、それはリリースコードのバグ(デバッグシンボルなし)に直面し、逆アセンブリを見つめるときに非常に大きなプラスになります。

答え

これは、最適化について学ぶために見つけた最高のリソースの1つです。

http://www.agner.org/optimize/

暴言

主要な開発者による記事を読んだ場合(たとえば、EASTLの作成とコードの詳細な検証の背後にある理由は、GCCがこのifステートメントインライン化するのがひどいため、このようなコメントにつながります。コンパイラは常に正しいとは限らないと信じている、特にゲーム開発において)、業界に足を踏み入れると、最適化は日常的なものであり、アセンブリ出力の意味を理解することは大きなプラスになります。また、ゲームのプロファイリングが非常に難しく、常に正確であるとは限らないことに(特にstackoverflowで)気付かないようです。

ただし、注意が必要です。何かを最適化するのに時間を費やし、後でそれが時間の無駄であることに気付くことができます。しかし、あなたは何を学びましたか?あなたは同じような状況でその同じ過ちを繰り返さないことを学びました。

SOが今取っていることは、私の意見では、このステートメントに対する宗教的な姿勢は、あなたがプロファイルを作成し心配しない限り最適化されないことですコンパイラはあなたよりもよく知っています。それは学習を妨げます。コンパイラーが苦手であるか、単にあなたを助けることができないため、ゲームを最適化してデバッグするためにアセンブリをいじくり回すために非常に良いお金を払っている業界の専門家を知っていますできません(GPU関連のクラッシュ、関連するデータがデバッガーで読み取ることができないクラッシュなど)!

それをするのが好きで、まだそれを完全に理解していない人がここで質問をし、コンパイラーがあなたよりもよく知っている多くの答えによって断られたり/消されたりしたらどうでしょうか!そして、決してそれらの高給プログラマーの一人にならないのですか?

最後の考え。これを早期に開始すると、コンパイラーが最適化できるのでコンパイラーが最適化するので、最悪の場合はパフォーマンスが改善されず、最悪の場合でもパフォーマンスの改善がないコードをすぐに書き始めることがわかります。 。どちらの場合でも、それは習慣になっており、以前のようにこの方法でコードを書くことは遅くありません。いくつかの例があります(もっとたくさんあります):

  1. ポストインクリメントが本当に必要な場合を除き、事前インクリメント
  2. ループ内のコンテナーでsize()を呼び出すのではなく、一定のローカルサイズ変数を使用してコンテナーのループを記述します。

編集:業界でさらに8年後に更新します。アセンブリを学びます。オプティマイザーがどのように機能し、それらが生成するアセンブリを学習します(CompilerExplorerはそのための優れたツールです)。テストビルド(内部テスト用に最適化されたビルド)で、デバッグシンボルがあってもデバッガーに依存できない無数のクラッシュに遭遇しました。コンパイラは最適化を行いすぎており、アセンブリはクラッシュダンプからバグを見つけるための貴重な情報の唯一のソースです。幸運で最初にビルドキューに入った場合、各ビルドには30〜40分かかります。したがって、バグを切り分けるために従来の手法に頼ることはできません。マルチプレイヤーは事態を悪化させます。アセンブリと最適化されたアセンブリの読み方を知ることは、単にあなたをより良くし、最終的にチームにとってより価値のあるものにします。


1
コンパイラの最適化に関する良い点。それらは素晴らしいものですが、完璧とはほど遠いもので、一部の人々が信じているものとは異なり、通常はコンパイラーが行わなかった単純な最適化を見つけるのは難しくありません。
aaaaaaaaaaaa

3
「アセンブリを読むことを学ぶ」と「アセンブリで最適化することを学ぶ」には違いがあることに注意してください。2つは同じものではなく、あなたの答えは、アセンブリを使用して最適化を実装することに実際には触れていません。アセンブリを読むことは、コンパイラが正しく動作していない場所をデバッグしたり見つけたりするのに役立つため、便利なスキルです。しかし、それは、実際にアセンブリを使用し最適化されたルーチンを作成するのとは大きく異なり、特定のCPUの命令スケジューリングの深い知識が必要です。そして、あなたがカバーしなかったものでもあります。
ニコルボラス

1
また、「コンパイラと同様に書く方法を学んだばかりです」いいえ、あなたはしませんでした。1つの特定のルーチンが1つの特定のCPU向けにどのようにコンパイルされるかを見ました。最適化されたアセンブリルーチンの実装方法を学習するには、コンパイラが1つのルーチンをどのようにコンパイルしたかを調べるだけでは不十分です。特定のC ++コードを再現するために、コンパイラがその順序でこれらのオペコードを選択した理由を理解する必要があります。また、CPU、命令のスケジューリングなどに関する詳細な知識が必要です。これを一般化するには、長年の経験が必要です。いくつかのルーチンをデコードするだけでは取得できません。
ニコルボーラス

7
したがって、Aの場合は-1です。実際には、アセンブリ最適化ルーチンの作成方法に関する質問に答えていません。B:アセンブリに最適化されたルーチンを書く際にコンパイラーに勝つ方法を学ぶのがいかに簡単かを誤って伝えます。C:アルゴリズムレベルの最適化の前に、アセンブリレベルの最適化を見ることをプログラマに奨励します。これらの高額な「業界の専門家」でさえも、それがカートを馬の前に置いていることをあなたに告げるでしょう。
ニコルボーラス

2
@Samaursa:「逆アセンブリとコードの最適化方法を理解するべきではない」と言う人はいません。これは宗教的な議論ではありません。それは簡単な事実の問題です。人は何世紀にもわたって手作業でいくつかのルーチンを最適化することに費やしてきましたが、それは全体的なパフォーマンスに何の意味も持たないことがわかりました。アルゴリズムを最適化する方法を学ぶことは非常に貴重なスキルセットです。アセンブリの読み方を学ぶことは、半価値のあるスキルセットです。アセンブリルーチンの書き方を学ぶことは、ほとんど使用されないスキルセットです。そして最近では、最適な最適化は、手作業による組み立てではなく、キャッシュ使用率の向上からもたらされています。
ニコルボーラス

22

あなたが得る最初のヒントはこれです-しないでください。

実際、最新のコンパイラーは実際にコードの最適化に非常に優れており、作成する可能性のある自動ロールアセンブリー言語よりも優れた仕事をする可能性が非常に高くなります。

例外は、コンパイラーが最適化の悪い仕事をしていると確実に判断した特定のケースであるため、2番目のヒントです。ここには一般的なガイドラインはありません。自分のコードを知り、それが何をしているのかを知り、それの逆アセンブリに飛び込み、コンパイラが悪い仕事をしていることを絶対に確実に判断できる必要があります。

この場合でも、まだしたくないかもしれません。継続的なメンテナンスのオーバーヘッドが発生しないことを確認する必要があります。6か月後にこのコードに戻ってその一部を変更したい場合や、アセンブリ言語バージョンで修正するのがより困難になる非常に微妙なバグを見つける場合があります。すべてのバグを解決したと思っていても、プログラムが公開バグに到達すると、それが起こるとは思わなかったことが現実になります。それは非常に目を見張るものです(そして謙虚な体験です)。

それを受け入れても、プログラムの主なボトルネックがどこかで完全に異なる可能性があるため、測定可能なパフォーマンスの改善はまったくないことに気付くかもしれません。そのため、再び1番に戻ります。しないでください。


15

通常、確実な最適化は、Assemblyの使用や、高レベル言語のコードを使用したマイクロ最適化に依存しません。多くの研究論文を読んだら(私がやったように!)、アルゴリズムに加えられた改善は、より「定量的」ではなく、より概念的な「定性的」レベルであることがよくあります。マイクロ最適化のレベル。この観点からアルゴリズムを見たり、既存のソリューションをベクトル化/並列化することで、桁違いのゲインが見つかる可能性が高いことを強調します。

とはいえ、最近私はこのことに気付きました。これは、特にゲーム開発者向けにx86 ASMを学習するための良いルートかもしれません。


補遺

私の頭の上の2つのソース:

さらに、研究論文を読むことは、アルゴリズムを最適化してパフォーマンスを向上させる賢明な思考プロセスを追跡する優れた方法です。ほとんどの場合、次のような利点があります。

  • 最もコストのかかる操作(主にdiv、SQRT、trig ops、および条件)の使用を削減します。
  • より効率的なデータ構造の使用、メモリのアライメント、および条件の削減によるキャッシュパフォーマンスの改善。
  • パフォーマンスを改善するために、許容可能な領域で出力の品質を低下させます。
  • ベクトル化(SIMD);
  • 並列化(スレッド化、GPUへのタスクのシフトを含む);
  • そしてもちろん、(ますますめったに)手動でコーディングされたアセンブリ。もちろん、最初にC / C ++アセンブリを調べて、コンパイラが最適でない選択を行っている場所を確認します。これについては、IMEの80年代および90年代の古い論文で詳しく説明されています。

また、研究を読むことで、その知識が業界に浸透するのを待つのではなく、最先端の分野に留まることができます。


あなたはアルゴリズムの最適化について話しますが、それについての情報を提供しません。私たちがあなたのアドバイスに従い、それを見て代わりに何らかの方向性を与えることができたら?
スケイス

実際、私はそれについて言及しています。コンピュータサイエンティストがパフォーマンスを定性的に向上させるために行うことを理解し、アルゴリズムを研究する必要があります。これに十分没頭し、やがて、あなたは同様の言葉で考え始めます。ここでの漸進的な努力は、何年も費やすのとは対照的に、大きな時間をもたらします(そして、最近ASMフォーラムでこれを見たことがあります)。x86アーキテクチャ。大物を狩る:問題をその核心にまで切り詰めることを学び、最適化するために余分なものを決定します。上記の参考書をご覧ください。
エンジニア

@NickWiggill研究論文の通常のソースは何ですか?
kizzx2 14

3

早すぎるかもしれません。

とにかく、コンパイラ自体は同等のアセンブリよりも遅いコードを生成しないことを理解することが重要です。コンパイラと同じアセンブリコードを書くだけではパフォーマンスが得られません。

少なくとも、アセンブリなしの最適化に集中してください。Igor Ostrovskyには、いくつかの基本を示す優れた記事があります。http//igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/

分岐の予測ミスやキャッシュミスは、主に最適化する必要があるものであることに注意してください。追加の算術演算を実行することで支払う必要がある場合でも、通常、予測できない分岐を回避したり、大量のメモリからランダムに読み取ったりする価値があります

そしてもちろん、最も重要なことは、最初にアルゴリズムを最適化することです。高速アルゴリズムの低速実装は、低速アルゴリズムの高速実装よりもほとんど常に高速です。


2

この本は、教科書に非常に適しています。しかし、最適化に特に向いているわけではありません。 x86プロセッサのアセンブリ言語、第6版

MASMを使用して、アセンブリの基本を教えることです。そして、本の終わり頃に、アセンブリをc ++でインライン化し、それをより大きなプログラムに統合する方法について説明します。

アセンブリの基本を学んでからプログラムを最適化する方法を学ぶのが理にかなっているので、ここでこれを述べました。

Irvineがmasmプログラムの作成に必要なツールの使用方法を教えてくれるので、この本が気に入っています。彼は、特にIDE(Visual Studio C ++)とデバッガーの使用方法について説明します。各章には、問題を解決するためのビデオがいくつかあります。この情報の一部は、リストされているWebサイトで無料で入手できます。


1
「プログラムを最適化する方法を学ぶ前に、アセンブリの基本を学ぶことは理にかなっています」-良いアドバイス。
マキシマスミニマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.