О, мальчик, это крутой парень. Это очень практический вопрос, поскольку это показатель производительности и эффективности, а также очень субъективный вопрос, поскольку он определяет, какие инструкции более или менее «полезны» для достижения цели приложения. Целью приложения может быть что угодно, например, поиск решения сложного матричного уравнения или рендеринг изображения на дисплее.
Кроме того, современные процессоры выполняют такие функции, как синхронизация в режиме ожидания. Генератор по-прежнему производит циклы, но никакие инструкции не выполняются из-за того, что определенные схемы простаивают из-за того, что циклы их не достигают. Это циклы, которые не делают ничего полезного, и их нужно игнорировать.
Точно так же современные процессоры могут выполнять несколько инструкций одновременно, выполнять их не по порядку, а также прогнозировать и выполнять, какие инструкции будут выполнены следующими, прежде чем ваша программа (то есть IP или указатель инструкций) фактически достигнет их. Вы не хотите включать инструкции, выполнение которых на самом деле никогда не завершается, например, из-за того, что процессор ошибается и должен сбросить эти инструкции, например как из-за неверного предсказания ветки. Так что лучший показатель - это подсчет фактически выполненных инструкций. Выполненные инструкции называются «устаревшими».
Таким образом, мы должны подсчитывать только те инструкции, которые завершены (т. Е. Отменены), и циклы, которые фактически используются для выполнения инструкций (т. Е. Необработанные).
Возможно, наиболее практичным общим показателем «работы» является CPI или количество циклов на инструкцию: CPI = CPU_CLK_UNHALTED.CORE / INST_RETIRED.ANY. CPU_CLK_UNHALTED.CORE - это циклы, используемые для выполнения фактических инструкций (по сравнению с «потраченными впустую» в состоянии ожидания). INST_RETIRED - это те инструкции, которые выполняются (по сравнению с теми, которые не выполняются из-за чего-то вроде неверного прогноза ветки).
Попытка получить более конкретную метрику, такую как инструкции, которые вносят вклад в решение множественной матрицы, и исключение инструкций, которые не вносят прямого вклада в вычисление решения, таких как инструкции управления, очень субъективны, и по ним сложно собрать статистику. . (Есть некоторые, что вы можете, например VECTOR_INTENSITY = VPU_ELEMENTS_ACTIVE / VPU_INSTRUCTIONS_EXECUTED, который представляет собой количество векторных операций SIMD, таких как SSE или AVX, которые выполняются в секунду. Эти инструкции с большей вероятностью будут напрямую способствовать решению математической решение, поскольку это их основная цель.)
Теперь, когда я вас отговорил, ознакомьтесь с некоторыми ресурсами по оптимизации на вашем местном ресурсе для разработчиков Intel, software.intel.com. В частности, узнайте, как эффективно использовать VTune. Я не предлагаю вам получить VTune, хотя вы можете получить студенческую лицензию бесплатно или со скидкой (я думаю). Но материал многое расскажет вам об увеличении производительности ваших программ (то есть об оптимизации), что, если вы задумаетесь, увеличивает полезную работу, которую выполняет ваша программа.
person
Taylor Kidd
schedule
06.03.2015