Экономия энергии посредством компрессии во встроенной среде Java

№ 4’2004
Экономия энергии и ресурсов — важный аспект проектирования встроенных цифровых систем. Сжатие — один из популярных механизмов для понижения требований систем к памяти. В этой статье рассматривается влияние сжатия на использование системных ресурсов встроенной виртуальной машиной Java (JVM), а также алгоритмы сжатия. Мы приводим краткий, «ознакомительный» перевод статьи; оригинальный текст доступен в Интернете по адресу http://www.cse.psu.edu/~mdl/paper/p081-chen.pdf.

Экономия энергии и ресурсов — важный аспект проектирования встроенных цифровых систем. Сжатие — один из популярных механизмов для понижения требований систем к памяти. В этой статье рассматривается влияние сжатия на использование системных ресурсов встроенной виртуальной машиной Java (JVM), а также алгоритмы сжатия. Мы приводим краткий, «ознакомительный» перевод статьи; оригинальный текст доступен в Интернете по адресу http://www.cse.psu.edu/~mdl/paper/p081-chen.pdf.

Java стала популярным средством мобильного сетевого программирования, где программируемые устройства обладают ограниченными ресурсами, например, сотовые телефоны или пейджеры. Здесь Java-система должна учитывать совершенно другой набор ограничений и особенностей по сравнению с высокоэффективными рабочими станциями. Три важнейших аспекта, которым удовлетворяют современные JVM, такие, как Sun KVM и HP ChaiVM: функционирование в реальном времени, ограниченный размер памяти и продолжительная сессия. Энергопотребление тоже является важным аспектом для устройств на батарейках, однако средства анализа и оптимизации энергопотребления устройств слабо развиты в таких встроенных JVM. Поэтому необходимо совершенствовать технологии по оптимизации энергопотребления устройств. Потребляемую устройствами памяти энергию можно разделить на две составляющие: динамическую и статическую. «Динамическая» составляющая энергии потребляется во время реального обращения к памяти. «Статическая» составляющая энергии потребляется все время, пока устройство памяти включено, даже если непосредственно к памяти нет обращений. Традиционно исследования оптимизируют «динамическую» составляющую энергии, потребляемой памятью (в дальнейшем для краткости именуемой «динамическая энергия»), посредством минимизации количества обращений к памяти. В то же время «статическая» составляющая (в дальнейшем для краткости именуемая «статическая энергия») достигает 30% общего потребления энергии.

В нашем исследовании мы анализируем «систему на кристалле» с двухуровневой иерархией памяти, где программно управляемая память (SPM — scratch pad memory) используется ядром процессора. Мы использовали компрессию, чтобы понизить размер требуемой памяти. В частности, мы храним код Java-машины и необходимые библиотеки классов в сжатом виде. Таким образом, эффективное число активных транзисторов, используемых для статического хранения информации, понижается. Мы также используем механизм, который выключает электропитание неиспользуемых областей памяти. Когда ядру процессора необходим сжатый код или классы, необходимый код локализуется и подвергается декомпрессии, после которой загружается в SPM. Таким образом, использование SPM-памяти в сочетании со сжатием хранимых данных понижает потребление динамической и статической энергии системы. Цель нашей работы — исследовать влияние различных параметров при проектировании таких систем. Ниже приводятся проблемы, рассмотренные нами:

  1. Хранение сжатых данных подразумевает затраты энергии на их распаковку, поэтому, чтобы получить экономию энергии, необходимо, чтобы эти затраты были меньше, чем сэкономленные на хранении сжатых данных. Для этого необходимо использовать эффективные алгоритмы сжатия. Мы использовали специфическую аппаратную схему сжатия и экспериментировали с декомпрессией, начиная от аппаратных средств и заканчивая программными.
  2. Размер блока сжатых данных влияет на коэффициент сжатия, он понижает накладные расходы, связанные с индексированием данных. Большая степень компрессии предоставляет возможность отключить большее число неиспользуемых блоков памяти, что предоставляет большую экономию статической энергии. Однако большой блок данных занимает больше места в SPM.
  3. архитектура KVM и SOC

