私は少しのコードに取り組んでおり、可能な限り最適化しようとしています。基本的には、特定の制限時間内で実行します。
以下は呼び出しを行います...
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 を実装する簡単な方法がない場合、コードをさらに最適化する方法について何かアドバイスはありますか?
ありがとう、フリスト