スーパー最適化とは、コンパイラがループのない命令シーケンスの最適なシーケンスを自動的に見つけるプロセスです。現実世界のコンパイラは一般に真に最適なコードを生成することはできず、ほとんどの標準的なコンパイラ最適化はコードを部分的にしか改善しませんが、スーパー最適化の目的は最適なシーケンス、つまり標準形式を見つけることです。スーパー最適化を使用すると、見逃された機会を強調表示して人間が追加のルールを記述できるようにすることで、従来の最適化を改善できます。
歴史
スーパー最適化という用語は、1987 年の論文「スーパーオプティマイザー: 最小のプログラム」でAlexia Massalinによって初めて使用されました。[1] 「プログラム最適化」というラベルは、最適化ではなく改善のみを目的とする分野に付けられました。この誤った名称により、Massalin は自分のシステムをスーパーオプティマイザーと呼ばざるを得ませんでしたが、これは実際には最適なプログラムを見つけるためのオプティマイザーです。[2]
1992年に、GNUスーパーオプティマイザ(GSO)がGNUコンパイラコレクション(GCC)に統合するために開発されました。[3] [4]その後の作業でこれらのアイデアがさらに発展し、拡張されました。
テクニック
従来、スーパー最適化は有効な命令シーケンスの空間で徹底的なブルートフォース検索によって実行されます。これはコストのかかる方法であり、汎用コンパイラではほとんど実用的ではありません。しかし、パフォーマンスが重要な内部ループを最適化するのに役立つことが示されています。また、 SMTソルバーを使用して問題にアプローチすることも可能であり、検索効率が大幅に向上します(ただし、基本ブロックよりも複雑な入力には対応できません)。[5]
2001年、コンパック研究所のデナリプロジェクトで目標指向型スーパー最適化が実証されました。[6] 2006年には、バース大学のTOAST ( Total Optimisation using Answer Set Technology )プロジェクト[7]で、回答セット 宣言型プログラミングがスーパー最適化に適用されました。[8] [9]
スーパー最適化は、汎用のピープホール最適化装置を自動的に生成するために使用できます。[10]
公開されているスーパーオプティマイザー
いくつかのスーパーオプティマイザーは無料でダウンロードできます。
- x86 ファミリの命令セットの場合:
- GNUスーパーオプティマイザ(superopt)[11](GSO)(1992)[3] [4] – 他の多くのISAもサポート
- STOKE [12]はx86-64 x86アセンブリ言語用の確率的最適化装置[13]である。
- ARMの場合:
- 無制限スーパーオプティマイザ[5]はLLVM IRをARMv7-Aアセンブリに変換する
- 組み込みシステムの場合:
- PICマイクロコントローラスーパーオプティマイザ(2003)[14] [15]
- Embecosm (2014)によるAVRの実現可能性調査、GSOに基づく[16] [17]
- JVMの場合:
- LLVM IRの場合:
- souper [19] LLVM中間言語プログラム用のスーパーオプティマイザー。
- WebAssemblyの場合
- スランプ[20]は、スーパー最適化に基づくWASMプログラムのスーパー最適化を提供する。
参照
参考文献
- ^ Massalin, Henry (1987). 「スーパーオプティマイザ: 最小のプログラムの概要」(PDF) . ACM SIGARCH Computer Architecture News . 15 (5): 122–126. doi :10.1145/36177.36194 . 2023-05-01に取得。
命令セットが与えられると、スーパーオプティマイザは関数を計算するための最短のプログラムを見つけます。驚くべきプログラムが生成されましたが、その多くは関数を定義したソースプログラムとはほとんど似ていない複雑なビット操作を行っています。スーパーオプティマイザの重要なアイデアは、有用なサイズのプログラムに対して徹底的な検索を実用的にする確率テストです。
- ^ Joshi, Rajeev; Nelson, Greg; Randall, Keith (2002). 「Denali: 目標指向型スーパーオプティマイザー」ACM SIGPLAN Notices . 37 (5): 304–314. doi :10.1145/543552.512566.
- ^ ab Granlund, Torbjörn; Kenner , Richard. 「スーパーオプティマイザーと GNU C コンパイラを使用した分岐の除去」。プログラミング言語の設計と実装に関する ACM SIGPLAN 1992 会議の議事録 - PLDI '92。CiteSeerX 10.1.1.58.3509。doi : 10.1145 /143095.14314。ISBN 978-0-89791475-8. S2CID 8825539。
- ^ ab "Index of /gnu/superopt". GNU オペレーティングシステム。Free Software Foundation, Inc. 1995-06-14。2023-05-01閲覧。
- ^ ab Jangda , Abhinav; Yorsh, Greta (2017-10-25).無制限の超最適化。Onward!'17、2017年10月25~27日、バンクーバー、カナダ。pp. 78~88。doi :10.1145/3133850.3133856。
- ^ Joshi, Rajeev; Nelson, Greg; Randall, Keith (2001-07-30). 「Denali: 目標指向型スーパーオプティマイザー」. Compaq Systems Research Center. HP Labs . Hewlett-Packard Co. 2023-05-01に取得。
- ^ 「TOAST – KRRwiki」。コンピューターサイエンス学部、数学基礎グループ。知識表現と推論 (KRR) グループ。バース大学。2007-08-07。2012-11-28 にオリジナルからアーカイブ。2016-09-03に取得。
- ^ ブレイン、マーティン、クリック、トム、デ・ヴォス、マリーナ、フィッチ、ジョン (2006-08-17)。「TOAST: スーパー最適化への回答セットプログラミングの適用」。エタレ、サンドロ、トルシュチニスキ、ミロスワフ (編)。ロジックプログラミング。シュプリンガー出版。pp. 270–284。doi :10.1007/ 11799573_21。ISBN 978-3-540-36636-2。
- ^ Crick, Tom (2009). スーパー最適化: 回答セットプログラミングを使用した証明可能な最適コード生成 (博士論文). バース大学. 2024年11月15日閲覧。
- ^ Bansal, Sorav; Aiken, Alex (2006). 「ピープホールスーパーオプティマイザーの自動生成」(PDF) 。 2023年5月1日閲覧。
- ^ 「GNU スーパーオプティマイザー」。
- ^ StanfordPL. "STOKE". GitHub .
- ^ Bansal, Sorav; Aiken, Alex (2008). 「ピープホールスーパーオプティマイザーを使用したバイナリ変換」(PDF) 。 2023年5月1日閲覧。
- ^ Serpell, Daniel (2003). 「SuperOptimizer for Microchip's PIC microcontrollers」. Google Sites . 2016-10-11 にオリジナルからアーカイブ。2016-09-06に取得。
- ^ Serpell, Daniel (2003-06-21). 「PIC Microcontroller SuperOptimizer」. Freecode . Slashdot Media. 2016-09-17 にオリジナルからアーカイブ。2016-09-06に取得。
- ^ 「Embecosmによる実現可能性調査」。
- ^ スーパー最適化 – Embecosm ソースコード
- ^ Hume, Tom (2012-08-21). 「最適な Java プログラムを徹底的に検索する Clojure プログラム」. GitHub . 2018-06-10 にオリジナルからアーカイブ。2016-09-06に取得。
- ^ Sasnauskas, Raimondas; Chen, Yang; Collingbourne, Peter; Ketema, Jeroen; Lup, Gratian; Taneja, Jubi; Regehr, John (2017). 「Souper: 合成スーパーオプティマイザー」. arXiv : 1711.04422 [cs.PL].GitHub ソースコード
- ^ Cabrera Arteaga, Javier; Donde, Shrinish; Gu, Jian; Floros, Orestis; Satabin, Lucas; Baudry, Benoit; Monperrus, Martin (2020-03-23). WebAssembly バイトコードの超最適化。MoreVMs : 最新の言語ランタイム、エコシステム、VM に関するワークショップ。pp . 36–40。arXiv : 2002.10213。doi :10.1145/3397537.3397567。GitHub ソースコード
