1

次のコードでフロップの総数を最小限に抑える必要があります。だれか簡単に見て、どこに力を注ぐべきか教えてもらえますか? いくつかのパフォーマンス アナライザーを試しましたが、結果は適切ではありませんでした..

int twoDToOneD(int i, int j, int nRows)
{
return j*nRows + i;
}

double* addMatrices(int m, int n, double* A, double* B, bool add)
{
double* C = new double[m*n];
double* pA = A;
double* pB = B;
double* pC = C;

int i = m*n;

while(i--)
{
    if(add)
    {
        *pC = *pA + *pB;
    } else 
    {
        *pC = *pA - *pB;
    }

    pC++;
    pA++;
    pB++;
}

return C;
}

ありがとう、チョー

4

1 に答える 1

0

そうです、私は最後の行をすべて読んだわけではありませんが、あなたは単純に次のように見えます:

  1. ランダム int の生成
  2. doubleそれらをsとして保存する
  3. それらを追加する
  4. それらを加算および乗算する

IOW - 分数の使用はまったく見られず、適切なサイズの整数が優れています。そうであれば、プログラム内のすべての FLOP を削除できます ;)

それが正確な信号ではない場合でも、適切な範囲で使用できます。その後、信号を拡大して整数として保存し、場合によっては結果を適切な範囲に戻します。

適切なサイズの mul/add の場合、整数を使用すると、はるかに高速になり、必要なメモリが大幅に少なくなる可能性があります。SIMD 命令をそれらに適用することもできます。

それ以上に、キャッシュの局所性を改善し、分岐を最小限に抑え、動的割り当てを最小限に抑えることで、プログラムを数倍高速化することもできます。

于 2012-02-27T11:58:07.477 に答える