«Так» компании Intel. Решение проблемы инверсии приоритета с помощью САТ

Дата: 2014-08-13 22:26

В далёком 2007 году компания AMD выпустила новое поколение процессоров Phenom. Эти процессоры, как оказалось впоследствии, содержали ошибку в блоке TLB (translation look-aside buffer буфер быстрого преобразования виртуальных адресов в физические). Компании не оставалось ничего иного, как решить эту проблему посредством «заплатки» в виде патча BIOS, но это снижало производительность процессора примерно на 15%.

Что-то подобное случилось теперь и с Intel. В процессорах поколения Haswell компания реализовала поддержку инструкций TSX (Transactional Synchronization Extension). Они предназначены для ускорения многопоточных приложений и должны были использоваться в первую очередь в серверном сегменте. Несмотря на то, что CPU Haswell присутствуют на рынке уже достаточно давно, данный набор инструкций практически не использовался. Видимо, в ближайшее время и не будет.

Дело в том, что Intel допустила «опечатку», как это называет сама компания, в инструкциях TSX. Ошибку, к слову, обнаружили вовсе не специалисты процессорного гиганта. Она может привести к нестабильности системы. Решить данную проблему компания может только одним способом, обновлением для BIOS, которое отключает данный набор инструкций.

К слову, TSX реализованы не только в процессорах Haswell, но и в первых моделях CPU Broadwell, которые должны появиться под именем Core M. Представитель компании подтвердил, что Intel намерена в будущем реализовать «безошибочный» вариант инструкций TSX в следующих своих продуктах.

Теги: Комментировать

Предыдущие новости

2014-08-13 22:23
Sony Xperia Z2 «выжил» после шестинедельного пребывания на дне солёного водоёма

Смартфоны часто становятся героями невероятных рассказов, в которых они примеряют на себя роль карманного бронежилета, останавливающего пулю и спасающего

2014-08-13 21:46
IPhone 6 перешёл в финальную стадию тестирования

По последним данным информационного агентства Gforgames, iPhone 6 поступил в финальную стадию тестирования перед массовым запуском нового смартфона в производство. Напомним, что iPhone 6 будет собираться в Китае на заводах...

2014-08-12 16:38
Восьмиядерный планшет iRU M720G поддерживает две SIM-карты

Планшет имеет 2 ГБ оперативной и 16 ГБ встроенной флеш-памяти. На борту присутствую две камеры: основная 8-мегапиксельная и фронтальная на 2 Мп. iRU M720G оснащен модулями 3G, GPS, Wi-Fi, Bluetooth, FM-радио, а также слотом на две SIM-карты, что позволяет ему выполнять функции...

2014-08-10 18:57
LG выпустила недорогой смартфон L60 в России

Без особой помпы и фанфар компания LG Electronics представила в России новую модель серии L Series III - LG L60. Этот недорогой смартфон представлен в ценовом диапазоне от 4 до 5 тысяч рублей у крупнейших российских...

С каждым новом поколением процессоры Intel вбирают в себя все больше технологий и функций. Некоторые из них у всех на слуху (кто, например, не знает про гипертрединг?), о существовании других большинство неспециалистов даже не догадываются. Откроем всем хорошо известную базу знаний по продуктам Intel Automated Relational Knowledge Base (ARK) и выберем там какой-нибудь процессор. Мы увидим здоровенный список функций и технологий - что скрывается за их таинственными маркетинговыми наименованиями? Предлагаем углубиться в вопрос, обращая особое внимание на мало известные технологии - наверняка, там найдется много интересного.

Intel Demand Based Switching

Совместно с Enhanced Intel SpeedStep Technology, технология Intel Demand Based Switching отвечает за то, чтобы в каждый момент времени при текущей загрузке процессор работал на оптимальной частоте и получал адекватное электрическое питание: не больше и не меньше, чем требуется. Таким образом уменьшается энергопотребление и тепловыделение, что актуально не только для портативных устройств, но и для серверов тоже – именно там Demand Based Switching и используется.

Intel Fast Memory Access

