0

多くの場合、コピーする必要があり、非常に大きくなる可能性がある配列を含む構造があります。

struct XYZ
{
   ...
   double *x, *y, *z;
   uint count;
};

現在、Daniel Vik は彼のブログで...

http://www.danielvik.com/2010/02/fast-memcpy-in-c.html

...このコードを、C++ で連続した配列をコピーするためのより高速な手段として提示しています (それはmemcpy のエラーチェックといくつかの特別な条件のものがないため、より高速です):

void* memcpy(void* dest, const void* src, size_t count) {
    char* dst8 = (char*)dest;
    char* src8 = (char*)src;
    --src8;
    --dst8;

    while (count--) {
        *++dst8 = *++src8;
    }
    return dest;
}

私は自分の型を知っており、通常は新しいコピーを返すcount--よりも高価であるため、これを多少調整しました。--countだから私の結果は次のとおりです。

struct XYZ
{
   void Copy(XYZ & dest) 
   {
        size_t len = count * sizeof(double)+1;
        char* dest8_x = (char*)dest.x;
        char* dest8_y = (char*)dest.y;
        char* dest8_z = (char*)dest.z;
        char* src8_x = (char*)x;
        char* src8_y = (char*)y;
        char* src8_z = (char*)z;
        --dest8_x;
        --dest8_y;
        --dest8_z;
        --src_x;
        --src_y;
        --src_z;
        while (--len)
        {
            *++dest8_x = *++src8_x;
            *++dest8_y = *++src8_y;
            *++dest8_z = *++src8_z;
        }
    }

   ...
   double *x, *y, *z;
   uint count;
};

この戦略を最大限に活用することについて、いくつか質問があります。

  1. 2 つのターゲットにコピーする場合...同じメモリをインターリーブするかXYZ & dest1、1 つの構造体のすべてのメンバーをコピーしてから次の構造体にコピーする方が効率的でしょうか?XYZ & dest2*this
  2. スケーリング係数を適用したい場合、double coefficientAまたはdouble offsetB加算または乗算を介して 1 つの値または値の範囲に適用したい場合、これをより効率的にコピー操作に組み込むことは可能ですか。

場合によってはプログラムの特定の実行のために最適化したいという欲求の簡単な正当化を提供するためにcount>100000、そして多くの場合、コピーされた一連の座標に対して最初に行うことは、選択した値をそれらすべてに一貫して追加することです。

4

1 に答える 1

1

大きすぎるように見えますが、これは実際にはコメントであるべきです。

まず、一度に 1 バイトずつコピーするのはなぜですか? 次に、スケーリングとオフセットの両方を使用していることに気付きました。これは、3d/2d グラフィックスの 2 つの一般的な操作です。そこで使用されたアプローチがより適切ではないのではないかと思います-つまり、座標と別の変換行列を保存します。これにより、座標をコピーする必要が完全になくなります。キャッシュを考慮する必要がある場合があります。大量のデータを移動すると、スラッシングする可能性があります。また、各サイクルで double を使用して何か他のことを行う必要があると仮定すると、それらを fpu レジスタにロードし、それらを変換してから (フレーム/サイクルごとに) 使用する方が、ロード、変更、新しい場所への保存よりも高速であることがわかります (不確実な繰り返し) rate) に続いて、それらをロードして使用します (フレーム/サイクルごと)。

正直なところ、特定のプログラムの最適化に関して、その詳細についてより深く理解することなく、決定的な答えを出すことは不可能だと思います。しかし、いずれにせよ、3 つの double の構造体を一度に 1 バイトずつコピーすることはできません!

于 2013-10-17T01:42:55.713 に答える