0

私は少しのコードに取り組んでおり、可能な限り最適化しようとしています。基本的には、特定の制限時間内で実行します。

以下は呼び出しを行います...

static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);

...そして、以下が実行されます。

void operator()(const blocked_range<size_t> &r) const {

    int temp;
    int i;
    int j;
    size_t k;
    size_t begin = r.begin();
    size_t end = r.end();

    for(k = begin; k != end; ++k) { // for each trainee
        temp = 0;
        for(i = 0; i < N; ++i) { // for each sample
            int trr = trRating[k][i];
            int ei = E[i];              
            for(j = 0; j < ei; ++j) { // for each expert
                temp += delta(i, trr, exRating[j][i]);
            }
        }           
        myscore[k] = temp;
    }
}

これを最適化するために Intel の TBB を使用しています。しかし、SIMD や SSE2 など、その性質に沿ったものについても読んでいます。私の質問は、変数 (i、j、k) をレジスタに格納して、CPU がより高速にアクセスできるようにするにはどうすればよいかということです。答えはSSE2またはそのバリエーションの実装に関係していると思いますが、その方法がわかりません。何か案は?

編集:これはLinuxボックスで実行されますが、Intelのコンパイラを使用していると思います。それが役立つ場合は、何かを行う前に次のコマンドを実行して、コンパイラーが機能することを確認する必要があります... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ... そしてコンパイルするには: icc -ltbb test.cxx -o test

SSE2 を実装する簡単な方法がない場合、コードをさらに最適化する方法について何かアドバイスはありますか?

ありがとう、フリスト

4

4 に答える 4

1

C++ モジュール内でアセンブリ言語を使用する場合は、アセンブリ言語をasmブロック内に配置するだけで、ブロック外から変数名を引き続き使用できます。ブロック内で使用するアセンブリ命令asmは、操作対象のレジスタなどを指定しますが、プラットフォームによって異なります。

于 2010-04-29T16:59:01.127 に答える
1

あなたの質問は、何が起こっているのかについての混乱を表しています。i、j、k 変数は、最適化をオンにしてコンパイルしていると仮定すると、ほぼ確実に既にレジスターに保持されています (これを行う必要があります - icc 呼び出しに「-O2」を追加します)。

ブロックを使用することもできますasmが、既に ICC を使用していることを考えると、より簡単な方法は SSE 組み込み関数を使用することです。Intel のドキュメントはこちら - http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/comm1019.htm

関数が何であるかに大きく依存しますが、トップレベルのループを SIMD 化できるようですdelta

于 2010-04-29T17:08:50.153 に答える
0

GCC を使用している場合は、 http: //gcc.gnu.org/projects/tree-ssa/vectorization.htmlを参照して、コンパイラがコードを自動ベクトル化する方法と例を確認してください。

それ以外の場合は、使用しているプラ​​ットフォームをお知らせください。

于 2010-04-29T16:56:56.353 に答える
0

コンパイラがこれを行う必要があります。たとえば、VC++ では、SSE2 をオンにするだけです。

于 2010-04-29T17:42:49.890 に答える