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

最適化は、既存のプログラムを改善して、より効率的に、または/およびより少ないリソースを使用して動作させるプロセスです。

7
CPUではなくGPUに作業をオフロードする必要があるのはいつですか?
OpenCLなどの新しいシステムは、グラフィックプロセッサでより多くのコードを実行できるように作成されています。これは、システムで可能な限り多くのパワーを利用できるようにする必要があるためです。 ただし、これらすべての新しいシステムでは、あらゆる点でGPUがCPUよりも優れているようです。GPUは並列計算を実行できるため、マルチコアGPUは実際にはマルチコアCPUよりもはるかに優れているように見えます。一度に多くの計算を行うことができ、本当に速度が向上します。シリアル処理がパラレルよりも優れ、高速、かつ/または効率的である特定のケースがまだありますか?
15 optimization  cpu  gpu 

1
Haskellが単相性の制限なしに繰り返し評価を避けることができないのはなぜですか?
先日learnyouahaskellを終えたばかりで、Haskell Wikiで説明されているように、単相性制限の意味を理解しようとしていました。MRが繰り返し評価を防ぐ方法を理解していると思いますが、なぜこれらの繰り返し評価がはるかに簡単な手段で回避できないのかを理解できません。 私が念頭に置いている特定の例は、wikiで使用されているものです。 f xs = (len,len) where len = genericLength xs where genericLengthはタイプNum a => [b] -> aです。 明らかに、それは同じ引数を持つ同じ関数なのでgenericLength xs、評価するために一度だけ計算する必要があり(len,len)ます。そして、それをf知るために呼び出しを見る必要はありません。では、なぜHaskellはMRのようなルールを導入せずにこの最適化を行えないのでしょうか? そのwikiページの議論Numは、具体的な型ではなく型クラスであるという事実と関係があると言っていますが、それでも、コンパイル時に純粋な関数が同じ値を返すことは明らかではありません-したがって、同じ具体的なタイプのNum-同じ引数を2回与えたとき?

