-5

組み込み関数がパフォーマンスに与える影響を研究していますが、少し混乱しています。まったく影響がないようです! double の配列を 2 つの異なる関数で埋めようとしていますが、違いはありません。配置パラメータを 8 に設定して _aligned_malloc を呼び出して配列を割り当てました。 Visual Studio 2008 を使用し、リリース モードでコンパイルしました。 - 4 つの組み合わせすべて。2 つの異なるバージョンが続きます。

#ifdef _NO_INTRIN

void my_fill(double* vett, double value, int N)
{
    double* last = vett + N;
    while( vett != last)
    {
        *vett++ = value;
    }
}

#else

void my_fill(double* vett, double value, int N)
{
    double* last = vett + N;

    // set "classically" unaligned data, if any
    while( (0xF & (uintptr_t)vett) && vett != last )
        *vett++ = value;

    __m128d* vett_ = (__m128d*)vett;
    uintptr_t fff0 = ~0 << 4;
    // round address to nearest aligned data setting to zero least significant 4 bits
    __m128d* last_ = (__m128d*)( fff0 & (uintptr_t)last);
    // process until second-last element to manage odd values of N
    for( ; vett_ < last_-1; vett_++ )
    {
        *vett_ = _mm_set1_pd(value);
    }

    vett = (double*)vett_;
    while(vett != last)
        *vett++ = value;
}    

#endif

最後の仕様として、配列のさまざまな部分でこの関数をマルチスレッドで実行する予定であるため、データを 16 ではなく 8B に揃えました。したがって、データを 16B に整列しても、配列のすべての部分が整列されるかどうかはわかりませんでした (つまり、303 要素、3 スレッド、スレッドあたり 101 要素、16B に整列された最初の部分、@ vett+101 から始まる 2 番目の部分)。 *8 ==> 整列していません)。そのため、アライメントに依存しない機能を実装しようとしました。Intel Atom CPU N570 @ 1.66 GHz で 1M 要素の配列を埋めようとしましたが、実行時間は常に同じでした。だから...私のアプローチの何が問題なのですか?違いが見られないのはなぜですか? よろしくお願いします。

4

1 に答える 1

0

高度な計算を行っておらず、純粋に固定値をメモリに書き込んでいる場合、プログラムの速度はメモリ帯域幅によって制限される可能性があります。CPU はより高速な速度で内部的に値を生成できますが、値を RAM に転送できる速度に制限されます (特に、CPU のキャッシュに収まらない大きなメモリ領域を処理する場合)。

于 2015-08-28T23:39:00.940 に答える