Функция контроллера памяти для оптимизации работы с ОЗУ. Представляет собой комбинацию технологий, позволяющую благодаря углубленному анализу очереди команд выявить «совмещаемые» команды (например, чтение из одной и той же страницы памяти), а затем переупорядочить реальное выполнение таким образом, чтобы «совмещаемые» команды выполнялись друг за другом. Кроме того, менее приоритетные команды записи в память планируются на те моменты, когда прогнозируется опустошение очереди на чтение, и в результате процесс записи в память еще менее ограничивает скорость чтения.

Intel Flex Memory Access

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

Intel Instruction Replay

Очень глубоко расположенная технология, появившаяся впервые в процессорах Intel Itanium. В процессе работы процессорных конвейеров может случиться такая ситуация, когда инструкции уже пришла очередь исполняться, а необходимые данные пока недоступны. Инструкцию тогда необходимо «переиграть»: снять с конвейера и запустить в его начале. Что, собственно, и происходит. Еще одна важная функция IRT – коррекция случайных ошибок на процессорных конвейерах. Подробнее об этой очень интересной функции читайте .

Intel My WiFi Technology

Технология виртуализации, позволяющая добавить виртуальный WiFi адаптер к существующему физическому; таким образом, ваш ультрабук или ноутбук может стать полноценной точкой доступа или повторителем. Программные компоненты My WiFi входят в состав драйвера Intel PROSet Wireless Software версии 13.2 и выше; надо иметь в виду, что с технологией совместимы лишь некоторые WiFi адаптеры. Инструкцию по установке, а также перечень программных и аппаратных совместимостей можно найти на сайте Intel .

Intel Smart Idle Technology

Еще одна технология энергосбережения. Позволяет отключать в данный момент не используемые блоки процессора или понижать их частоту. Незаменимая вещь для ЦПУ смартфона, как раз именно там и появившаяся – в процессорах Intel Atom.

Intel Stable Image Platform

Термин, относящийся скорее к бизнес-процессам, нежели к технологиям. Программа Intel SIPP обеспечивает стабильность программного обеспечения, гарантируя, что основные компоненты платформ и драйверы не будут изменяться в течение, как минимум, 15 месяцев. Таким образом, корпоративные клиенты имеют возможность пользоваться одними теми же развертываемыми образами систем в течение этого срока.

Intel QuickAssist

Набор аппаратно реализованных функций, требующих больших объемов вычислений, например, шифрование, компрессия, распознавание шаблонов. Смысл QuickAssist – упростить задачу разработчиков, предоставив им функциональные «кирпичики», а также ускорить их приложения. С другой стороны, технология позволяет поручить «тяжелые» задачи не самым мощным процессорам, что особенно ценится во встраиваемых системах, сильно ограниченных и по производительности, и по энергопотреблению.

Intel Quick Resume

Технология, разработанная для компьютеров на базе платформы Intel Viiv, позволявшая им включаться и выключаться практически мгновенно, как ТВ-приемники или DVD-плееры; при этом в «выключенном» состоянии компьютер мог продолжать выполнение некоторых задач, не требующих вмешательства пользователя. И хотя сама платформа плавно перешла в другие ипостаси вместе с сопутствовавшими ей наработками, в ARK строчка еще присутствует, ведь это было не так-то уж и давно.

Intel Secure Key

Обобщающее название для 32- и 64-битной инструкции RDRAND, использующей аппаратную реализацию генератора случайных чисел Digital Random Number Generator (DRNG). Инструкция используется в криптографических целях для генерации красивых и высококачественных случайных ключей.

Intel TSX-NI

Технология со сложным названием Intel Transactional Synchronization Extensions – New Instructions подразумевает под собой надстройку над системой работы с кэшем процессора, оптимизирующую среду исполнения многопоточных приложений, но, конечно, только в том случае, если эти приложения используют программные интерфейсы TSX-NI. Со стороны пользователя данная технология непосредственным образом не видна, но все желающие могут прочитать ее описание доступным языком в блоге Степана Кольцова .

В заключение еще раз хотим напомнить, что Intel ARK существует не только в виде сайта, но и как оффлайновое приложение для iOS и Android . Будьте в теме!

#Xeon