4
SIMDプログラミングコードベースのメンテナンスコスト
質問: ソフトウェア業界のコンセンサスは、クリーンでシンプルなコードが、コードベースとそれを所有する組織の長期的な実行可能性の基本であるということです。これらのプロパティにより、メンテナンスコストが削減され、コードベースが継続される可能性が高まります。 ただし、SIMDコードは一般的なアプリケーションコードとは異なります。SIMDコードに特に適用されるクリーンでシンプルなコードに関して、同様のコンセンサスがあるかどうかを知りたいと思います。 私の質問の背景。 さまざまな画像処理および分析タスクのために、たくさんのSIMD(単一命令、複数データ)コードを作成します。最近、これらの関数のいくつかを、あるアーキテクチャ(SSE2)から別のアーキテクチャ(ARM NEON)に移植しなければなりませんでした。 このコードはシュリンクラップされたソフトウェア用に記述されているため、MATLABなどの無制限の再配布権がなければ、独自の言語に依存することはできません。 典型的なコード構造の例: 使用のOpenCVのマトリックスタイプ(Mat)すべてのメモリのため、緩衝液および寿命管理。 入力引数のサイズ(次元)を確認した後、ピクセルの各行の開始アドレスへのポインターが取得されます。 ピクセルカウント、および各入力マトリックスからのピクセルの各行の開始アドレスは、いくつかの低レベルC ++関数に渡されます。 これらの低レベルC ++関数は、SIMD組み込み関数(Intel ArchitectureおよびARM NEON用)を使用して、生のポインターアドレスからの読み込みと保存を行います。 これらの低レベルC ++関数の特徴: 排他的に1次元(メモリ内で連続) メモリ割り当てを処理しません。(一時を含むすべての割り当ては、OpenCV機能を使用する外部コードによって処理されます。) シンボルの名前の長さの範囲(組み込み関数、変数名など)は約10〜20文字で、これは非常に過剰です。(テクノバブルのように読みます。) コンパイラは「単一割り当て」コーディングスタイルで記述されていないコードを正しく解析するのに非常にバグがあるため、SIMD変数の再利用は推奨されません。(私はいくつかのコンパイラのバグレポートを提出しました。) SIMDプログラミングのどの側面が議論を一般的な場合と異なるものにしますか?または、SIMDが異なるのはなぜですか? 初期開発コストの観点から 優れたパフォーマンスを備えたC ++ SIMDコードの初期開発コストは、カジュアルに記述された C ++コードと比較して、約10倍から100倍(マージンは大きい)であることはよく知られています。 パフォーマンスと読み取り可能/クリーナーコードの選択の回答で述べたように?、ほとんどのコード(カジュアルに記述されたコードとSIMDコードを含む)は、最初はクリーンでも高速でもありません。 (スカラーコードとSIMDコードの両方での)コードパフォーマンスの進化的な改善は推奨されません(ソフトウェアの一種と見なされるため)。コストと利点は追跡されません。 傾向の観点から (例えば、パレート原理、別名80-20ルール) 画像処理がソフトウェアシステムの20%(コードサイズと機能の両方)のみで構成されている場合でも、画像処理は(CPU時間の割合として見た場合)比較的遅く、80%以上の時間がかかります。 これは、データサイズの影響によるものです。典型的な画像サイズはメガバイト単位で測定されますが、非画像データの典型的なサイズはキロバイト単位で測定されます。 画像処理コード内で、SIMDプログラマーは、C ++コード内のループ構造を識別することにより、ホットスポットを含む20%コードを自動的に認識するように訓練されます。したがって、SIMDプログラマーの観点からは、「重要なコード」の100%がパフォーマンスのボトルネックです。 多くの場合、画像処理システムには複数のホットスポットが存在し、同等の割合の時間を消費します。たとえば、5つのホットスポットがそれぞれ合計時間(20%、18%、16%、14%、12%)を占める場合があります。高いパフォーマンスを実現するには、すべてのホットスポットをSIMDで書き換える必要があります。 これは、バルーンをポップするルールとして要約されています。バルーンを2回ポップすることはできません。 バルーンがいくつかあると仮定します。たとえば、そのうち5つです。それらを間引く唯一の方法は、それらを1つずつポップすることです。 最初のバルーンがポップされると、残りの4つのバルーンの合計実行時間の割合が高くなります。 さらに利益を上げるには、別のバルーンをポップする必要があります。(これは、最適化の80-20ルールに反します:ぶら下がりが最も少ない果物の20%が選ばれた後、良好な経済的結果を達成できます。) 読みやすさとメンテナンスの面で SIMDコードは、明らかに読みにくいです。 これは、すべてのソフトウェアエンジニアリングのベストプラクティス(ネーミング、カプセル化、const-correctness(および副作用の明確化)、関数の分解など)に従っても当てはまります。 これは、経験のあるSIMDプログラマーにも当てはまります。 最適なSIMDコードは、同等のC ++プロトタイプコードと比較して、非常にゆがんでいます(注意を参照)。 SIMDコードをゆがめる方法は数多くありますが、10回の試行のうち1回だけで許容可能な高速の結果が得られます。 (つまり、高い開発コストを正当化するために、4倍から10倍のパフォーマンスゲインを調整します。実際には、さらに高いゲインが観察されています。) …

11
コンパイラーがコードを壊したかどうか、そしてそれがコンパイラーだったらどうすればよいかを知るにはどうすればよいですか?
あるレベルの最適化でコンパイルすると、C ++コードが機能しない場合があります。それは、コードを壊す最適化を行っているコンパイラかもしれませんし、コンパイラが感じることなら何でもできるようにする未定義の振る舞いを含むコードかもしれません。 より高い最適化レベルでのみコンパイルされたときに壊れるコードの一部があるとします。コードまたはコンパイラーであるかどうか、またコンパイラーである場合はどうすればよいですか?