Мы использовали KVM производства Sun, разработанную для ресурсоограниченных сред. Эта виртуальная машина рассчитана на устройства, имеющие всего несколько килобайт памяти, такие, как сотовые телефоны, пейджеры и т. д.

Архитектура «системы на кристалле» включает ядро процессора, SPM-память и два модуля основной памяти (рис. 1). Процессор работает на частоте 100 МГц, оба модуля основной памяти и SPM поделены на блоки. Каждый блок основной памяти может быть загружен в один блок SPM. Каждый SPM-блок имеет тег, показывающий, какой именно блок основной памяти в него загружен. Теги устанавливаются SPM-менеджером, встроенным в систему.

Рисунок. Архитектура памяти: (а) общий вид, (b) блок SPM
Рисунок. Архитектура памяти: (а) общий вид, (b) блок SPM

Когда процессор генерирует адрес, старшие биты этого адреса сравниваются с каждым тегом параллельно. Если какой-то тег совпадает со старшими битами адреса, то выбирается соответствующий блок SMP-памя-ти. Младшие биты используются для доступа к содержимому блока. Если же совпадающий тег не найден, то генерируется исключение, после которого нужный блок загружается из основной памяти. Если свободных SPM-блоков нет, то один из ненужных блоков замещается. Признаком «ненужности» служит специальный бит, который после обращения к блоку сразу устанавливается в 1, но периодически сбрасывается в 0. Если в рассматриваемом блоке этот бит равен 0, значит, к блоку давно не обращались, и его можно заменить. Если же «ненужных» блоков не нашлось, то замещается один из «нужных» блоков в циклическом порядке. Основная память делится на 2 части: в одной содержится код KVM и библиотеки классов, а в другой, наряду с кодом приложений, — непосредственно данные, включая кучу и стек.

Количество параметров в этой архитектуре настраиваемо. Объем SPM и основной памяти может модифицироваться. Также может меняться период сброса бита «нужности» в 0 и размер одного блока.

Для тестирования эффективности нашей стратегии экономии энергии мы использовали 12 приложений: калькулятор, встроенный веб-браузер для игр, карманный компьютер и т. д.

Сжатый KVM-код и библиотеки классов

Потребление статической энергии блоками памяти пропорционально их размеру, а также продолжительности времени их включения. Мы пытаемся понизить число включенных блоков памяти посредством хранения в сжатом виде данных только для чтения, включая код KVM и библиотек классов Java. Данные для записи хранятся в несжатом виде. Когда фрагмент данных, принадлежащий сжатому блоку, требуется процессору, весь этот блок декомпрессируется и записывается в SPM-память. Сжатые данные требуют меньше блоков для хранения и, следовательно, потребляют меньше статической энергии. Объем памяти, который занимают данные, зависит от коэффициента используемого алгоритма сжатия. Недостаток заключается в том, что декомпрессия требует времени и дополнительной энергии. Величина этого «штрафа» зависит от того, как часто требуется декомпрессия, и сколько времени (и, соответственно, энергии) требуется на декомпрессию одного блока. Число декомпрессий напрямую зависит от числа блоков, не найденных в SPM (что определяется поведением устройства и конфигурацией SPM). Время (энергия), затраченные на распаковку, зависят от эффективности применяемого алгоритма.

Алгоритмы компрессии-декомпрессии, применяемые в нашем случае, должны обладать следующими характеристиками: хороший коэффициент сжатия для маленьких блоков памяти (менее 4 кбайт); быстрая декомпрессия; низкие затраты энергии при декомпрессии. Поскольку компрессия выполняется вне процесса, его время и энергопотребление не имеют значения.