Довольно часто при выборе однопроцессорного сервера или рабочей станции возникает вопрос, какой процессор использовать – серверный Xeon или обычный Core ix. Учитывая то, что данные процессоры построены на базе тех же самых ядер, выбор довольно часто падает именно на настольные процессоры, которые обычно имеют меньшую стоимость при схожей производительности. Почему же тогда Intel выпускает процессоры Xeon E3? Давайте разберёмся.

Технические характеристики

Для начала возьмём младшую модель процессора Xeon из актуального на данный момент модельного ряда - Xeon E3-1220 V3. В качестве оппонента выступит процессор Core i5-4440. Оба процессора выполнены на ядре Haswell, имеют одинаковую базовую тактовую частоту и схожие цены. Отличия этих двух процессоров представлены в таблице:

Наличие встроенной графики . На первый взгляд, у Core i5 есть преимущество, однако все серверные материнские платы имеют встроенную видеокарту, которой не требуется графический чип в процессоре, а рабочие станции обычно не используют встроенной графики из-за ее относительно низкой производительности.

Поддержка ECC . Высокая скорость и большой объем оперативной памяти повышают вероятность возникновения программных ошибок. Обычно такие ошибки оказываются незаметными, но, несмотря на это, они могут привести к изменению данных или падению системы. Если для настольных компьютеров подобные ошибки не страшны из-за их редкого возникновения, то в серверах, работающих круглые сутки по несколько лет, они недопустимы. Для их исправления используется технология ECC (error-correcting code), эффективность которой составляет 99,988%.

Расчетная тепловая мощность (TDP) . По сути, энергопотребление процессора при максимальной нагрузке. Xeon’ы, как правило, имеют меньший тепловой пакет и более «умные» алгоритмы энергосбережения, что в итоге приводит к меньшим счетам за электричество и более эффективному охлаждению.

Кэш L3 . Кэш-память – своеобразная прослойка между процессором и оперативной памятью, обладающая очень высокой скоростью. Чем больше объем кэша, тем быстрее работает процессор, так как даже очень быстрая оперативная память работает значительно медленнее кэш-памяти. Обычно процессоры Xeon имеют больший объем кэша, поэтому они предпочтительнее для ресурсоемких приложений.

Частота / Частота в режиме TurboBoost . Тут все просто – чем выше частота, тем быстрее при прочих равных условиях работает процессор. Базовая частота, то есть частота, при которой работают процессоры при полной нагрузке, одинаковая, но вот в режиме Turbo Boost, то есть при работе с приложениями, не рассчитанными на многоядерные процессоры, Xeon быстрее.

Поддержка Intel TSX-NI . Intel Transactional Synchronization Extensions New Instructions (Intel TSX-NI) подразумевает под собой надстройку над системой работы с кэшем процессора, оптимизирующую среду исполнения многопоточных приложений, но, конечно, только в том случае, если эти приложения используют программные интерфейсы TSX-NI. Наборы инструкций TSX-NI позволяют более эффективно реализовать работу с Big Data и базами данных - в случаях, когда множество потоков обращаются к одним и тем же данным и возникают ситуации блокировки потоков. Спекулятивный доступ к данным, который реализован в TSX, позволяет эффективнее строить такие приложения и более динамично масштабировать производительность при увеличении числа параллельно исполняемых потоков за счет разрешения конфликтов при доступе к общим данным.


Поддержка Trusted Execution . Технология Intel Trusted Execution расширяет возможности безопасного исполнения команд посредством аппаратного расширения возможностей процессоров и наборов микросхем Intel. Эта технология обеспечивает для платформ цифрового офиса такие функции защиты, как измеряемый запуск приложений и защищенное выполнение команд. Это достигается за счет создания среды, где приложения выполняются изолированно от других приложений системы.

К преимуществам процессоров Xeon старших моделей можно добавить еще больший объем L3, до 45 МБ, большее количество ядер, до 18, и больший объем поддерживаемой оперативной памяти, до 768 ГБ на процессор. При этом потребление не превышает 160 Вт. На первый взгляд, это очень большое значение, однако, учитывая то, что производительность таких процессоров в несколько раз превышает быстродействие того же Xeon E3-1220 V3 с TDP 80 Вт, экономия становится очевидной. Также следует отметить, что ни один из процессоров семейства Core не поддерживает многопроцессорность, то есть возможна установка не более одного процессора в один компьютер. Большая часть приложений для серверов и рабочих станций прекрасно масштабируется по ядрам, потокам и физическим процессорам, поэтому установка двух процессоров даст практически двукратный прирост производительности.

