Я оптимизирую простые операции с массивами, такие как
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 байта.
vpmulld zmm
имеет пропускную способность только 1 на 2 такта на SKX (т. е. он не использует FMA-устройство порта 5 для запуска своих 2 uops в соответствии с agner.org/optimize), поэтому при развертывании похоже, что AVX512 будет узким местом при той же пропускной способности, что и развернутый цикл AVX2 дляint32_t
. Однако AVX512 лучше подходит для любого другого типа. - person Peter Cordes   schedule 22.09.2018