タグ付けされた質問 「program-optimization」

コンパイラなどで、手動と自動の両方でプログラムのパフォーマンスを最適化する方法に関する質問。

4
0-1行列ベクトル乗算の自動最適化
質問: 行列が密で、ゼロと1だけで満たされている場合、行列ベクトル乗算を効率的に適用するコードを生成するための手順または理論は確立されていますか?理想的には、最適化されたコードは、以前に計算された情報を体系的に使用して、重複する作業を減らします。 つまり、行列 あり、に基づいて事前計算を行い、後でベクトル受け取ったときにを可能な限り効率的に計算します。MMMMMMMvMvMvvvv MMMは「コンパイル時」に知られている長方形の密なバイナリマトリックスであり、は「実行時」にのみ知られている未知の実数ベクトルです。vvv 例1:(スライディングウィンドウ) 簡単な小さな例を使用して、私のポイントを説明します。、行列を考える この行列をベクトルに適用してを取得するとします。結果のエントリは、 M= ⎡⎣⎢⎢⎢11111111111111111111⎤⎦⎥⎥⎥。M=[11111111111111111111].M = \begin{bmatrix}1 & 1 & 1 & 1 & 1\\ & 1 & 1 & 1 & 1 & 1 \\ & & 1 & 1 & 1 & 1 & 1\\ & & & 1 & 1 & 1 …

1
プログラムを終了するためのコンパイラを完全に最適化していますか?
Andrew W. Appelの著書「MLのModern Compiler Implementation」では、第17章で、計算可能性理論は新しい最適化変換を発明することが常に可能であることを示し、完全に最適化するコンパイラーが停止する問題を解決することを証明することに進むと述べています:プログラム出力を生成せず、停止しないQは、最適な表現であるOpt(Q)に簡単に置き換えることができ、「L:goto L」です。したがって、完全に最適化されたコンパイラは、停止する問題を解決できます。 だから私の質問はこれです:プログラムを終了するための完全に最適化されたコンパイラは存在しますか?私の唯一の考えは次のとおりです。プログラムは終了することが保証されていますが、それはまだ任意に複雑である可能性があり、具体的な最適化コンパイラCの場合、おそらくCを入力として受け取り、何らかの形でより悪いプログラムを生成するプログラムを構築できますある種のコーナーケース。 また、自分自身をプログラムの終了に制限することの意味は何ですか?

12
文字列間の違いをすばやく見つけるためのデータ構造またはアルゴリズム
私はすべて長さの100,000文字列の配列を持っています。各文字列を他のすべての文字列と比較して、2つの文字列が1文字異なるかどうかを確認します。現時点では、各文字列を配列に追加するときに、配列内の既存のすべての文字列に対してチェックしています。これは、時間の複雑さを持っています。kkkn (n − 1 )2kn(n−1)2k\frac{n(n-1)}{2} k 私がすでにやっていることよりも速く文字列を互いに比較できるデータ構造またはアルゴリズムはありますか? 追加情報: 注文事項は:abcdeとxbcdeしながら、1つの文字によって異なるabcdeとedcba4つの文字で異なります。 1文字異なる文字列のペアごとに、それらの文字列の1つを配列から削除します。 現在、私は1文字だけ異なる文字列を探していますが、その1文字の差を、たとえば2、3、または4文字に増やすことができればいいと思います。ただし、この場合、文字差の制限を大きくする能力よりも効率のほうが重要だと思います。 kkkは通常20〜40の範囲です。

2
多くの業界で使用されているコンパイラで、継続渡しスタイルよりも静的単一割り当てが優先されるのはなぜですか?
静的単一割り当て(SSA)に関するウィキペディアのページによると、SSAはLLVM、GCC、MSV、Mono、Dalvik、SpiderMonkey、V8などの大規模で有名なプロジェクトで使用されていますが、継続渡しスタイルを使用するプロジェクトのページ(CPS)は比較して少し欠けています。 私は、CPSが主に機能言語を実装するコンパイラーとインタープリターによって好まれるというこの考えを持っています-特に、HaskellとSchemeは、突然変異の制限またはファーストクラスの継続サポートの必要性のために、CPSスタイルに強い傾向があるようです(私は推測します) Smalltalkでもこれが必要になる可能性があります)。私がCPSを使用している主要な文献は、主にSchemeに取り組んでいるか、何らかの点でSchemeに関連している文献のようです。 採用の勢いのほかに、SSAが業界で使用される特別な理由はありますか?SSAとCPSは密接な関係があります。つまり、別の観点から述べることは簡単ですが、情報表現はCPSにとってはコンパクトであるか、効率が低い可能性があります。