Переводим... Перевести Китайский (упрощенное письмо) Китайский (традиционное письмо) Английский Французский Немецкий Итальянский Португальский Русский Испанский Турецкий

К сожалению, мы не можем перевести эту информацию прямо сейчас - пожалуйста, повторите попытку позже.

Введение

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

В этой статье я расскажу о трех возможностях процессоров Intel ® , полезных для оптимизации производительности приложений NFV: технологии выделения кэша (CAT), Intel® Advanced Vector Extensions 2 (Intel ® AVX2) для обработки векторных данных и Intel® Transactional Synchronization Extensions (Intel ® TSX).

Решение проблемы инверсии приоритета с помощью САТ

Когда низкоприоритетная функция крадет ресурсы у высокоприоритетной функции, мы называем это «инверсией приоритета».

Не все виртуальные функции одинаково важны. Например, для функции маршрутизации важно время обработки и производительность, тогда как для функции кодирования мультимедиа это не так важно. Этой функции вполне можно разрешить периодически терять пакеты без влияния на удобство пользователей, поскольку все равно никто не заметит снижения кадровой скорости видео с 20 до 19 кадров в секунду.

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

Разработчики часто исходят из того, что если они поместят одно высокоприоритетное приложение в определенное ядро, то там это приложение будет в безопасности, на него не смогут повлиять низкоприоритетные приложения. К сожалению, это не так. У каждого ядра есть собственный кэш первого уровня (L1, самый быстрый кэш, но самого маленького размера) и кэш второго уровня (L2, несколько больше по размеру, но медленнее). Существуют раздельные области кэша первого уровня для данных (L1D) и для кода программ (L1I, «I» означает «инструкции»). Кэш третьего уровня (самый медленный) является общим для всех ядер процессора. В архитектуре процессоров Intel ® до семейства Broadwell включительно кэш третьего уровня полностью включительный, т. е. он содержит все, что содержится в кэше первого и второго уровней. В силу особенностей работы включительного кэша, если что-то удалить из кэша третьего уровня, это также будет удалено из соответствующего кэша первого и второго уровней. Это приводит к тому, что низкоприоритетное приложение, которому нужно место в кэше третьего уровня, может вытеснить данные из кэша первого и второго уровней высокоприоритетного приложения, даже если оно работает на другом ядре.

В прошлом для обхода этой проблемы существовал подход, который получил название «прогрев». При конкуренции доступа к кэшу третьего уровня «победителем» является приложение, чаще всего обращающееся к памяти. В связи с этим решение состоит в том, чтобы высокоприоритетная функция постоянно обращалась к кэшу, даже при бездействии. Это не слишком изящное решение, но зачастую оно оказывалось вполне приемлемым, и до недавних пор у него не было альтернатив. Но теперь альтернатива есть: в семействе процессоров Intel ® Xeon ® E5 v3 появилась технология распределения кэша (CAT), дающая возможность выделять кэш в соответствии с приложениями и классами обслуживания.

Влияние инверсии приоритета

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

Вот код на языке С.

// Build a linked list of size N with pseudo-random pattern void init_pool(list_item *head, int N, int A, int B) { int C = B; list_item *current = head; for (int i = 0; i < N - 1; i++) { current->tick = 0; C = (A*C + B) % N; current->next = (list_item*)&(head[C]); current = current->next; } } // Touch first N elements in a linked list void warmup_list(list_item* current, int N) { bool write = (N > POOL_SIZE_L2_LINES) ? true: false; for(int i = 0; i < N - 1; i++) { current = current->next; if (write) current->tick++; } } void measure(list_item* head, int N) { unsigned __long long i1, i2, avg = 0; for (int j = 0; j < 50; j++) { list_item* current = head; #if WARMUP_ON while(in_copy) warmup_list(head, N); #else while(in_copy) spin_sleep(1); #endif i1 = __rdtsc(); for(int i = 0; i < N; i++) { current->tick++; current = current->next; } i2 = __rdtsc(); avg += (i2-i1)/50; in_copy = true; } results=avg/N }

