Visual Studio のパフォーマンス アナライザーによると、次の関数は異常に大量のプロセッサ パワーのように思われるものを消費しています。複数のベクトルから 1 ~ 3 個の数値を加算し、それらのベクトルの 1 つに結果を格納するだけです。 .
//Relevant class members:
//vector<double> cache (~80,000);
//int inputSize;
//Notes:
//RealFFT::real is a typedef for POD double.
//RealFFT::RealSet is a wrapper class for a c-style array of RealFFT::real.
//This is because of the FFT library I'm using (FFTW).
//It's bracket operator is overloaded to return a const reference to the appropriate array element
vector<RealFFT::real> Convolver::store(vector<RealFFT::RealSet>& data)
{
int cr = inputSize; //'cache' read position
int cw = 0; //'cache' write position
int di = 0; //index within 'data' vector (ex. data[di])
int bi = 0; //index within 'data' element (ex. data[di][bi])
int blockSize = irBlockSize();
int dataSize = data.size();
int cacheSize = cache.size();
//Basically, this takes the existing values in 'cache', sums them with the
//values in 'data' at the appropriate positions, and stores them back in
//the cache at a new position.
while (cw < cacheSize)
{
int n = 0;
if (di < dataSize)
n = data[di][bi];
if (di > 0 && bi < inputSize)
n += data[di - 1][blockSize + bi];
if (++bi == blockSize)
{
di++;
bi = 0;
}
if (cr < cacheSize)
n += cache[cr++];
cache[cw++] = n;
}
//Take the first 'inputSize' number of values and return them to a new vector.
return Common::vecTake<RealFFT::real>(inputSize, cache, 0);
}
確かに、問題のベクトルのサイズは約 80,000 項目ですが、比較すると、同様の複素数のベクトルを乗算する関数 (複素数の乗算には、4 つの実数乗算と 2 つの加算がそれぞれ必要です) は、約 1/3 のプロセッサ パワーを消費します。
おそらく、ベクトルに直線的にアクセスするのではなく、ベクトル内を飛び回る必要があるという事実に何か関係があるのでしょうか? 本当にわからないけど。これを最適化する方法について何か考えはありますか?
編集:各ベクトルに線形にアクセスする関数も作成しようとしたことを言及する必要がありますが、これにはより多くの合計反復が必要であり、実際にはパフォーマンスが低下しました。