Первый представляемый алгоритм сжатия называется X-Match. Он использует словарь данных, составленный из уже встречавшихся слов, и пытается сравнить текущее слово с одним из имеющихся в словаре. Если совпадение встречается, то это слово заменяется коротким кодом из словаря, а иначе пересылаются как есть с добавлением специального бита в начало. Каждый элемент данных состоит ровно из 4 байтов. Полное совпадение происходит, когда все байты во входном слове совпадают с байтами какого-то слова в словаре. Частичное совпадение — когда совпадают хотя бы два символа. Тогда байты, которые не совпали, пересылаются побайтно. Функция, обрабатывающая совпадения, кодирует 3 отдельных поля:

  1. место совпадения;
  2. тип совпадения, определяющий, какие именно символы совпали;
  3. символы, которые не совпали

Оригинальный алгоритм X-Match поддерживает стратегию move-to-front, когда новое слово кладется в словарь сверху, а остальные слова сдвигаются на одну позицию вниз. Когда словарь переполняется, последнее слово вытесняется. Это реализуется с помощью сдвига данных в ячейках памяти, и поэтому требует больших энергозатрат. Мы преобразовали алгоритм следующим образом — новое слово добавляется в конец словаря, и когда он переполняется, заводится специальный указатель, который указывает на начало и потом перемещается по словарю, указывая, какое следующее слово подлежит вытеснению. Мы также отделили сжимаемые байты от контрольных битов (префиксов, типов и мест совпадения), что позволяет им подаваться в декомпрессор отдельными потоками.

Кроме того, мы пришли к выводу, что эффективными по экономии энергии могут оказаться алгоритмы Хаффмана и Лемпела-Зива.

Методология симуляции

Данные по энергозатратам были получены симулятором, встроенным в инструментарий SPARC-симуляции. В качестве входных данных симулятор берет KVM-систему, выполняющую Java-приложение, и вычисляет характеристики затрат энергии. Наш симу-лятор отслеживает потребление энергии в ядре процессора, SPM и основных блоках памяти. Энергия, использованная в ядре процессора, оценивается посредством подсчета числа инструкций каждого типа и умножения этого числа на количество энергии, расходующейся на выполнение соответствующей инструкции.

Энергопотребление в SPM и основной памяти делится на динамическое и статическое. При подсчете потребления динамической энергии мы использовали CACTI — инструментарий версии 2.0, предполагающий 0,10-микронные технологии. При подсчете статической энергии мы предположили, что ее величина за полный цикл работы основной памяти равна величине динамической энергии, израсходованной за один доступ.

При подсчете полного энергопотребления в основной памяти и SPM-блоке мы предположили, что блок памяти (или SPM-блок) в любой момент времени может находиться в одном из трех состояний: R/W, активном и неактивном. В режиме R/W память подвергается чтению или записи и потребляет максимум динамической и статической энергии. В активном состоянии память включена, но не подвергается воздействию. В этом состоянии потребляется в полном объеме статическая энергия, но не потребляется динамическая. И, наконец, модули памяти, которые не нужны системе, отключены и не потребляют энергии вообще. Очевидно, что для того, чтобы минимизировать количество потребляемой энергии, необходимо как можно больше блоков привести в неактивное состояние. Единственный способ добиться этого — снизить объем данных, хранящихся в памяти, что достигается путем компрессии.

Энергопотребление делится на 4 компонента: динамическая энергия в SPM, статическая энергия в SPM, и, соответственно, динамическая и статическая энергия в основной памяти. Доля процессора в распределении всей энергии невелика — около 10%, и влияние декомпрессии здесь незначительно. Поэтому мы заостряем внимание на энергии основной и SPM-памяти. Результаты показали, что потребление статической энергии составляет большой процент от общего энергобюджета — в среднем около 60%, и поэтому является подходящей целью для оптимизаций.

Результаты