Он содержит три функции.

  • Функция init_pool() инициализирует скомпонованный список в большой распределенной свободной области памяти с помощью простого генератора псевдослучайных чисел. За счет этого элементы списка не находятся рядом друг с другом в памяти: в таком случае образовалась бы пространственная локальность, что повлияло бы на наши измерения, поскольку для некоторых элементов автоматически была бы задействована упреждающая выборка. Каждый элемент списка - ровно одна строка кэша.
  • Функция warmup() постоянно обходит скомпонованный список. Нужно обращаться к определенным данным, которые должны находиться в кэше, поэтому эта функция не позволяет другим потокам вытеснить скомпонованный список из кэша третьего уровня.
  • Функция measure() измеряет обход одного элемента списка, затем либо засыпает на 1 миллисекунду, либо вызывает функцию warmup() в зависимости от того, какой тест мы запускаем. Затем функция measure() усредняет результаты.

Результаты микротеста на процессоре Intel ® Core™ i7 5 -го поколения показаны на приведенном ниже графике, где по оси X откладывается общее количество строк кэша в скомпонованном списке, а по оси Y - среднее количество циклов ЦП на каждое обращение к скомпонованному списку. По мере увеличения размера скомпонованного списка он выходит за пределы кэша данных первого уровня в кэш второго, а затем и третьего уровня, а затем попадает в основную память.

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

Зеленая линия показывает эффект прогрева при запущенной функции копирования в памяти: время доступа резко снижается и приближается к базовому значению.

Если включить CAT и выделить части кэша третьего уровня в монопольное использование каждым ядром, результаты будут очень близки к базовым (слишком близки для показа на схеме), а именно такова наша цель.

Включение CAT

Прежде всего, убедитесь в том, что платформа поддерживает CAT. Можно использовать инструкцию CPUID, проверяя адрес leaf 7, subleaf 0, добавленный для указания о доступности CAT.

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

У каждого процессорного гнезда есть регистры MSR IA32_L3_MASKn (например, 0xc90, 0xc91, 0xc92, 0xc93). В этих регистрах хранится битовая маска, указывающая, сколько кэша третьего уровня следует выделять для каждого класса обслуживания (COS). В 0xc90 хранится выделение кэша для COS0, в 0xc91 - для COS1 и т. д.

Например, на этой диаграмме показаны некоторые возможные битовые маски для разных классов обслуживания, чтобы продемонстрировать, как можно устроить разделение кэша: COS0 получает половину, COS1 получает четверть, а COS2 и COS3 по одной восьмой части. Например, 0xc90 содержал бы 11110000, а 0xc93 - 00000001.

Алгоритм прямого ввода-вывода данных (DDIO) имеет собственную скрытую битовую маску, позволяющую передавать поток данных с высокоскоростных устройств PCIe, таких как сетевые адаптеры, в определенные области кэша третьего уровня. При этом есть вероятность возникновения конфликта с определяемыми классами обслуживания, поэтому нужно учитывать это при создании приложений NFV высокой пропускной способности. Для тестирования образования конфликтов используйте для выявления промахов мимо кэша. В некоторых BIOS есть настройка, позволяющая просматривать и изменять маску DDIO.

Каждое ядро имеет регистр MSR IA32_PQR_ASSOC (0xc8f), указывающий, какой класс обслуживания применяется к этому ядру. Класс обслуживания по умолчанию - 0, это означает, что используется битовая маска в MSR 0xc90. (По умолчанию битовая маска 0xc90 имеет значение 1, чтобы обеспечить наибольшую доступность кэша.)

Самая простая модель использования CAT в NFV - выделение фрагментов кэша третьего уровня различным ядрам с помощью изолированных битовых масок, а затем закрепление потоков или виртуальных машин за ядрами. Если виртуальным машинам требуется общий доступ к ядрам для выполнения, также можно сделать тривиальное исправление для планировщика ОС, добавить маску кэша в потоки, в которых работают виртуальные машины, и динамически включать ее в каждом событии расписания.

