私は現在、複素数の配列(std :: complexと同じように整列されたメモリですが、現在は独自のADTを使用しています)を同じスカラー値の配列で最も効率的にインプレース乗算しようとしています。複素数配列としてのサイズ。
アルゴリズムはすでに並列化されています。つまり、呼び出し元のオブジェクトが作業をスレッドに分割します。この計算は数億のアレイで実行されるため、完了するまでに時間がかかる場合があります。CUDAは、この製品のソリューションではありません。私はブーストにアクセスできるので、BLAS/uBLASを使用する可能性があります。
SIMDの方がはるかに良い結果が得られるかもしれないと思っていますが、複素数でこれを行う方法については十分に理解していません。私が今持っているコードは次のとおりです(これはターゲットマシンのコアの数に対応するスレッドにチャンクアップされていることを思い出してください)。ターゲットマシンも不明です。したがって、一般的なアプローチがおそらく最善です。
void cmult_scalar_inplace(fcomplex *values, const int start, const int end, const float *scalar)
{
for (register int idx = start; idx < end; ++idx)
{
values[idx].real *= scalar[idx];
values[idx].imag *= scalar[idx];
}
}
fcomplexは次のように定義されます。
struct fcomplex
{
float real;
float imag;
};
最終的にループカウントは常に2の累乗になるため、手動でループを展開しようとしましたが、コンパイラーはすでにそれを実行しています(32まで展開しました)。私はスカラーへのconstfloat参照を試しました-1つのアクセスを節約すると考えて-そしてそれはコンパイラーがすでに行っていたものと等しいことが証明されました。私はSTLと変換を試しましたが、どちらのゲームも結果は近いですが、それでもさらに悪い結果になります。また、std :: complexにキャストして、乗算のスカラー*複合体にオーバーロードされた演算子を使用できるようにしましたが、最終的には同じ結果が得られました。
それで、何かアイデアを持っている人はいますか?これを検討する上で、多くの感謝を捧げます!ターゲットプラットフォームはWindowsです。Visual Studio 2008を使用しています。製品にGPLコードを含めることはできません!本当にありがとう。