2
Antコロニーアルゴリズム
私はコースプロジェクトのためにアリコロニーシミュレーターに取り組んでいる学生です。そのアルゴリズムは(明らかに)蟻コロニーアルゴリズムです。アルゴリズムにはさまざまな形式がありますが、それらはすべて数学的に詳細すぎるため、次のようなアプローチを採用しました。 アリはコロニーで生まれ、コロニーを維持するために源から食物を集めなければなりません。 すべてのアリは似ています。 アリが移動する領域は1000x1000グリッドであるため、すべてのグリッドポイントはアリが占有する有効なポイントとして機能します。今、私が遭遇したすべてのアルゴリズムは、頂点とエッジを別々に処理することを伴いますが、アリの動きを4方向(上下左右)に制限しているので、フェロモンをどこに置くかは関係ないと思います。 上記のグリッドポイントはフェロモンを保存します。 アリは、食物を運んでいる場合にのみフェロモンを落とします。 位置(i、j)のアリの場合、4つの隣接ノードのフェロモン量を単純な確率式で考慮することにより、次のステップでどこに移動するかを決定します。つまり、ノードに移動する確率は(特定の隣接ノードのフェロモン量)/(4つの隣接ノードのフェロモン量の合計)。 アリは、元の位置に戻ることはできません。それができるのは、食物がある場所にいるか、そのコロニーにいる場合だけです。 今、私の懸念は(そしてプログラムで実際に何が起こっているのか)アリFIRSTが食物のある位置に到達し、それを拾うと、アルゴリズムが機能する方法で、どこにでも移動できることです!これは、フェロモントレイルを離れるのは、餌を食べる前ではなく、最初のアリであるため、既存のトレイルがないためです。 アリがどこにでも移動できる場合、食物源に到達したアリは、ほとんどそれに従う傾向があります。コロニーに向かって戻っていない場合でも。これは、アルゴリズム全体の目的に反します。 だから私の質問は 上記の懸念は有効ですか?いいえの場合、なぜですか?はいの場合、どのように対処しますか? 実際に機能させるために、アルゴリズムの基本的な理解を変更する必要がありますか? 私のような初心者がこの場合見逃すかもしれない他の微妙でありながら重要なことは何ですか?

4
CPUキャッシュ(C)を最適化する際に重要なことは何ですか?
これら 2つの質問を読んで、メモリ内の大量のデータを扱う場合、CPUキャッシュの動作を理解することが重要になることがわかります。最適化ツールボックスに別のツールを追加するためのキャッシュの仕組みを理解したいと思います。 CPUキャッシュがうまく機能するように、キャッシュを賢明に使用するコードを書くことができる中核となる点は何ですか?これに関連して、コードのプロファイルを作成して、キャッシュの使用が悪いために速度が低下していないかどうかを確認する方法はありますか?

3
Webのベストプラクティスが常に大企業に違反している場合、これは非常に重要ですか?
通常、ウェブサイトの最適化、新規顧客の獲得、一般的にはサーバーの負荷を軽減しながら、ユーザーエクスペリエンスを高速、スムーズ、快適にするためのルールとベストプラクティスが多数あります。 また、通常、大企業はこれらのベストプラクティスを使用することを気にしません。いくつかの企業(Googleなど)を除き、最大のWebサイトでは、次のことがわかります。 テーブルレイアウト、縮小されたJavaScriptではなく、CSSスプライトはありません、いくつかのCSSファイル、邪魔にならないことが簡単な場合でも侵入型JavaScript <head/>、などでJavaScriptファイルを呼び出します。 無意味なエラー、迷惑なポップアップ、膨大な量のフィールドを含む登録フォーム、登録上のUXの問題¹、ウェブサイトの使用を不可能にする愚かな質問や状況²、ウェブサイトの重要な部分の混乱状況³、複数のリダイレクト、遅いページなど。 一方で、これらの企業は、その成功が部分的または完全にウェブサイトに依存しているため、ウェブサイトの開発、最適化、ホストに莫大なお金を払っています。一方で、彼らは常にベストプラクティスに違反している一方で、それらのベストプラクティスを支持する人々は、それらに従うことで、より良いUXと、より少ないフットプリントでより高速なWebサイト(数千台のサーバーでホストされているWebサイトでは無視できない)を達成できると説明しています。 そのような場合、次のことを尋ねるのが論理的です。 本当に成功している大企業が、ウェブサイトと有能な従業員に多額の資金を持ち、ウェブサイトの最適化を重視する企業が常にベストプラクティスに違反している場合、それらのベストプラクティスは真実ですか? または、言い換えれば、これらのベストプラクティスが非常に重要であり、Webサイトの最適化に非常に役立つ場合、それらの企業がそれらを気にしないのはなぜですか? Dell.comの例を見てみましょう。私は彼らがホームページを作成するために最高の最高を雇うと確信しています。彼らのホームページはテーブルレイアウトを使用しています。テーブルのレイアウトが悪いと言う人は間違っているということですか?デルが採用した最高の最高の人材が無能であることを意味していますか? ¹最初の例:eBayは、登録時に両方のフィールドにメールアドレスを貼り付けることを不可能にし、迷惑なユーザー以外は理由なく登録フォームを使用することを長くします。ベストプラクティスは、コピーを禁止することですが、貼り付けを許可することです。2番目の例:Microsoft Liveは、パスワードの長さを16文字に制限していますが、明確な理由はまったくありません。 ²たとえば、非常に長い間Amazonにアクセスしていない場合、パスワードが無効であると表示され、その後、パスワードを回復するために、最後のトランザクションに関する情報が要求されます。アカウントで以前に取引を行ったことはありません。 ³たとえば、デルでは、ハードディスクなしでラックサーバーを注文することを不可能にしていますが、再利用したいハードディスクがすでにある場合、これは完全に有効です。 ⁴このような最適化には、最も重要なコンテンツをより速く送信するための部分フラッシュ、ページの読み込みを待機しているユーザーが費やした時間とWebサイトを使用して いるユーザー数との関係に関する調査などが含まれます。Dell Dell、Microsoftなど。 e eBayまたはその他のWebベースの企業について。