Существует еще один необычный способ использования CAT для блокирования данных в кэше. Сначала создайте активную маску кэша и обратитесь к данным в памяти, чтобы загрузить их в кэш третьего уровня. Затем отключите биты, представляющие эту часть кэша третьего уровня в любой битовой маске САТ, которая будет использована в будущем. Данные будут заблокированы в кэше третьего уровня, поскольку теперь их невозможно оттуда вытеснить (помимо DDIO). В приложении NFV этот механизм позволяет блокировать таблицы поиска среднего размера для маршрутизации и анализа пакетов в кэше третьего уровня для обеспечения постоянного доступа.

Использование Intel AVX2 для обработки векторов

Инструкции SIMD (одна инструкция - много данных) позволяют одновременно осуществлять одну и ту же операцию с разными фрагментами данных. Эти инструкции часто используются для ускорения вычислений с плавающей запятой, но также доступны и версии инструкций для работы с целыми числами, логическими значениями и данными.

В зависимости от используемого процессора вам будут доступны разные семейства инструкций SIMD. Будет различаться и размер вектора, обрабатываемого командами:

  • SSE поддерживает 128-разрядные векторы.
  • В Intel AVX2 поддерживаются целочисленные инструкции для 256-разрядных векторов и реализованы инструкции для операций сбора.
  • В расширениях AVX3 в перспективных архитектурах Intel ® будут поддерживаться 512-разрядные векторы.

Один 128-разрядный вектор можно использовать для двух 64-разрядных переменных, четырех 32-разрядных или восьми 16-разрядных переменных (в зависимости от используемых инструкций SIMD). В более крупные векторы поместится больше элементов данных. Учитывая потребность приложений NFV в высокой пропускной способности, следует всегда использовать наиболее мощные инструкции SIMD (и соответствующее оборудование), на сегодняшний день это Intel AVX2.

Инструкции SIMD чаще всего используются для выполнения одной и той же операции с вектором значений, как показано на рисунке. Здесь операция по созданию от X1opY1 до X4opY4 представляет собой одну инструкцию, одновременно обрабатывающую элементы данных с X1 по X4 и с Y1 по Y4. В этом примере ускорение будет четырехкратным по сравнению с обычным (скалярным) выполнением, поскольку одновременно обрабатываются четыре операции. Ускорение может быть настолько же большим, насколько велик вектор SIMD. В приложениях NFV часто происходит обработка нескольких потоков пакетов одинаковым способом, поэтому здесь инструкции SIMD позволяют естественным образом оптимизировать производительность.

Для простых циклов компилятор часто сам автоматически осуществляет векторизацию операций с помощью использования самых последних инструкций SIMD, доступных для данного ЦП (если использовать нужные флаги компилятора). Можно оптимизировать код для использования наиболее современного набора инструкций, поддерживаемых оборудованием, во время выполнения либо можно скомпилировать код для определенной целевой архитектуры.

Операции SIMD также поддерживают загрузку в память, копируя до 32 байт (256 бит) из памяти в регистр. Это позволяет передавать данные между памятью и регистрами, минуя кэш, и собирать данные из разных расположений в памяти. Также можно выполнять различные операции с векторами (изменение данных в пределах одного регистра) и сохранение векторов (запись до 32 байт из регистра в память).

Memcpy и memmov - широко известные примеры основных процедур, которые были с самого начала реализованы с помощью инструкций SIMD, поскольку инструкция REP MOV была слишком медленной. Код memcpy регулярно обновлялся в системных библиотеках, чтобы использовать самые последние инструкции SIMD. Для получения данных о том, какая из последних версий доступна для использования, использовалась таблица диспетчера CPUID. При этом реализация новых поколений инструкций SIMD в библиотеках обычно запаздывает.

Например, следующая процедура memcpy, использующая простой цикл, основана на встроенных функциях (вместо кода библиотеки), поэтому компилятор может оптимизировать ее для последней версии инструкций SIMD.

Mm256_store_si256((__m256i*) (dest++), (__m256i*) (src++))

