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

最適化とは、方法または設計を改善することです。プログラミングでは、最適化は通常、アルゴリズムの速度を上げるか、必要なリソースを減らすという形を取ります。最適化のもう1つの意味は、機械学習で使用される数値最適化アルゴリズムです。


22
設定されている最下位ビットの位置
整数に設定されている最下位ビットの位置を決定する効率的な方法を探しています。たとえば、0x0FF0の場合は4になります。 簡単な実装は次のとおりです。 unsigned GetLowestBitPos(unsigned value) { assert(value != 0); // handled separately unsigned pos = 0; while (!(value & 1)) { value >>= 1; ++pos; } return pos; } それからいくつかのサイクルを絞る方法はありますか? (注:この質問は、そのようなことを楽しむ人のためのものであり、xyzoptimizationは悪だと言われるためのものではありません。) [編集] アイデアをありがとう!他にもいくつかのことを学びました。涼しい!

27
Cで整数の最上位セットビット(msb)を見つけるための最速/最も効率的な方法は何ですか?
整数nがあり、最上位ビットの位置を知りたい場合(つまり、最下位ビットが右側にある場合、1である左端のビットの位置を知りたい)、見つけるための最も速く/最も効率的な方法は何ですか? 私はPOSIX ffs()が最初のセットビットを見つけるためにstrings.hのメソッドをサポートしていることを知っていますが、対応するものがないようですfls()メソッド。 これを行うための本当に明らかな方法はありますか? 移植性のためにPOSIX関数を使用できない場合はどうですか? 編集:32ビットと64ビットの両方のアーキテクチャで機能するソリューションについてはどうですか(多くのコードリストは32ビットの整数でしか機能しないように見えます)。



3
C ++コンパイラがこの条件付きブール割り当てを無条件割り当てとして最適化しないのはなぜですか?
次の関数について考えてみましょう。 void func(bool& flag) { if(!flag) flag=true; } flagに有効なブール値がある場合、これは次のように無条件にを設定することtrueと同じであるように思えます。 void func(bool& flag) { flag=true; } しかし、gccもclangもこのように最適化していません—どちらも-O3最適化レベルで次のものを生成します。 _Z4funcRb: .LFB0: .cfi_startproc cmp BYTE PTR [rdi], 0 jne .L1 mov BYTE PTR [rdi], 1 .L1: rep ret 私の質問は、コードが特別な場合に最適化することflagができないということvolatileですか、それとも参照が参照されていないので、そのような最適化が望ましくない理由があるのですか?それを読んだ時点で未定義の動作なしにflag何らかの方法で非true-または- false値が存在する可能性があることが唯一の理由のようですが、これが可能かどうかはわかりません。
117 c++  optimization 

30
コンパイラ/オプティマイザがより高速なプログラムを作成できるようにするコーディングプラクティス
何年も前、Cコンパイラはそれほど賢くありませんでした。回避策としてK&Rがregisterキーワードを考案し、コンパイラーにヒントを与えるために、この変数を内部レジスターに保持することをお勧めします。彼らはまた、より良いコードの生成を支援するために三次演算子を作りました。 時間の経過とともに、コンパイラは成熟しました。フロー分析により、レジスタにどの値を保持するかを、ユーザーが実行できるよりも適切に決定できるという点で、非常に賢くなりました。registerキーワードは重要ではなくなりました。 FORTRANは、エイリアスの問題により、ある種の操作ではCよりも高速になる場合があります。理論的には、注意深くコーディングすれば、オプティマイザがより高速なコードを生成できるように、この制限を回避できます。 コンパイラ/オプティマイザがより高速なコードを生成できるようにするために、どのようなコーディングプラクティスを利用できますか? 使用するプラットフォームとコンパイラを特定していただければ幸いです。 なぜテクニックはうまくいくように見えるのですか? サンプルコードが推奨されます。 ここに関連する質問があります [編集] この質問は、プロファイルを作成して最適化するプロセス全体に関するものではありません。プログラムが正しく記述され、完全に最適化されてコンパイルされ、テストされ、本番環境に導入されていると想定します。コード内に、オプティマイザが可能な最善の仕事をすることを禁止する構成要素があるかもしれません。これらの禁止事項を取り除き、オプティマイザがさらに高速なコードを生成できるようにするには、リファクタリングに何ができますか? [編集] オフセット関連リンク

4
std :: swap()をオーバーロードする方法
std::swap()並べ替えや割り当ての際に、多くのstdコンテナ(std::listおよびなどstd::vector)で使用されます。 ただし、のstd実装swap()は非常に一般化されており、カスタムタイプに対しては非効率的です。 したがってstd::swap()、カスタムタイプ固有の実装でオーバーロードすることで効率を上げることができます。しかし、どのように実装すれば、標準コンテナで使用できますか?

13
C ++では、わざわざ変数をキャッシュするか、コンパイラーに最適化を行わせる必要がありますか?(エイリアシング)
次のコードを考えてみてください(これpは型unsigned char*でbitmap->widthあり、整数型であり、正確には不明であり、使用している外部ライブラリのバージョンに依存します)。 for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } それを最適化する価値があります[..] これにより、次のように書くことでより効率的な結果が得られる場合があります。 unsigned width(static_cast<unsigned>(bitmap->width)); for (unsigned x = 0; x < width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } ...または、コンパイラが最適化するのは簡単ですか? 「より良い」コードは何だと思いますか? 編集者からのメモ(Ike):取り消しテキストについて疑問に思っている方のために、元の質問は、フレーズどおり、トピックから外れた領域に危険なほど近く、肯定的なフィードバックにもかかわらず非常に閉じていました。これらは打たれました。ただし、質問のこれらの被害を受けたセクションに対応した回答者を罰しないでください。

