Измерение производительности для простых операций векторизованного массива

Я оптимизирую простые операции с массивами, такие как

for (int i=0; i<cnt; i++) dst[i] = src1[i] * src2[i];

где cnt обычно составляет от 32 до 1024, что является типичными случаями в моем приложении. Я сравниваю Intel IPP, родной векторизатор MSVC 2017, а также использую встроенные функции для AVX и AVX512 в MSVC. Я установил приоритет потока как критический, а маску аффинности потока - "1". Затем я использую QueryPerformanceCounter, чтобы вычислить время в начале и в конце "операции", которая состоит из выполнения цикла миллионы раз. Работает на новом i9 с 10 ядрами.

Проблема в том, что результаты меняются, очень много. Иногда операция занимает 3 секунды, иногда 4. Это делает результаты в основном непригодными. Есть идеи, что может быть не так? Значения в обрабатываемых массивах всегда одинаковы, массивы выровнены по 32-байтовым границам.

1 ответ

Ваш процессор или ОС, вероятно, снижают частоту ядра. Возможно, он работает с частотой 3,6 ГГц один раз и 2,8 ГГц другой. Есть способы предотвратить это с помощью Windows и / или вашего BIOS, но я не помню специфику.

Также эта простая операция будет связана с памятью, поэтому различия между компиляторами или AVX2 по сравнению с AVX512 будут тривиальными.

Другие вопросы по тегам