0

私はいくつかの C コードを分析して最適化するつもりなので、最初に、最適化したい関数がメモリ バウンドか CPU バウンドかを確認する必要があります。一般に、これを行う方法はわかっていますが、浮動小数点演算のカウントと使用されるデータのサイズの分析についていくつか質問があります。分析したい次の for ループを見てください。配列の値は double です (つまり、それぞれ 8 バイトを意味します)。

for(int j=0 ;j<N;j++){
    for(int i=1 ;i<Nt;i++){
        matrix[j*Nt+i] = matrix[j*Nt+i-1] * mu + matrix[j*Nt+i]*sigma;
    }
}

1) 浮動小数点演算はいくつ数えますか? 私は 3*(Nt-1)*N について考えました...しかし、配列内の操作もカウントする必要がありますか?

2) どのくらいのデータが転送されますか? 2* ((Nt-1)*N) 8Byte または 3 ((Nt-1)*N)*8Byte. つまり、マトリックスのすべてのエントリをロードする必要があります。計算後、新しい値が配列のそのインデックスに保存されます (これらは 1 ロードと 1 ストアです)。ただし、この値は次の計算に使用されます。したがって、別のロード操作が必要ですか、それともこの値 (matrix[j*Nt+i-1]) はロード操作なしで既に使用可能ですか?

ありがとう!!!

4

1 に答える 1

0

このタイプのコードでは、実行しようとしている直接的な分析は、ほぼ完全に誤解を招く可能性があります。コードのパフォーマンスに関する唯一の意味のある情報は、実際に実行される速度を実際に測定することです(ベンチマーク)。

これは、最新のコンパイラとプロセッサがこのようなコードの最適化について非常に巧妙であり、単純な分析とはまったく異なる方法で実行されるためです。コンパイラはコードを最適化し、個々の操作を再配置します。プロセッサ自体が個々のサブ操作を並列および/またはパイプラインで実行しようとします。たとえば、データがメモリからフェッチされている間に計算が行われます。

アルゴリズムの複雑さについて考えたり、O(n) と O(n²) などを区別したりすることは役に立ちますが、一定の要素 (2*... または 3*... について尋ねるようなもの) は、変化するため完全に意味がありません。実際には多くの詳細に依存します。

于 2014-09-05T19:21:57.333 に答える