Она компилируется в следующий ассемблерный код и обладает вдвое более высокой производительностью по сравнению с недавними библиотеками.

C5 fd 6f 04 04 vmovdqa (%rsp,%rax,1),%ymm0 c5 fd 7f 84 04 00 00 vmovdqa %ymm0,0x10000(%rsp,%rax,1)

Ассемблерный код из встроенной функции будет копировать 32 байта (256 бит) с помощью самых последних доступных инструкций SIMD, тогда как код библиотеки, использующий SSE, будет копировать только 16 байт (128 бит).

Приложениям NFV часто необходимо выполнять операцию сбора, загружая данные из нескольких расположений в разных местах памяти, находящихся не подряд. Например, сетевой адаптер может поместить входящие пакеты в кэш с помощью DDIO. Приложению NFV может требоваться доступ только к части сетевого заголовка с IP-адресом назначения. С помощью операции сбора приложение может одновременно собрать данные для 8 пакетов.

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

Int a; int b; for (i = 0; i < 1024; i++) a[i] = i; for (i = 0; i < 64; i++) b[i] = (i*1051) % 1024; for (i = 0; i < 64; i++) sum += a]; // This line is vectorized using gather.

Последняя строка компилируется в следующий ассемблерный код.

C5 fe 6f 40 80 vmovdqu -0x80(%rax),%ymm0 c5 ed fe f3 vpaddd %ymm3,%ymm2,%ymm6 c5 e5 ef db vpxor %ymm3,%ymm3,%ymm3 c5 d5 76 ed vpcmpeqd %ymm5,%ymm5,%ymm5 c4 e2 55 90 3c a0 vpgatherdd %ymm5,(%rax,%ymm4,4),%ymm7

Одна операция сбора значительно быстрее последовательности загрузок, но это имеет смысл только в случае, если данные уже находятся в кэше. В противном случае данные придется получать из памяти, а для этого нужны сотни или тысячи циклов ЦП. Если данные находятся в кэше, то возможно ускорение в 10 раз
(т. е. на 1000 %). Если же данных нет в кэше, ускорение составляет лишь 5 %.

При использовании подобных методик важно анализировать приложение, чтобы выявлять узкие места, а также понимать, тратит ли приложение слишком много времени на копирование или сбор данных. Для измерения производительности программ можно использовать .

Еще одна полезная для NFV функция в Intel AVX2 и других операциях SIMD - побитовые и логические операции. Они используются для ускорения нестандартного кода шифрования, а битовая проверка удобна для разработчиков ASN.1 и часто используется для данных в телекоммуникациях. Intel AVX2 можно использовать для ускоренного сравнения строк с помощью усовершенствованных алгоритмов, таких как MPSSEF.

Расширения Intel AVX2 хорошо работают на виртуальных машинах. Производительность не отличается, не возникает ошибочных выходов виртуальных машин.

Использование Intel TSX для более высокой масштабируемости

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

Intel Transactional Synchronization Extensions (TSX) предоставляют процессорные инструкции для обхода блокировок при транзакциях в аппаратной памяти. Это помогает добиться более высокой масштабируемости. Работает это так: когда программа заходит в секцию, использующую Intel TSX для охраны расположений в памяти, записываются все попытки доступа к памяти, а в конце защищенного сеанса они либо автоматически фиксируются, либо автоматически откатываются. Откат выполняется в случае, если при выполнении из другого потока был конфликт доступа к памяти, из-за которого могло возникнуть условие конкуренции (например, запись в расположение, из которого читает данные другая транзакция). Откат также может произойти в случае, если запись доступа к памяти станет слишком большой для реализации Intel TSX, при наличии инструкции ввода-вывода или системного вызова, а также при возникновении исключений или завершении работы виртуальных машин. Откат вызовов ввода-вывода происходит, если невозможно его спекулятивное выполнение из-за помехи извне. Системный вызов - очень сложная операция, изменяющая кольца и дескрипторы памяти, ее очень трудно откатить.

