組み込み関数がパフォーマンスに与える影響を研究していますが、少し混乱しています。まったく影響がないようです! 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 要素の配列を埋めようとしましたが、実行時間は常に同じでした。だから...私のアプローチの何が問題なのですか?違いが見られないのはなぜですか? よろしくお願いします。