В этом разделе мы представляем данные, показывающие эффективность нашей стратегии в экономии энергии, а также демонстрируем ее чувствительность к различным параметрам, таким, как объем SPM-памяти, размер блока и затраты на декомпрессию.

Опыты показали, что экономия энергии составляет в среднем 21%. В большинстве приложений экономия достигает 10%. В двух приложениях (калькулятор и планировщик) декомпрессия играет большую роль, и поэтому результаты получаются хуже, чем в случае оригинала.

В общем, два фактора определяют эффективность нашей стратегии — время исполнения приложения и число SPM-промахов. Поскольку основную выгоду наша стратегия приносит в статической энергии, то чем продолжительнее работает приложение, тем больше становится эта выгода. Напомним, что каждый SPM-промах влечет акт декомпрессии. Поэтому количество SPM-прома-хов — важный фактор при определении энергии, затраченной на декомпрессию во время исполнения приложения. Причины, по которым планировщик и калькулятор не получают выгоды из нашей стратегии, различны. В калькуляторе время выполнения довольно короткое и энергия, потраченная на декомпрессию, не оправдывается. В планировщике время выполнения достаточно большое, но стратегия проигрывает из-за большого числа SPM-промахов.

Поскольку наша стратегия направлена на экономию энергии в части основной памяти, предназначенной только для чтения, мы представляем результаты, касающиеся только этой части и SPM.

Чувствительность к «стоимости» декомпрессии

Чтобы посмотреть, как воздействует на результаты более или менее эффективная реализация алгоритма X-Match, мы провели другую серию экспериментов. Мы пришли к выводу, что декомпрессия 4 байтов требует трех обращений к SPM-памяти. Мы нормализовали этот показатель к 1 и, сравнивая уровень стоимости декомпрессии с этим показателем, выяснили, что декомпрессия со стоимостью 2 увеличивает потребление энергии на 5-7%, а декомпрессия со стоимостью 0,25 — уменьшает на 20%. Эти результаты подтверждают необходимость эффективной реализации алгоритма декомпрессии.

Чувствительность к размеру SPM-памяти

Опыты показали, что если размер SPM слишком мал, то частые SPM-промахи сильно повышают энергопотребление. Однако слишком большая SPM-память также плохо влияет на энергопотребление устройства. Здесь имеют место два фактора. Во-первых, она потребляет много динамической и статической энергии. Во-вторых, для каждого приложения существует критический объем SPM-памяти, фиксирующий его рабочую сеть. После превышения этого объема количество SPM-промахов перестает снижаться. Эта стабильность уровня промахов в сочетании с первым фактором приводит к возрастанию энергопотребления устройства. В проектировании встроенных систем максимально возможный размер SPM определяется бюджетом кристалла. Поэтому проектировщики встроенных систем должны выбирать подходящий размер SPM исходя из особенностей приложений.

Чувствительность к размеру блока По умолчанию в наших экспериментах размер блока составлял 1 кбайт. Опыты показали, что этот размер оказывает большое влияние на энергопотребление. Для большинства алгоритмов сжатия больший размер блока повышает коэффициент сжатия. Однако нужно помнить, что слишком большой блок одновременно увеличивает количество SPM-промахов и стоимость декомпрессии. В результате экспериментов выяснилось, что размер 0,5 кбайт дает лучший результат, чем 1 кбайт. А вот увеличение размера до 2 кбайт повышает энергопотребление более чем в 2 раза.

Заключение

Хранение сжатых данных и кода влечет за собой определенные накладные расходы на декомпрессию. Однако компрессия помогает понизить долю памяти, которая должна быть включена, и, как следствие, потребление устройством статической энергии. Наши эксперименты с набором встроенных приложений, использующих коммерческую JVM и специфическую схему компрессии, показали, что предлагаемая технология эффективна для понижения энергозатрат. Мы надеемся, что наши результаты найдут применение и в других схемах компрессии и реализациях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *