Я изучаю влияние внутренних функций на производительность, и я немного сбит с толку: кажется, что они никак не влияют! Я пытаюсь заполнить массив двойников двумя разными функциями, и я не вижу различий. Я выделил массив с помощью вызова _aligned_malloc с параметром выравнивания, установленным на 8. Я использую Visual Studio 2008 и скомпилировал его в режиме Release, как с оптимизацией, так и без нее (/ O2 — / Od), а также с встроенной функцией и без нее (/ Oi) — все четыре комбинации. Далее следуют две разные версии:
#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
В качестве последней спецификации я выровнял свои данные по 8B, а не по 16, потому что я планирую выполнять эту функцию многопоточным способом в разных частях массива. Таким образом, также выравнивая данные по 16B, я не был уверен, что все части массива будут выровнены (например, 303 элемента, 3 потока, 101 элемент на поток, 1-я часть выровнена по 16B, 2-я часть, начиная с @ vett + 101 * 8 ==> без выравнивания). Вот почему я попытался реализовать независимую от выравнивания функцию.
Я попытался заполнить массив из 1М элементов на своем процессоре Intel Atom N570 с частотой 1,66 ГГц, и у меня всегда было одинаковое время выполнения. Итак … что не так с моим подходом? Почему я не вижу различий? Спасибо всем заранее.
Если вы не выполняете сложные вычисления и просто записываете фиксированные значения в память, скорость вашей программы, вероятно, будет ограничена пропускной способностью памяти. ЦП может внутренне генерировать значения с более высокой скоростью, но он связан со скоростью, с которой он может передавать их в ОЗУ (особенно при работе с большими областями памяти, которые не помещаются в кэш ЦП)
Других решений пока нет …