以下のコードで浮動小数点演算を最小限に抑える方法

StackOverflow https://stackoverflow.com/questions/9463493

  •  13-11-2019
  •  | 
  •  

質問

次のコードでのフロップの総量を最小限に抑える必要がありますが、誰かが簡単に見て、どこで私の努力をするかを教えてください。 私はいくつかのPerfomance Analyzerを試しましたが、結果は無関係でした。

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;
}
.

ありがとう、 cho

役に立ちましたか?

解決

right、私は最後の行を読みませんでしたが、それはあなたが単にそうであるように見えます:

  1. ランダムints の生成
  2. それらをdoublesとして保存する
  3. それらを追加
  4. それらを追加して乗算する

    iow - の小数の使用は見られず、適切なサイズの整数が優れています。それが本当なら、あなたはプログラム内のすべてのフロップを削除することができます。)

    それが正確な信号ではない場合は、それを適切な範囲で使用してから、シグナップアップを拡大縮小し、整数としてストアを拡大してから、結果を適切な範囲に戻してください。

    適切なサイズのMUL / ADDの場合、整数を使用するとはるかに速くなり、潜在的にはるかに少ないメモリが必要です - あなたはそれらにSIMD命令を適用することもできます。

    それ以外の - あなたの改善キャッシュの地域化、分岐の最小化、および動的割り当ての最小化には、プログラムを数回速くすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top