14
JPEG最適化のためのツール?[閉まっている]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 3年前休業。 この質問を改善する ビルド環境に統合できるJPEGを自動的かつ可逆的に最適化するためのツール(できればコマンドライン)を知っていますか?PNGの場合、私は現在PNGOUTを使用しており、通常、帯域幅/画像サイズを約40%節約します。 少なくとも、JPGからメタデータを取り除くことができるツールが欲しいのですが、写真からサムネイルを作成しようとして、34 kBより小さくできないという奇妙なケースに気付きました。さらに調査したところ、EXIFデータはまだ画像の一部であり、メタデータを削除した後のサムネイルは3 kBであることがわかりました。 そしてそれ以上に-JPGをロスレスでさらに最適化することは可能ですか?PNGオプティマイザは、さまざまな圧縮戦略、ハフマンエンコーディングのランダムな初期化などを試みます。 ほとんどの節約はJPEGの品質パラメーターによるものであり、それはかなり主観的な尺度であることを認識しています。私は、ビルドステップとして実行でき、画像から数バイトをロスレスで圧縮するツールを探しています。
114 optimization  jpeg 

3
CUDAカーネルのグリッドとブロックの次元を選択するにはどうすればよいですか?
これは、CUDAグリッド、ブロック、およびスレッドのサイズを決定する方法に関する質問です。これは、ここに投稿された質問に対する追加の質問です。 このリンクをたどると、talonmiesからの回答にコードスニペットが含まれます(以下を参照)。「チューニングとハードウェアの制約によって通常選択される値」というコメントを理解できません。 CUDAのドキュメントで、これを説明する適切な説明や説明が見つかりませんでした。要約すると、私の質問はblocksize、次のコードが与えられたときに最適な(スレッドの数)を決定する方法です。 const int n = 128 * 1024; int blocksize = 512; // value usually chosen by tuning and hardware constraints int nblocks = n / nthreads; // value determine by block size and total work madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);

6
.NET / C#が末尾呼び出しの再帰に対して最適化しないのはなぜですか?
どの言語が末尾再帰を最適化するかについて、この質問を見つけました。なぜC#は可能な限り末尾再帰を最適化しないのですか? 具体的なケースでは、なぜこのメソッドがループに最適化されていないのですか(Visual Studio 2008 32ビット、重要な場合)?: private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); }

3
コメントのみが変更されたプログラムの2つのバイナリがgccで正確に一致しないのはなぜですか?
2つのCプログラムを作成しました プログラム1 int main() { } プログラム2 int main() { //Some Harmless comments } 私の知る限り、コンパイルするとき、コンパイラ(gcc)はコメントと冗長な空白を無視する必要があるため、出力は類似している必要があります。 しかし、出力バイナリのmd5sumsを確認したところ、一致していません。また、最適化-O3を使用してコンパイルしようとしました-Ofastが、それでも一致しませんでした。 ここで何が起きてるの? 編集:正確なコマンドとそこにあるmd5sumsがあります(t1.cはプログラム1であり、t2.cはプログラム2です) gcc ./t1.c -o aaa gcc ./t2.c -o bbb 98c1a86e593fd0181383662e68bac22f aaa c10293cbe6031b13dc6244d01b4d2793 bbb gcc ./t2.c -Ofast -o bbb gcc ./t1.c -Ofast -o aaa 2f65a6d5bc9bf1351bdd6919a766fa10 aaa c0bee139c47183ce62e10c3dbc13c614 bbb gcc ./t1.c -O3 -o aaa gcc …


4
結果が何であれ、ゼロによる除算をサポートする最も速い整数除算は何ですか?
概要: 計算する最速の方法を探しています (int) x / (int) y の例外を得ることなくy==0。代わりに、任意の結果が必要です。 バックグラウンド: 画像処理アルゴリズムをコーディングするとき、私はしばしば(累積された)アルファ値で除算する必要があります。最も単純なバリアントは、整数演算を行うプレーンCコードです。私の問題は、通常、を使用した結果ピクセルに対してゼロ除算エラーが発生することalpha==0です。ただし、これは正確に結果がまったく問題にならないピクセルalpha==0です。のピクセルのカラー値は気にしません。 詳細: 私は次のようなものを探しています: result = (y==0)? 0 : x/y; または result = x / MAX( y, 1 ); xとyは正の整数です。コードはネストされたループで膨大な回数実行されるため、条件付き分岐を取り除く方法を探しています。 yがバイト範囲を超えない場合、私は解決策に満足しています unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 }; [...] result = x / …

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