1
マイクロフロントエンドでパイプに送信される冗長コード
マイクロフロントエンドの私の理解は、彼らが解決する重要な問題は、企業が複数の可能な異なるチームを持ち、大規模なWebアプリケーションを構成するために使用される個々のコンポーネント/スモールアプリで作業するのを支援することです。 ここで解決されている重要な問題は、複数のチームが独立して作業し、大規模なコンポジットを構築できる能力です。問題は、エンドユーザー向けに無駄のないリリースバンドルを用意することではありません。その理解は正しいですか? 大きなWebアプリケーションを作成するために複数のスモールアプリを使用している場合、同じJavascriptライブラリ(Lodashなど)をエンドユーザーのブラウザーに配送する複数のスモールアプリを潜在的に含めることができるというのは本当ですか?個々のベンダーバンドルは、ある程度の重複/冗長コードがユーザーに送信される原因になりますか? これは、フロントエンドアプリケーションの設計中に心配する必要がある問題ではありませんか?

6
コンパイラがすべてをインライン化しないのはなぜですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 コンパイラはインライン関数呼び出しを行う場合があります。つまり、呼び出された関数のコードを呼び出し元の関数に移動します。これにより、コールスタックのオン/オフを切り替える必要がないため、処理が少し速くなります。 だから私の質問は、なぜコンパイラはすべてをインライン化しないのですか?実行可能ファイルが著しく高速になると思います。 私が考えることができる唯一の理由は、実行可能ファイルが非常に大きいことですが、最近では何百GBものメモリが必要なのでしょうか?パフォーマンスの向上はそれだけの価値はありませんか? コンパイラがすべての関数呼び出しをインライン化しない他の理由はありますか?

4
コードベースが均一に遅くなることに対するアプローチ
適度なサイズのC ++コードベース(10Mloc)に取り組んでいますが、最適化の取り組みにより均一に遅くなっています。 このコードベースは、機能させるために組み合わせるライブラリのセットです。これらのライブラリが通信する方法の一般的なフレームワークが開発されたとき、パフォーマンスに重点が置かれ、後で追加された部分が増えても、一般的なフレームワークはあまり変更されませんでした。最適化は、必要なときに、ハードウェアの進化とともに行われました。これにより、高価な早期決定が明らかになったのはかなり後のことです。コードベースの大部分を書き直す必要があるため、さらなる最適化ははるかに高価になります。原則として、コードははるかに高速に実行できるはずであることがわかっているため、望ましくないローカルミニマムに近づいています。 簡単な最適化の機会によって簡単に混同されない、グローバルに最適なパフォーマンスのソリューションへのコードベースの進化を引き継ぐために何が変わるかを決定するのに役立つ成功した方法論はありますか? 編集 現在のプロファイリング方法に関する質問に答えるには: 実際、このコードを使用する方法は2つだけあり、どちらも恥ずかしいほど並行しています。プロファイリングは、大量の入力サンプルで平均化されたウォールクロック時間と、より詳細な実行(命令コスト、分岐予測ミス、キャッシュの問題)の両方で行われます。これは非常に均質なマシン(数千の同一マシンのクラスター)でのみ実行されるため、うまく機能します。私たちは通常、すべてのマシンをほとんどの時間、高速で稼働させているため、追加の新しいものを見ることができます。もちろん、問題は、新しい入力バリエーションが現れたときに、他のユースケースで最も明らかな非効率性を取り除き、「最適に実行される」シナリオの数を絞り込む可能性があるため、後期のペナルティが発生する可能性があることです。
11 c++  optimization 

