Инструкции по циклу
Инструкции по циклу (англ. instructions per cycle, IPC) — это величина, показывающая количество инструкций, которые процессор способен выполнить за один тактовый цикл. Другими словами, IPC является одним из показателей производительности микропроцессора. К другим факторам производительности относят тактовую частоту микропроцессора и объём выполняемых инструкций в программе. Поэтому итоговая производительность микропроцессора определяется тремя ключевыми составляющими: микроархитектура (IPC), технология (тактовая частота) и компилятор (инструкции).
Описание
Инструкции процессора обычно выполняются, проходя через несколько стадий или фаз. Когда одновременно выполняется несколько инструкций, по одной на каждом этапе, при идеальных условиях достигается результат, соответствующий одной инструкции на тактовый цикл (IPC = 1), так как по завершении последней фазы одной инструкции следующая инструкция также завершает свою последнюю фазу в следующий такт, подобно конвейеру в автомобильной промышленности.
IPC обычно рассматривается как среднее значение, поскольку число инструкций, выполняемых за цикл, зависит от архитектуры процессора и запускаемой программы. Например, целочисленное сложение может выполняться быстрее, чем операции с числами с плавающей точкой.
Существуют программы для тестирования производительности (бенчмарки), и из‑за особенностей IPC и его зависимости от конкретной программы важно выбирать такие тесты, которые наиболее репрезентативны для характеристик процессора. Средний IPC в этом случае будет более показательным и лучше отразит производительность в предполагаемых условиях эксплуатации. Поэтому тесты должны быть отражением реальных программ, которые обычно будут запускаться на измеряемой микроархитектуре процессора. Например, при проектировании многоядерного процессора нельзя оценивать производительность только однопоточными программами.
Обычно при измерении производительности процессора рассчитывают время выполнения программы. Это время вычисляется по формуле:
Если выразить IPC:
Где N — количество инструкций (в машинном коде) программы (и её алгоритмов), а f — тактовая частота процессора. IPC является обратной величиной к CPI — циклы на инструкцию (CPI = ), также широко используемой в литературе по архитектуре процессоров.
Величина N (число инструкций) зависит от используемого компилятора, поскольку код на языках высокого уровня транслируется в машинный код компилятором. Если компилятор не используется, значение N определяется умением программиста использовать инструкции, предоставляемые микроархитектурой процессора. Это затрудняет прямое сравнение двух разных моделей процессоров при отсутствии исходного кода, так как невозможно получить объективную машинную программу. Исходный код может быть написан человеком на ассемблере или высокоуровневом языке, либо исходить из промежуточного представления (например, байткод), как в LLVM или Vulkan (формат SPIR-V[1]).
Даже при наличии исходного кода компилятор также может быть необъективен, как это происходило, например, с компилятором Intel. Он создавал бинарные файлы с такой последовательностью инструкций и их планированием, что производительность одного и того же алгоритма на процессорах AMD и VIA Technologies была ниже по сравнению с процессорами Intel[2]. Поэтому желательно иметь доступ к исходному коду компилятора, чтобы проверить, что он генерирует максимально эффективный код для каждой микроархитектуры, по которой оценивается производительность. Под таковым понимается генерация машинного кода с инструкциями в такой последовательности, чтобы не тратить лишние такты впустую, когда, возможно, другая комбинация порядка исполнения или использование альтернативных инструкций снизили бы потери циклов и увеличили IPC.
Разработка микроархитектуры, обеспечивающей высокий IPC, весьма сложна. Если тестовые и рабочие программы не имеют открытого исходного кода и/или ориентированы на определённый набор аппаратных особенностей, возможности архитекторов процессоров по оптимизации могут оказаться сильно ограниченными. Им приходится создавать микроархитектуру для машинного кода, изначально ориентированного на процессоры других производителей. Это, в свою очередь, снижает уровень инноваций, поскольку проекты процессоров начинают сближаться по устройству и отличаются минимально. Появляется преимущество у компании-лидера рынка, поскольку её архитектура становится фактическим стандартом, под который разрабатываются приложения и тесты производительности.
Таким образом, разработчики программного обеспечения также оказывают влияние на IPC конкретной микропроцессорной архитектуры: используемый ими компилятор и написанный код могут дать преимущество одним процессорам перед другими. Для нивелирования такого влияния применяются функциональные и библиотеки времени выполнения, которые маскируют детали аппаратной реализации и берут на себя оптимизацию под конкретную архитектуру. Компиляторы включают такие библиотеки, например, встроенные функции, OpenMP, OpenACC, OpenCL, CUDA. На их основе разрабатываются высокоуровневые оптимизированные абстракции под разные поколения GPU и CPU. Примеры специализированных библиотек для линейной алгебры: GSL[3], cuBLAS[4], clFFT[5], clBLAS[6], ATLAS[7], LAPACK[8], MAGMA[9]. В области видеоигр абстракцией выступает графический движок, который использует библиотеки вроде OpenGL, Vulkan или Direct3D, поставляемые с драйверами графических устройств, включающими компилятор для генерации бинарного кода под конкретный GPU на основе кода шейдера разработчика. Время выполнения Java, встроенное в Android (интерпретатор Dalvik либо ART — зависит от версии устройства), также абстрагирует не только детали аппаратной платформы, но и операционной системы, что позволяет запускать программу на разных устройствах и ОС без модификаций.
См. также
Примечания
Ссылки
- Instructions per cycle (на английском)


