2016-04-09 17 views
-2

こんにちは私は何かの「次」を私に与えることになっている関数を最適化するために自分の道を進んでいます。これまでのところ、私が持っているものを関数を高速化するためにループを算術に変換する

int fun(int a){ 
    const int k = ...; 
    for(;test_value(a++) != k;); 
    return a; 
    } 

これは私のアルゴリズムは、実際に働いたことをテストするために迅速かつ汚い方法でしたが、今、その後、私はループが反復ごとに分岐するためのテスト(そうでない場合は、コンパイラを作ることを心配しています舞台裏でそれを扱うのはとても良いですか?)。テストを実行するチャンスが最大で1/5、最悪の場合は100万であるが、test_valueは単なるクロックサイクルであるということを言う。 CPUパイプラインをよりうまく利用するために、私のコンパイラが算術演算を伴うすべてのブランチを手伝うのに役立つシステマティックな方法はありますか?

+0

あなたは 'test_value'が何であるかに依存しないと思いますか? –

+0

分岐の危険なしにわずか数サイクルで実行する必要がある機能です。現代の機械にSSE命令として存在する可能性があります。 – mathreadler

答えて

1

あなたは「アンロール」ことができ、あなたのループビット、のようなもの:

int nomatch = 1; 
while(nomatch){ 
    nomatch = (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
} 

これは、より少ない繰り返しをもた​​らすであろう、との一致が発見された後に短絡がtest_valueの評価を防止するであろう。

元のコードと同じように、これはある時点で一致が見つかることを前提としています。

+0

素晴らしいアイデアは、私が解決策を見つけるのを助けました。 – mathreadler

関連する問題