4
「認識を超えて最適化された」計算負荷の高いコードを文書化して教える方法は?
時折、最も重い種類の低レベルの最適化を必要とする十分に計算集約的なコードの1%があります。一般的な例としては、ビデオ処理、画像処理、およびあらゆる種類の信号処理があります。 目標は、コードが保守不能になったり、新しい開発者によって削除されたりしないように、最適化手法を文書化し、教えることです。(*) (*)予測できない将来のCPUで特定の最適化が完全に役に立たない可能性があるにもかかわらず、コードは削除されます。 ソフトウェア製品(商用またはオープンソース)が最速のコードを持ち、最新のCPUアーキテクチャを使用することで競争上の優位性を保持していることを考えると、ソフトウェア作成者は特定の同じ出力を取得しながらコードを微調整する必要があることがよくあります少量の丸め誤差を許容するwhlist。 通常、ソフトウェアライターは、実行される各最適化/アルゴリズムの書き換えのドキュメントとして、関数の多くのバージョンを保持できます。これらのバージョンを他の人がどのようにして最適化手法を研究できるようにするのですか? 関連: 読みやすいコードと読みにくいコード。いつ線を越えるか?

3
エレベーターのアルゴリズムと実装[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 (実際の)エレベーターの仕組みを知りたかった。しかし、これまでのところ、私は彼らが使用するアルゴリズムに関する多くの資料も、シミュレーション用のソフトウェア(もしあれば)を見つけることができませんでした。誰かが私にその参考文献を教えてもらえますか?

5
C ++での冗長文字列割り当ての最適化
パフォーマンスが問題となっているかなり複雑なC ++コンポーネントがあります。プロファイリングは、実行時間のほとんどがstd::stringsのメモリの割り当てに費やされていることを示しています。 これらの文字列には多くの冗長性があることを知っています。一握りの値は非常に頻繁に繰り返されますが、固有の値もたくさんあります。文字列は通常かなり短いです。 私は今、それらの頻繁な割り当てを何らかの形で再利用することが理にかなっているのかどうか考えています。1000の異なる「foobar」値への1000のポインターの代わりに、1つの「foobar」値への1000のポインターを持つことができます。これによりメモリ効率が向上するという事実は素晴らしいボーナスですが、ここでは主に待機時間について心配しています。 すでに割り当てられた値のある種のレジストリを維持することは1つのオプションだと思いますが、レジストリの検索を冗長なメモリ割り当てよりも高速にすることは可能ですか?これは実行可能なアプローチですか?

5
小さなオブジェクトの作成を最小限に抑える必要がありますか?
多数の(1000を超える)小さなオブジェクトを頻繁に作成するものを作成する場合、パフォーマンスのためにそれを最小化する必要がありますか?特に、ローエンドからハイエンドのデスクトップ、さらにはモバイルまで、どのシステムで実行されるかわからない場合。モバイルの場合、多くのオブジェクトを作成するとパフォーマンスが少し低下すると聞きましたが、それがどれほど本当かはわかりません。 この考えをよく示す例があります。グラフィックプログラムでは、理想的にはと呼ばれるすべての描画に使用されるメソッドがあるとしましょうdrawPixel(Point)。1秒間に60回以上呼び出される可能性のあるゲームのように、作成されるポイントは1000になり、頻繁に繰り返される場合があります。または、drawPixel(int x, int y)多くのポイントオブジェクトの作成を最小限に抑えるために使用できます。 オブジェクト指向の設計では、Pointを使用することをお勧めします。ただし、プリミティブ型を使用するとパフォーマンスが向上する場合があります。ほとんどの場合、パフォーマンスの向上はごくわずかですが、モバイルマシンや古いマシンなどについてはよくわかりません。このようなことを行うことによるパフォーマンスの向上は何ですか?それは考慮に入れられるべきものですか?

7
スケーラビリティについて考え始めるのはいつですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 面白いけどひどい問題があります。新しい(iPhone)アプリを起動しようとしています。これは、自分のカスタムバックエンドで実行されるターンベースのマルチプレイヤーゲームです。しかし、私は立ち上げることを恐れています。 どういうわけか、私はそれが何か大きなものになるかもしれないと思います、そしてその人気は私の貧しい孤独な単一サーバー+ MySQLデータベースを殺すと思います。 一方では、それが成長している場合は、準備を整えて、スケーラブルなインフラストラクチャーをすでに準備しているほうがよいと考えています。 一方、私はそれを世界に送り出し、何が起こるかを見たいと思っています。 私は「時期尚早な最適化がすべての悪の根源である」などの記事をよく読んだり、ツールを手元に置いて今すぐキラーゲームを構築し、後でスケーラビリティなどの他のことについて心配するべきだと言っています。 私はこれについて専門家やこれを経験した人からこれについていくつかの意見を聞きたいです。ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.