Распространенным примером использования Intel TSX является управление доступом в таблице хэша. Обычно для гарантии доступа к таблице кэша применяется ее блокировка, но при этом возрастает время ожидания для потоков, конкурирующих за доступ. Блокировка зачастую является слишком грубой: блокируется целая таблица, хотя ситуация, когда потоки пытаются получить доступ к одним и тем же элементам, возникает крайне редко. При увеличении количества ядер (и потоков) грубая блокировка препятствует масштабируемости.

Как показано на схеме ниже, грубая блокировка может привести к тому, что один поток будет ждать высвобождения таблицы хэша другим потоком, хотя эти потоки используют разные элементы. Применение Intel TSX дает возможность работать обоим потокам, их результаты фиксируются после успешного достижения окончания транзакции. Оборудование обнаруживает конфликты на лету и отменяет транзакции, нарушающие правильность. При использовании Intel TSX поток 2 не должен ждать, оба потока выполняются намного раньше. Блокировка по таблицам хэша преобразуется в точно настраиваемую блокировку, что приводит к повышению производительности. В Intel TSX поддерживается точность отслеживания для конфликтов на уровне одной строки кэша (64 байта).

В Intel TSX используются два программных интерфейса, чтобы указывать секции кода для выполнения транзакций.

  • Обход аппаратных блокировок (HLE) обладает обратной совместимостью, его можно использовать без особого труда для повышения масштабируемости, не подвергая библиотеку блокировок серьезным изменениям. В HLE появились префиксы для заблокированных инструкций. Префикс инструкции HLE дает оборудованию сигнал на отслеживание состояния блокировки без ее получения. В приведенном выше примере выполнение описанных действий приведет к тому, что доступ к другим элементам таблицы хэша больше не будет приводить к блокировке, кроме случаев, когда осуществляется конфликтующий доступ на запись к значению, хранящемуся в таблице хэша. В результате доступ будет распараллелен, поэтому по всем четырем потокам будет повышена масштабируемость.
  • Интерфейс RTM включает явные инструкции начала (XBEGIN), фиксирования (XEND), отмены (XABORT) и тестирования состояния (XTEST) транзакций. Эти инструкции предоставляют библиотекам блокировки более гибкий выход реализации обхода блокировок. Интерфейс RTM позволяет библиотекам использовать гибкие алгоритмы отмены транзакций. Эту возможность можно использовать для повышения производительности Intel TSX с помощью оптимистичного перезапуска транзакций, возврата транзакций и других расширенных методик. С помощью инструкции CPUID библиотека может откатиться к более старой реализации блокировок без RTM, сохраняя обратную совместимость с кодом на уровне пользователя.
  • Для получения дополнительных сведений о HLE и RTM рекомендую ознакомиться со следующими статьями портала Intel Developer Zone.

Как и оптимизация примитивов синхронизации с помощью HLE или RTM, функции плана данных NFV могут получить преимущество за счет Intel TSX при использовании пакета Data Plane Development Kit (DPDK) .

При использовании Intel TSX основная трудность заключается не в реализации этих расширений, а в оценке и определении их производительности. Существуют счетчики производительности, которые могут использоваться в программах Linux* perf, и для оценки успешности выполнения Intel TSX (количество выполненных и количество отмененных циклов).

Intel TSX следует использовать в приложениях NFV с осторожностью и тщательно тестировать, поскольку операции ввода-вывода в области, защищенной Intel TSX, всегда включают откат, а многие функции NFV используют множество операций ввода-вывода. В приложениях NFV следует избегать конкурирующих блокировок. Если же блокировки необходимы, то алгоритмы обхода блокировок помогут повысить масштабируемость.

Об авторе

Александр Комаров работает инженером по разработке приложений в отделе Software and Services Group корпорации Intel. В течение последних 10 лет основная работа Александра заключалась в оптимизации кода для достижения наивысшей производительности на существующих и перспективных серверных платформах Intel. Такая работа включает использование средств Intel для разработки программного обеспечения: это профилировщики, компиляторы, библиотеки, последние наборы инструкций, наноархитектура и усовершенст­вования архитектуры самых современных процессоров архитектуры x86 и наборов микросхем.

Дополнительные сведения

Дополнительные сведения о NFV см. в следующих видеоматериалах.