2
consのどのプロパティにより、末尾再帰モジュロconsを排除できますか?
私は、基本的な末尾再帰除去の考え方に精通しています。そこでは、呼び出し自体の直接の結果を返す関数を反復ループとして書き直すことができます。 foo(...): # ... return foo(...) また、特別な場合として、再帰呼び出しがの呼び出しでラップされている場合、関数を書き換えることができることも理解していconsます。 foo(...): # ... return (..., foo(...)) これをcons許可するプロパティは何ですか?cons再帰的な末尾呼び出しを繰り返し書き換える能力を損なうことなく折り返すことができる以外の機能は何ですか? GCC(Clangではない)は、この「末尾再帰モジュロ乗算」の例を最適化できますが、どのメカニズムがこれを発見できるのか、またはどのように変換するのかは不明です。 pow(x, n): if n == 0: return 1 else if n == 1: return x else: return x * pow(x, n-1)

5
OS設計で消費電力を削減できるのはなぜですか?
私は、AndroidやiOSのようなOSがバッテリー寿命を改善するために何らかの形で最適化されていることを読みました。 私の理解では、私はあなたが必要な操作の数を減らすことによって、アプリケーションをスピードアップすることができると思いますので、CPUは、一定時間内に操作が一定数を実行していることですが、CPUがまだ行いますので、Xに操業をyの時、それはいけません力に影響? また、プロセスがより多くのRAMを使用する場合、それはより多くの電力を消費しますか?

1
編集距離計算のためのマイクロ最適化:それは有効ですか?
上ウィキペディア、編集距離のためのボトムアップの動的プログラミングスキームの実装が与えられています。それは完全に定義に従っていません。内部セルはこうして計算されます: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } ご覧のとおり、一致がある場合、アルゴリズムは常に左上隣から値を選択し、一部のメモリアクセス、ALU操作、および比較を保存します。 ただし、削除(または挿入)の結果、値が小さくなる可能性があるため、アルゴリズムはローカルで正しくありません。つまり、最適性の基準に違反しています。しかし、おそらく間違いは最終結果を変えない-それはキャンセルされるかもしれない。 このマイクロ最適化は有効ですか、そしてなぜ(そうではない)のでしょうか?

3
データフロー分析、抽象的な解釈、および型推論の同等性?
最近の質問に対する @Babouの回答は、データフロー分析の同等性(推論または証明できる事実と推論アルゴリズムを実行する時間の複雑さの両方の観点から)に関する論文を読んだことを思い出します、抽象解釈、および型推論。 一部のサブケース(フォワードコンテキスト依存の手続き間データフロー分析と抽象的な解釈の間など)では、同等性は私には比較的明白ですが、他の比較については問題がより微妙に思えます。たとえば、Hindley-Milner型推論を使用して、フロー依存のデータフロー分析で証明できるいくつかのプロパティを証明する方法を理解できません。 データフロー分析、抽象的な解釈、および型推論の間の同等性(または違い)について議論している独創的なリファレンスは何ですか?

1
例外のあるデータフロー分析
データフロー分析は、制御フローグラフに対して機能します。検討中の言語が例外をサポートしている場合、制御フローグラフが爆発する可能性があります。 この爆破に対処するための標準的なテクニックは何ですか?例外によって引き起こされたエッジを完全に無視できますか?とにかく、データフロー分析は過剰近似を計算するので、精度は落ちますが適切なソリューションになります。これは本当ですか? 更新:最後に掘り下げることができたいくつかの便利なリンクを次に示します。 例外処理構造を持つプログラムの分析とテスト Javaプログラムの分析のための例外の効率的で正確なモデリング

1
参照リクエスト:事前に安全性チェックを実行して、動的言語のリストの手順を最適化する
science fairプロジェクトでは、Pythonのソートルーチンの最適化を実装しました。アイデアは、各比較中に実行する必要がある安全性チェック(タイプチェックや文字幅チェックなど)をソートループの外に移動し、それらすべてを1つのパスで実行することです。次に、チェックの結果に基づいて、ポートフォリオから最適化された比較関数が選択されます。したがって、たとえば、チェックですべてのオブジェクトが同じタイプであると判断された場合、選択された比較関数は、通常必要な「オブジェクトタイプの互換性がある」チェックをスキップできます。等。 私はこれを論文として書き上げる必要があり、現在文献レビューに取り組んでいます。他の動的言語/一般的に同様の手法を説明した論文はありますか?

1
クリティカルエッジを分割すると便利なのはいつですか?
一部のコンパイラには、制御フローグラフの重要なエッジを分割するユーティリティ関数があります。これはそれ自体最適化としてではなく、他の分析と変換を単純化するために行われていると思います。クリティカルエッジの分割が役立つのはどのような場合ですか?

3
コンパイラーは、配列への交互アクセスを検出してメモリーにインターリーブできますか?
配列が別の方法でアクセスされるループを最適化するコンパイラを設計することは可能ですか?たとえば、次のようになります。 // int[] a,b int sum = 0; for(int i = 0; i < n; i++) { sum += a[i] + b[i]; } 通常のシーケンシャルアレイ装置と、a[i]及びb[i]互いに離れメモリであってもよいです。したがって、優れたコンパイラ最適化はそれを検出しa[i]、b[i]常に「同時に」アクセスされることを検出し、インターリーブされた配列を格納します。a[0] b[0] a[1] b[1] ...つまり、1つのメモリアクセスでa[i]との両方を取得できますb[i]。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.