2012-02-27 6 views
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; 
} 

おかげで、 チョー

+1

SIMDを使用できない理由はありますか?これがすべて行列ベースなので、GPGPUカーネルとして最もよく機能するかもしれません。 – Necrolis

+0

VS10でSIMDを使用できますか? – user1235325

+0

ええ、vc6のどのバージョンでも、ターゲットプラットフォームがSSE1/2/3/4をサポートしているかどうか – Necrolis

答えて

0

右を私はいくつかのもパフォーマンス・アナライザを試してみたが、結果は無関係だった、私はすべての最後の行を読んでいないが、あなたは、単にあるように見えます:それらを追加double S

  • としてそれらを記憶するランダムint型
  • 生成

    1. それらを追加し、乗算

    IOW - 私はすべてのの留分のいずれかの使用が表示されない、そして適切なサイズの整数が優れていることでしょう。そうであれば、プログラム内のすべてのFLOPを削除することができます;

    これは正確な信号ではない場合でも、適切な範囲でそれを使用し、信号をスケールアップして整数として保存してから場合によっては結果が適切な範囲に戻されます。

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

    キャッシュのローカリティを改善し、分岐を最小限に抑え、動的割り当てを最小限に抑えることで、プログラムを数倍高速化することができます。

  • 関連する問題