Русский
Русский
English
Статистика
Реклама

Cpu

Уязвимость Crosstalk

29.11.2020 16:21:40 | Автор: admin

В последние годы стало появляться большое количество сообщений о всякого рода уязвимостях в процессорах компании Intel. Самыми известными из них являются Spectre и Meltdown, основанные на ошибках в реализации спекулятивного исполнения команд. В июне 2020 года появилось сообщение о новой уязвимости, носящей название Crosstalk.

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

Спекулятивные вычисления

Спекулятивное исполнение команд процессором является одним из аппаратных способов выявления параллелизма на уровне команд. Вычисления проводятся одновременно для нескольких путей исполнения программы. Простейшим примером является спекулятивное вычисление двух веток при условном переходе.

Конвейер

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

Как происходит межъядерное взаимодействие?

Существует набор инструкций процессора Интел семейства x86 с нетривиальным поведением. Такие инструкции состоят из нескольких операций, называемых микрокодом. Исследователи из Vrije Universiteit Amsterdam провели ряд экспериментов, в которых изучалась работа инструкций процессора с разными наборами аргументов. Оказывается, что в ряде случаев такой микрокод осуществляет операции чтения-записи вне ядра через внутренние шины процессора в регистры MDS (Model-Specific-Registers) с помощью операций RDMSR и WRMSR. Эти операции являются привилегированными и могут исполняться только операционной системой. Для userspace примерами таких инструкций являются CPUID, RDRAND и RDSEED.

Промежуточный буфер сохраняет результаты ранее выполненных инструкций, такие как сгенерированные DRNG случайные числа, хэши состояния bootguard и другие ценные данные. Чтение из промежуточного буфера с помощью Crosstalk позволяет получать доступ к данным, к которым обращался пользователь, и которые остались в этом буфере после выполнения таких запросов, как например RDRAND и RDSEED.

RDRAND и RDSEED

Инструкция RDRAND возвращает случайные числа, полученные от digital random number generator (DRNG), и может быть вызвана из пользовательского пространства. DRNG выводит случайные начальные состояния и передает их генератору случайных битов, который заполняет глобальную очередь случайных чисел. Инструкция RDSEED обеспечивает доступ к более качественному источнику энтропии, т.к. предназначена для программных RNG.

Внутренние буферы процессора

Забегая немного назад в списке уязвимостей, стоит отметить RIDL, которая позволяет создавать утечки информации из разных источников, таких как кэши и буферы процессора: Line Fill Buffer, Load Ports, Store Buffer.

Line Fill Buffer (LFB) используется для отслеживания кэш миссов L1 Cache (невыполненных запросов памяти) и передачи кэш-линий за пределами L1 Cache. Например, при кэш миссе, вместо блокировки кэша, операция помещается в LFB и обрабатывается асинхронно. Это позволяет кэшу обслуживать другие запросы. Промежуточный буфер получает данные от ядра из LFB.

Store Buffer отслеживает запросы на запись данных.

Load Ports используются конвейером процессора при загрузке данных из памяти или I/O операций. Когда выполняется микрокод загрузки, данные сначала сохраняются в Load Ports перед передачей в регистры.

Детектирование Crosstalk

Детектирование Crosstalk состоит из двух стадий. Сначала проверяются различные инструкции, делающие запросы вне ядра с разными операндами. Затем анализируются данные, полученные от такого рода запросов, чтобы понять, как устроено взаимодействие между LFB, расположенном на ядре, и внешним разделяемым буфером. Разные инструкции записывают данные в разделяемый буфер с разным размером отступа. На другом ядре происходит чтение из этого буфера и наблюдение за изменениями, вносимыми первым ядром. Таким образом, злоумышленник может сгенерировать набор инструкций, позволяющий читать почти все инструкции, поступающие в промежуточный буфер от другого ядра.

FLUSH + RELOAD

inline int probe(char *adrs) {  volatile unsigned long time;  asm __volatile__ (    "  mfence             \n"    "  lfence             \n"    "  rdtsc              \n"    "  lfence             \n"    "  movl %%eax, %%esi  \n"    "  movl (%1), %%eax   \n"    "  lfence             \n"    "  rdtsc              \n"    "  subl %%esi, %%eax  \n"    "  clflush 0(%1)      \n"    : "=a" (time)    : "c" (adrs)    :  "%esi", "%edx");  return time;}

В качестве примера рассмотрим RIDL атаку с использованием LFB, выполняемую в четыре этапа. Сначала злоумышленник создает массив FLUSH + RELOAD, содержащий одно значение для каждой строки кэша (обычно байт) и выполняет операцию FLUSH, чтобы гарантировать, что ни одна из этих строк не находится в кэше. Затем злоумышленник предлагает программе-жертве прочитать или записать секретные данные или обеспечить удаление таких данных из кэша. В любом случае, процессор перемещает данные в LFB. Затем злоумышленник выполняет загрузку данных (операцию load), вызывающую исключение или pagefault. При этом, такая операция считается успешной, данные сохраняются в LFB. Затем спекулятивно исполняемый код злоумышленника использует данные, соответствующие индексу в массиве FLUSH + RELOAD. Соответствующая строка кэша будет загружена в кэш конвейером, когда он выполнит спекулятивный код. Наконец, загрузив каждый элемент массива и определив время загрузки, злоумышленник может определить, какой из них был в кеше. Индекс в кэше - это секретные данные, полученный из LFB.

CPUID

pid_t pid = fork();if (pid == 0) {    while (1)        asm volatile(            "mov %0, %%eax\n"            "cpuid\n"            ::"r"(CPUID_LEAF):"eax","ebx","ecx","edx");}for(size_t offset = BEGIN_OFFSET; offset < BEGIN_OFFSET + 4; ++offset) {    // ...    for(size_t i(0); i < ITERS; ++i) {        flush(reloadbuffer);        tsx_leak_read_normal(leak + offset, reloadbuffer);        reload(reloadbuffer, results);    }}

На представленном листинге показано, как осуществляется запрос на примере CPUID. Эта команда позволяет получить информацию о процессоре. Такого рода запросы называются MDS. К их числу относится упомянутый ранее RIDL. Запросы проводятся с разным смещением в разделяемом буфере. Смещение вызывает ошибку при чтении страницы, так как читаемый вектор захватывает границы страницы. Затем при помощи FLUSH + RELOAD можно получить данные, прочитанные во время выполнения инструкции. Таким образом, CPUID вызывает 4 запроса вне ядра, что говорит об успешной демонстрации CROSSTALK. В следующей таблице представлены результаты различных операций, реализуемых CROSSTALK

Замедление работы процессора

Одним из примеров атаки может служить замедление работы при запросах определенного рода ресурсов. Рассмотрим инструкцию RDSEED. Объем доступной энтропии всегда ограничен, причем RDSEED возвращает 0, если нет доступной энтропии. Неуспешный вызов RDSEED не перезаписывает содержимое промежуточного буфера. Таким образом, злоумышленник может потреблять доступную энтропию, самостоятельно выполняя запросы RDRAND и RDSEED, в то время как ядро-жертва не сможет получить достаточный объем энтропии для успешного завершения вызова RDSEED. С помощью такого рода запросов можно читать данные, записанные пользователем в разделяемый буфер. Когда запрос жертвы все же вернет положительный результат, данные в разделяемом буфере перезапишутся. Но в то же время, злоумышленник может уже прочитать данные, до завершения работы вызовов FLUSH + RELOAD.

Виртуальные машины

Если злоумышленники имеют возможность писать код только внутри виртуальной машины, то операции, позволяющие получать доступ к промежуточному буферу, ограничены. Например, обычно виртуальные машины запрещают пользователю выполнять вызов CPUID, чтобы не позволять пользователю получать информацию о возможностях виртуальной машины. Тем не менее, инструкции RDRAND и RDSEED могут быть исполнены из пространства пользователя, что создает уязвимость и для виртуальных машин. Примером может стать составление запросов гипервизору, а затем чтение из промежуточного буфера в LFB. Даже если процессор оснащен защитой от MDS атак, злоумышленник может получать содержимое разделяемого буфера из соседнего потока (hyperthread), раскрывая данные жертвы, работающей на другом ядре.

Устранение уязвимости

Компания Интел предоставила решение проблемы, которое заключается в блокировании шины данных перед обновлением промежуточного буфера и снятии блокировки только после завершения очистки содержимого буфера. Таким образом, одно из ядер не сможет читать инструкции, исполняемы на другом ядре. Такого рода блокировки, в свою очередь, создают большие задержки при работе с промежуточным буфером. Чтобы увеличить производительность операций записи в буфер, было предложено ограничиться блокировками буфера только для тех операций, которые представляют угрозу для безопасности данных, такие как рассмотренные ранее RDRAND, RDSEED и EGETKEY. В то же время, существует ряд команд, способных на чтение данных вне ядра, не регулируемых локами.

Выводы

Crosstalk представляет собой уязвимость нового рода, позволяющую злоумышленникам получать доступ к данным из промежуточного буфера, разделяемого несколькими ядрами. Предыдущие способы борьбы с MDS уязвимостями не позволяют бороться с такого вида атаками (а в ряде случаев, ухудшают ситуацию). Решение проблемы позволяет полностью ограничить доступ к данным, записанным другим ядром в промежуточный буфер, но создает дополнительные накладные расходы из-за блокирования буфера. Несмотря на то, что большинство современных процессоров Интел подвержены межъядерным атакам, компании не известно ни одного примера атаки за пределами лаборатории. В то же время, на серверных процессорах высокого уровня обеспечивается защита от такого рода угроз, и некоторые наиболее современные процессоры не подвержены атакам MDS.

Подробнее..

Перевод Как параллельные вычисления повлияют на индустрию безопасности?

13.04.2021 20:10:28 | Автор: admin

У центральных и графических процессоров разная архитектура и разные сценарии использования. ЦП это мозг большинства наших электронных устройств. Они хорошо справляются с множеством различных задач. Это процессоры очень общего назначения, координирующие широкий спектр задач, которые выполняет компьютер. С другой стороны, графические процессоры гораздо более специализированные вычислительные системы. Они предназначены для эффективной обработки 3D-изображений, но визуализация графики это очень большая вычислительная нагрузка на матричную арифметику. Типы вычислений, в которых графическим процессорам нет равных, называются параллельными вычислениями, то есть это задачи, которые можно разделить на меньшие, независимые вычисления и выполнять одновременно. И этому потенциалу находится нетипичное применение.


В этом 90-секундном видео, где разрушители мифов Адам Сэвидж и Джейми Хайнеман показывают робота-художника, которого они построили, чтобы проиллюстрировать работу параллельных вычислений.

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

Если посмотреть на то, как количество ядер в графическом процессоре меняется со временем, видно, что последние несколько лет оно растёт экспоненциально. И в то время как большинство центральных процессоров имеет несколько десятков ядер, графические процессоры насчитывают тысячи ядер. В новейших высокопроизводительных графических процессорах компании Nvidia более 10 000 ядер.

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

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

Они всегда сотрудничают с разработчиками в целях реструктуризации алгоритмов, используемых в их приложениях, чтобы использовать аппаратное обеспечение Nvidia с максимальной отдачей. В результате достигнута очень хорошая интеграция с широко используемыми приложениями, такими как Adobe Photoshop CC, Adobe Premiere CC и Autodesk Maya.

Платформу CUDA можно скачать бесплатно, но для работы с ней требуется графический процессор Nvidia. Также существует альтернатива с открытым исходным кодом OpenCL, которая служит основной платформой для обработки графики на графических процессорах AMD. Компания Nvidia поддерживает OpenCL, но, так как платформа CUDA разрабатывается для работы с оборудованием Nvidia, она показывает более высокую производительность при работе на графических процессорах Nvidia.

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

Рассмотрим сценарий, в котором требуется вручную сложить две матрицы 20x20. Вы зовёте ещё 19 друзей и говорите им, что каждый из них отвечает за вычисление одной строки, а затем вы снова объединяете результаты в одну матрицу.

Поскольку каждый элемент матрицы можно рассчитать независимо, вы можете выполнять собственные вычисления, не вмешиваясь в расчёты своих друзей; все вы можете делать свои вычисления параллельно.

Взлом паролей это чрезвычайно параллельная задача, так как он основан на том же принципе. Я уже подробно описывал взлом паролей, но сейчас хочу описать это простыми словами.

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

Для простоты предположим, что:

  • Им известно, что приложение ограничивает пароли пользователей 10 символами.

  • Они могут только попытаться перебрать пароли (предположим, что нет словаря, нет масок и нет радужных таблиц).

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

Они должны будут повторить это для всех комбинаций символов, включая все 10 допустимых символов.

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

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

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

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

FPGA и ASIC

Увеличение скорости хэширования в 100 раз с помощью графических процессоров плохая новость для людей, которые пытаются надёжно хранить пароли.

Однако не все алгоритмы хэширования уязвимы для атак с ускорением на основе графических процессоров.

Чтобы сделать алгоритмы хэширования более устойчивыми к таким атакам, разработчики пытаются заставить алгоритмы использовать большой объём памяти, чтобы увеличить вычислительные затраты такой атаки.

bcrypt один из таких алгоритмов.

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

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

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

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

Графические процессоры фактически служат примером специализированных ASIC-микросхем. Вначале они были созданы строго для вычислений при решении задач визуализации. Только через некоторое время, в конце 2000-х, когда вышла платформа CUDA, они начали становиться более программируемыми.

Обратная сторона заключается в том, что разработка заказных микросхем обходится дорого, так как помимо производственных затрат требуются затраты на исследования и разработку.

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

Вот почему вы, вероятно, слышали о ASIC-микросхемах для майнинга биткойнов. Эти микросхемы могут делать только одно вычислять двойные хэши SHA256, а в настоящее время майнинг биткоинов достаточно прибылен, чтобы оправдать их производство.

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

Можно ли ASIC-микросхемы вместо майнинга биткоинов использовать взлома паролей?

Как я уже сказал, ASIC-микросхемы разрабатываются с нуля с одной целью, и в случае установок для майнинга биткойнов эта задача заключается в вычислении двойных хэшей SHA256.

Такие установки не могут делать ничего, кроме этого. Они полезны, только если пароли, которые пытаются взломать злоумышленники, были дважды хэшированы по алгоритму SHA256, что маловероятно.

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

Злоумышленникам потребовалось бы настроить по одной ASIC-установке для каждой функции хэширования и настраиваемой функции, такой как bcrypt, для каждой вероятной комбинации параметров. Мало того, что это трудно сделать с точки зрения разработки, но атака также должна иметь смысл с финансовой точки зрения.

FPGA-установки для взлома Bcrypt-паролей

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

Давайте посмотрим, как FPGA смогут преодолеть ограничения графических процессоров при взломе bcrypt.

С общими функциями хэширования, такими как SHA1 и MD5, вероятно, придётся попрощаться из-за графических процессоров, так как эти алгоритмы не создают узкие места в памяти, поскольку они не были предназначены для хранения паролей.

Для вычисления bcrypt-хэша процессору придётся постоянно обращаться к инструкциям, хранящимся в памяти. У каждого ядра есть быстрый, но небольшой объём памяти (кэш L1). Если в памяти L1 недостаточно места для вычисления хэша, данные должны храниться в более медленной основной оперативной памяти графического процессора, общей для всех ядер.

Передача этих данных обходится дорого, и это создаёт огромное узкое место для количества хэшей в секунду, которое может вычислить компьютер. Большая часть времени вычисления bcrypt-хэшей тратится впустую в ожидании поступления данных из основной памяти в более быструю память, чтобы можно было вычислить хэш.

Это не проблема для FPGA-микросхем, потому что у них более чем достаточно памяти L1 для работы с bcrypt-хэшами.

Персонал службы уведомлений о нарушении паролей Scattered Secrets хотел проверить это, поэтому они построили кластер из FPGA-микросхем, способный взламывать bcrypt примерно в 3540 раз быстрее, чем современные высокопроизводительные графические процессоры, используя только около 5% мощности.

Используя RTX 2080Ti в качестве бенчмарка, они получили 54 тысячи bcrypt-хэшей в секунду на своей тестовой установке, в то время как установка, которую они построили с 18 четырёхъядерными FPGA-платами Spartan-6 LX150, выдавала 2,1 миллиона bcrypt-хэшей в секунду.

Имейте в виду, что это не самые современные FPGA-микросхемы: они были введены ещё в 2011 году. Эти платы были популярным инструментом, потому что они поддерживали Jack The Ripper, популярное программное обеспечение для взлома паролей. Поскольку приложения для взлома паролей начинают поддерживать новые микросхемы, скорость таких атак будет только увеличиваться.

Заглядывая в будущее

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

Всегда будут существовать финансовые стимулы разработки новых технологий для решения сложных проблем, с которыми мы сталкиваемся как общество. Число ядер в одном графическом процессоре выросло с 1 ядра в 1995 году до 24 ядер в 2006 году, затем подскочило до 128 ядер в 2009 году и продолжило расти экспоненциально до 10 000 и выше к 2021 году.

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

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

По мере приближения к концу закона Мура (который гласит, что число транзисторов в микросхемах удваивается каждые два года), исследователи пытаются найти способы сохранения экспоненциального роста скорости, с которой мы можем делать сложные вычисления. Квантовые компьютеры могут полностью революционизировать искусственный интеллект (которому уделяется время на курсах Machine Learning и Machine Learning и Deep Learning), конечно же, индустрию безопасности, которой посвящен наш отдельный курс по Этичному хакингу.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Перевод Используем GPU для повышения производительности JavaScript

06.05.2021 14:05:14 | Автор: admin
image

Мы, разработчики, всегда стремимся искать возможности повышения производительности приложений. Когда речь идёт о веб-приложениях, то улучшения обычно вносятся только в код.

Но думали ли вы об использовании мощи GPU для повышения производительности веб-приложений?

В этой статье я расскажу о библиотеке ускорения JavaScript под названием GPU.js, а также покажу вам, как повысить скорость сложных вычислений.

Что такое GPU.js и почему его стоит использовать?


Если вкратце, GPU.js это библиотека ускорения JavaScript, которую можно использовать для любых стандартных вычислений на GPU при работе с JavaScript. Она поддерживает браузеры, Node.js и TypeScript.

Кроме повышения производительности если и множество других причин, по которым я рекомендую использовать GPU.js:

  • В основе GPU.js лежит JavaScript, что позволяет использовать синтаксис JavaScript.
  • Библиотека берёт на себя задачу автоматической транспиляции JavaScript на язык шейдеров и их компиляции.
  • Если в устройстве отсутствует GPU, она может откатиться к обычному движку JavaScript. То есть вы ничего не потеряете, работая с GPU.js.
  • GPU.js можно использовать и для параллельных вычислений. Кроме того, можно асинхронно выполнять множественные вычисления одновременно и на CPU, и на GPU.

Учитывая всё вышесказанное, я не вижу никаких причин не пользоваться GPU.js. Давайте узнаем, как его освоить.



Как настроить GPU.js?


Установка GPU.js для ваших проектов похожа на установку любой другой библиотеки JavaScript.

Для проектов Node


npm install gpu.js --saveoryarn add gpu.jsimport { GPU } from ('gpu.js')--- or ---const { GPU } = require('gpu.js')--- or ---import { GPU } from 'gpu.js'; // Use this for TypeScriptconst gpu = new GPU();

Для браузеров


Скачайте GPU.js локально или воспользуйтесь его CDN.

<script src="dist/gpu-browser.min.js"></script>--- or ---<script   src="http://personeltest.ru/aways/unpkg.com/gpu.js@latest/dist/gpu- browser.min.js"></script><script   rc="http://personeltest.ru/aways/cdn.jsdelivr.net/npm/gpu.js@latest/dist/gpu-browser.min.js"></script><script> const gpu = new GPU(); ...</script>

Примечание: если вы работаете в Linux, то нужно убедиться, что у вас установлены нужные файлы, при помощи команды: sudo apt install mesa-common-dev libxi-dev

Вот и всё, что нужно знать об установке и импорте GPU.js. Теперь можно использовать программирование GPU в своём приложении.

Кроме того, я крайне рекомендую разобраться в основных функциях и концепциях GPU.js. Итак, давайте начнём с основ GPU.js.

Создание функций


В GPU.js можно задавать выполняемые на GPU функции при помощи стандартного синтаксиса JavaScript.

const exampleKernel = gpu.createKernel(function() {    ...}, settings);

Показанный выше пример демонстрирует базовую структуру функции GPU.js. Я назвал функцию exampleKernel. Как видите, я использовал функцию createKernel, выполняющую вычисления при помощи GPU.

Также необходимо указать размер выводимых данных. В приведённом выше примере я использовал для задания размера параметр settings.

const settings = {    output: [100]};

Выходные данные функции ядра могут быть 1D, 2D или 3D, то есть можно использовать до трёх потоков. Доступ к этим потокам внутри ядра можно получить с помощью команды this.thread.

  • 1D: [length] value[this.thread.x]
  • 2D: [width, height] value[this.thread.y][this.thread.x]
  • 3D: [width, height, depth] value[this.thread.z][this.thread.y][this.thread.x]

Также созданную функцию можно вызывать как любую функцию JavaScript, по её имени: exampleKernel()

Поддерживаемые ядрами переменные


Число


Внутри функции GPU.js можно использовать любые integer или float.

const exampleKernel = gpu.createKernel(function() { const number1 = 10; const number2 = 0.10; return number1 + number2;}, settings);

Boolean


Булевы значения тоже поддерживаются в GPU.js, аналогично JavaScript.

const kernel = gpu.createKernel(function() {  const bool = true;  if (bool) {    return 1;  }else{    return 0;  }},settings);

Массивы


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

const exampleKernel = gpu.createKernel(function() { const array1 = [0.01, 1, 0.1, 10]; return array1;}, settings);

Функции


В GPU.js также допустимо использование приватных функций внутри функций ядер.

const exampleKernel = gpu.createKernel(function() {  function privateFunction() {    return [0.01, 1, 0.1, 10];  }  return privateFunction();}, settings);

Поддерживаемые типы вводимых данных


В дополнение к вышеуказанным типам переменных функциям ядер можно передавать множество других типов вводимых данных.

Числа


Функциям ядер можно передавать числа integer или float, аналогично объявлению переменных, см. пример ниже.

const exampleKernel = gpu.createKernel(function(x) { return x;}, settings);exampleKernel(25);

1D-, 2D- или 3D-массивы чисел


Ядрам GPU.js можно передавать типы массивов Array, Float32Array, Int16Array, Int8Array, Uint16Array, uInt8Array.

const exampleKernel = gpu.createKernel(function(x) { return x;}, settings);exampleKernel([1, 2, 3]);

Функции ядер также могут получать сжатые в одномерные (preflattened) 2D- и 3D-массивы. Такой подход сильно ускоряет загрузку, для этого нужно использовать опцию GPU.js input.

const { input } = require('gpu.js');const value = input(flattenedArray, [width, height, depth]);

HTML-изображения


По сравнению с традиционным JavaScript, передача в функции изображений является новой возможностью GPU.js. При помощи GPU.js можно передавать функции ядра одно или несколько HTML-изображений в виде массива.

//Single Imageconst kernel = gpu.createKernel(function(image) {    ...})  .setGraphical(true)  .setOutput([100, 100]);const image = document.createElement('img');image.src = 'image1.png';image.onload = () => {  kernel(image);    document.getElementsByTagName('body')[0].appendChild(kernel.canvas);};//Multiple Imagesconst kernel = gpu.createKernel(function(image) {    const pixel = image[this.thread.z][this.thread.y][this.thread.x];    this.color(pixel[0], pixel[1], pixel[2], pixel[3]);})  .setGraphical(true)  .setOutput([100, 100]);const image1 = document.createElement('img');image1.src = 'image1.png';image1.onload = onload;....//add another 2 images....const totalImages = 3;let loadedImages = 0;function onload() {  loadedImages++;  if (loadedImages === totalImages) {    kernel([image1, image2, image3]);     document.getElementsByTagName('body')[0].appendChild(kernel.canvas);  }};

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

Первая функция с использованием GPU.js


Скомбинировав всё вышеописанное, я написал небольшое angular-приложение для сравнения производительности вычислений на GPU и CPU на примере перемножения двух массивов из 1000 элементов.

Шаг 1 функция для генерации числовых массивов из 1000 элементов


Я сгенерирую 2D-массив с 1000 чисел для каждого элемента и использую их для вычислений на последующих этапах.

generateMatrices() { this.matrices = [[], []]; for (let y = 0; y < this.matrixSize; y++) {  this.matrices[0].push([])  this.matrices[1].push([])  for (let x = 0; x < this.matrixSize; x++) {   const value1 = parseInt((Math.random() * 10).toString())   const value2 = parseInt((Math.random() * 10).toString())   this.matrices[0][y].push(value1)   this.matrices[1][y].push(value2)  } }}

Шаг 2 -функция ядра


Это самое важное в данном приложении, поскольку все вычисления на GPU происходят внутри неё. Здесь мы видим функцию multiplyMatrix, получающую в качестве входных данных два массива чисел и размер матрицы. Функция перемножит два массива и вернёт общую сумму, а мы будем измерять время при помощи API производительности.

gpuMultiplyMatrix() {  const gpu = new GPU();  const multiplyMatrix = gpu.createKernel(function (a: number[][], b: number[][], matrixSize: number) {   let sum = 0;     for (let i = 0; i < matrixSize; i++) {    sum += a[this.thread.y][i] * b[i][this.thread.x];   }   return sum;  }).setOutput([this.matrixSize, this.matrixSize])  const startTime = performance.now();  const resultMatrix = multiplyMatrix(this.matrices[0],  this.matrices[1], this.matrixSize);    const endTime = performance.now();  this.gpuTime = (endTime - startTime) + " ms";    console.log("GPU TIME : "+ this.gpuTime);  this.gpuProduct = resultMatrix as number[][];}

Шаг 3 функция умножения на CPU


Это традиционная функция TypeScript для измерения времени вычисления для тех же массивов.

cpuMutiplyMatrix() {  const startTime = performance.now();  const a = this.matrices[0];  const b = this.matrices[1];  let productRow = Array.apply(null, new Array(this.matrixSize)).map(Number.prototype.valueOf, 0);  let product = new Array(this.matrixSize);    for (let p = 0; p < this.matrixSize; p++) {    product[p] = productRow.slice();  }    for (let i = 0; i < this.matrixSize; i++) {    for (let j = 0; j < this.matrixSize; j++) {      for (let k = 0; k < this.matrixSize; k++) {        product[i][j] += a[i][k] * b[k][j];      }    }  }  const endTime = performance.now();  this.cpuTime = (endTime  startTime) +  ms;  console.log(CPU TIME : + this.cpuTime);  this.cpuProduct = product;}

Полный демо-проект можно найти в моём аккаунте GitHub.

CPU против GPU сравнение производительности


Настало время проверить, справедлива ли вся эта шумиха вокруг GPU.js и вычислений на GPU. Так как в предыдущем разделе я создал Angular-приложение, я использовал его для измерения производительности.


CPU и GPU время выполнения

Как мы видим, программе на GPU потребовалось для вычислений всего 799 мс, а CPU потребовалось 7511 мс, почти в 10 раз дольше.

Я решил на этом не останавливаться и провёл те же тесты в течение ещё пары циклов, изменив размер массива.


CPU и GPU

Сначала я попробовал использовать массивы меньшего размера, и заметил, что CPU потребовалось меньше времени, чем GPU. Например, когда я снизил размер массива до 10 элементов, CPU потребовалось всего 0,14 мс, а GPU 108 мс.

Но с увеличением размера массивов возникала чёткая разница между временем, требуемым GPU и CPU. Как видно из показанного выше графика, GPU побеждает.

Вывод


Из моего эксперимента по использованию GPU.js можно сделать вывод, что он может значительно повышать производительность JavaScript-приложений.

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



На правах рекламы


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

Подписывайтесь на наш чат в Telegram.

Подробнее..

Видеоконференции как бороться с высокой загрузкой ЦПУ?

31.05.2021 16:13:25 | Автор: admin

Меня зовут Алексей Доильницын, я архитектор в DINS. Наша компания участвует в разработке UCaaS-платформы (Unified Communication as a Service) RingCentral, которой пользуется более 400 тыс. компаний по всему миру.

Я работаю в команде, которая отвечает за разработку сервиса видеоконференций RingCentral Video или RCV. Видеоконференции с большим количеством участников в галерее часто бывают неподъемными для устаревших лэптопов. Мы решили эту проблему с помощью теории систем автоматического управления (САУ).


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

Задача и подход к решению

RingCentral Video выпускает нативного клиента для основных платформ Mac и Windows. Клиент построен на Electron (библиотека для разработки настольных приложений с использованием HTML), что существенно экономит ресурсы разработки, так как по сути позволяет разработать только одно веб-приложение на JavaScript, которое актуально сразу для трех основных платформ веб, Mac и Windows.

По нашему опыту, двухъядерные процессоры Intel старше 5 лет уже зачастую не справляются с типичными корпоративными конференциями с 8-16 участниками.

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

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

Вместо того, чтобы заставлять пользователя выбирать ключевые параметры системы (разрешение и количество видео потоков, битрейт и т.п.), программная система может сама адаптироваться к внешним условиям (загрузка ЦПУ (CPU), пропускная способность сети), автоматически выбирая наиболее оптимальные параметры.

Построение системы управления

Система управления функционирует в JavaScript коде клиента видеоконференции.

Объектом управления в нашем случае являются видеопотоки, рисуемые на экране пользователя. На загрузку ЦПУ в первую очередь влияют количество потоков и разрешение видео (высота х ширина).

9 видеопотоков в разрешении 640x360:

В качестве обратной связи выбираем системную загрузку ЦПУ. Поскольку в браузере нет соответствующего API, измеряем загрузку ЦПУ в нативном коде (в плагине Electron) и периодически шлем событие с текущей загрузкой ЦПУ в JavaScript код.

Выбираем целевой коридор загрузки ЦПУ, например, 40-50%.

В качестве ошибки используем разницу между текущей загрузкой ЦПУ и ближайшей границей коридора. Например, текущая загрузка 80%, значит ошибка 80-50=30 в абсолютных величинах, или по отношению в коридору: 30/50=0.6 (60%).

Основная логика системы управления проста. Система срабатывает на прилетающие информационные события, в которых передается текущая загрузка ЦПУ. События приходят с достаточно большим интервалом в 10 секунд, чтобы учесть инерцию системы на отработку управляющих воздействий.

  • Если загрузка ЦПУ выше целевого коридора, то сначала уменьшаем разрешение потоков, потом начинаем выключать потоки.

  • Если загрузка ЦПУ ниже целевого коридора, то сначала включаем выключенные потоки, потом увеличиваем их разрешение.

  • Если загрузка внутри коридора, то ничего не делаем во избежание колебаний.

При этом количество потоков, на которые будет оказано воздействие, рассчитывается из величины ошибки. Например, клиент отрисовывает 16 видеопотоков в среднем разрешении 640х360. Если загрузка ЦПУ 80% и соответственно ошибка равна 0.6, то за один шаг мы уменьшим разрешение для 16*0.6=10 потоков. Это делается для того, чтобы система быстрее реагировала на большие возмущения. При этом мы учитываем, что отрисовка одного потока занимает от долей до единиц процентов полной загрузки системы.

Проблемы, возникшие в результате эксплуатации

Внутри коридора

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

Решение: все-таки включать видео потоки внутри коридора, но медленно, например, по одному потоку на каждый третий вызов.

Мощный компьютер

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

Решение: измерять, сколько ЦПУ потребляет наш процесс в процентах от общего потребления системы. Если доля нашего процесса менее 50%, то отключать систему управления.

Финальный тест

В финальном тесте на старом лаптопе с процессором i5-3210M (4 cores @ 3 GHz) участвовали 8 участников (ботов) в разрешении 320х180. Стартовая загрузка ЦПУ около 80%.

Через 30 секунд отключается четыре участника, загрузка опускается до 65%.

Ниже опускаться уже некуда, так как минимальное количество участников на экране 4.

В итоге система управления успешно прошла тесты и сдана в промышленную эксплуатацию.

Если у вас появились какие-то вопросы или хотелось бы узнать что-то еще об RCV пишите в комментариях.

Подробнее..

Поддержка процессоров Apple M1 в .NET

21.11.2020 22:12:40 | Автор: admin

17 ноябряAppleофициально представила устройства на базе своего нового ARM-процессораAppleM1. Естественно, это событие не могло быть не замечено со стороны компанииMicrosoft, которая с 2014 года начала активную экспансию .NET на новые платформы. Давайте посмотрим, что нас ждет в связи с этим в ближайшее время.

Начнем пожалуй с инструментов, а затем перейдем к самой платформе .NET, но если вам не терпится узнать, получат ли новые маки поддержку .NET, то вот вам небольшой спойлер:

Spoiler

Да, на новых маках будет .NET

Visual Studio Code

Команда разработчиков Visual Studio Code уже объявила о том, что работает над поддержкой новых процессоров. На странице загрузок Insider Preview для macOS уже появились опция для загрузки экспериментальной сборки с поддержкой ARM. Следить за работой команды можно на официальном аккаунте в GitHub.

Visual Studio for Mac

Если команда VS Code уже подготовила тестовые сборки с поддержкой Apple M1, то их коллеги из команды Visual Studio for Mac оказались не так расторопны:

Впрочем Visual Studio for Mac гораздо более крупный и сложный проект, поэтому портирование его на новый процессор может занять несколько больше времени. Сейчас эта версия IDE может работать при поддержке Rosetta 2.

На данный момент у владельцев новых ноутбуков Apple наблюдаются некоторые проблемы при отладке проектов на Xamarin.Forms для iOS. Соответствующий баг уже заведен в репозитории проекта Xamarin.iOS & Xamarin.Mac.

Rider

В JetBrains уже объявили, что они работают над переносом JetBrains Runtime (и всех продуктов, работающих на JVM, в том числе и Rider) на Apple Silicon. На данный момент IDE от JetBrains работают на чипах Apple Silicon через Rosetta 2. Правда не все функции работают в этом режиме стабильно. Так, например, многие жалуются на то, что отладка в Rider сейчас не работает.

Docker

Docker стал практически must have инструментом для современного разработчика. У Майкрософт есть обширный набор образов для .NET, но к сожалению, воспользоваться вы ими на ноутбуке с новым процессором от Apple пока не сможете.

Будем надеяться, что в ближайшее время поддержка M1 будет реализована в Docker.

.NET

А теперь перейдем к самому главному получит ли новый чип поддержку .NET?

Те, кто подсмотрели спойлер в начале статьи уже знают ответ на этот вопрос. Команда разработки .NET активно работает над поддержкой Apple M1. Для этого даже был создан отдельный проект в трекинге платформы. Стоит отметить тот факт, что текущая версия платформы (а именно, недавно ушедший в релиз .NET 5) будет работать поверх Rosetta. А вот в .NET 6 уже будет нативная поддержка нового чипа. Согласно планам Microsoft, произойдет это не раньше, чем через год:

Из того, что уже выполнено, я бы отдельно отметил такие задачи:

Также запланирована поддержка нового процессора в ASP.NET Core.

Но несмотря на то, что официальной поддержки новых процессоров придется ждать почти год, уже доступна к загрузке альфа-версия .NET 6.0. На момент написания статьи, это версия 6.0.0-alpha.1.0562.6.

Mono

Проект Mono, который обычно был догоняющим (так как команде приходилось реализовывать те возможности, которые уже были в .NET) на этот раз оказался слегка впереди. Пулреквест с поддержка нового процессора сделала сама Apple, которая ранее обещала помощь в поддержке M1 для проектов с открытым исходным кодом.

Проекты, которые вскоре должны получить поддержку Apple M1Проекты, которые вскоре должны получить поддержку Apple M1

Самое большое изменение, которое было сделано для поддержки процессора M1 связанно с тем, как работает JIT, а именно, с изменение состояния потоков. Это было реализовано с помощью новых макросов в mono/mini.h. Они были встроены в систему из соображений производительности.

Rosetta 2

В этой публикации не один раз упоминалась технология Rosetta 2. Для тех, кто не знает, что это, приведем пояснение, которое размещено на странице портала Apple Developer:

Rosetta - это процесс трансляции, который позволяет пользователям запускать приложения, содержащие инструкции x86_64, на микросхеме Apple. Rosetta призвана упростить переход на микросхему Apple, давая разработчикам время на создание универсального двоичного кода приложений. Если исполняемый файл содержит только инструкции Intel, macOS автоматически запускает Rosetta и начинает процесс трансляции. По окончании трансляции система запускает подготовленный исполняемый файл вместо оригинала. Однако процесс перевода требует времени, поэтому транслированные приложения иногда запускаются или работают медленнее.

Итоги

Новый процессор (а соотвественно устройства, которые будут на основаны на нем) без сомнений получит нативную поддержку в .NET, впрочем эта задача не является приоритетной в текущем роадмапе, поэтому ждать ее придется не раньше, чем в релиз уйдет шестая версия платформы. До того момента можно будет работать c .NET, используя возможности Rosetta 2. Что касается инструментария для разработчиков, то я могу предположить, что в ближайшие пол года основные проблемы будут решены (возможно даже с участием Apple) и уже к апрелю можно будет потихоньку присматриваться к компьютерам на базе Apple M1 в качестве рабочего инструмента.

Подробнее..

Процессор, эмулирующий сам себя может быть быстрее самого себя

04.06.2021 04:18:40 | Автор: admin

Современный мир ПО содержит настолько много слоёв, что оптимизации могут быть в самых неожиданных местах. Знакомьтесь - год 2000, проект HP Dynamo. Это эмулятор процессора PA-8000, работающий на этом же процессоре PA-8000, но с технологией JIT. И реальные программы, запускающиеся в эмуляторе - в итоге работают быстрее, чем на голом процессоре.

td;dr - всё сказано в заголовке

Программистам из HP Labs стало интересно, а что будет, если написать оптимизирующий JIT компилятор под ту же платформу, на которой он работает. Работа заняла несколько лет. Под эмулятором можно было запускать немодифицированные родные бинари. И результаты оказались несколько неожиданными.

В эмуляторе они искали "hot paths" и оптимизировали ход исполнения кода. Таким образом уменьшались расходы на джампы, вызов функций, динамических библиотек, оптимизации работы с кешем процессора. Результаты повышения производительности доходили до +22%, в среднем по тестам получалось +9%.

Эта короткая заметка написана, чтобы кто-нибудь мог узнать что-то новое, а в совсем технические детали 20-летней давности смысла лезть нет.

Если кому интересны подробности:

1. http://cseweb.ucsd.edu/classes/sp00/cse231/dynamopldi.pdf
2. https://stackoverflow.com/questions/5641356/why-is-it-that-bytecode-might-run-faster-than-native-code/5641664#5641664
3. https://en.wikipedia.org/wiki/Just-in-time_compilation

Подробнее..

Перевод Показания загруженности процессора в диспетчере задач ни о чем на самом деле не говорят

17.04.2021 22:08:49 | Автор: admin

Когда диспетчер задач сообщает вам, что процессор загружен на все 100 %, вы можете подумать, что система работает изо всех сил и не имеет дополнительных вычислительных мощностей. А когда диспетчер задач сообщает о том, что ЦП загружен на 40 %, вы интуитивно полагаете, что он потребляет 40 % от всей общей доступной мощности. То было достаточно точное толкование как в Windows 7, так и Windows Server 2008 R2. Но с выходом нового дизайна, впервые представленного в Windows 8, вкладки Процессы и Производительность диспетчера задач теперь полагаются на разные метрики и показывают цифры, которые вводят в заблуждение и которые без дополнительного контекста совершенно бессмысленны.

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

(*) В более ранних версиях Windows это были грубые приближения. Точность доступных показателей улучшилась от Windows XP к Vista, а потом и к Win7, как и в соответствующих им серверных версиях ОС.

Чтобы попытаться учесть эти сложности, Windows ввела понятие служебной программы процессора вместе со счетчиками производительности, которые измеряют эту служебную программу. Windows определяет полезность процессора как объем выполненной работы в процентах от объема работы, которую он мог бы выполнить, если бы он постоянно работал на своем номинальном уровне производительности и никогда не включал режим повышенной производительности. Когда процессор включает режим повышенной производительности обычное вообще явление его процент полезности может легко превысить 100 %. Возможная верхняя граница неопределенна и зависит от множества факторов, которые Windows не может измерить напрямую. Вкладки Процессы и Производительность диспетчера задач теперь используют счетчик процент полезности процессора в качестве основы для показания их загруженности, а не счетчик процент загруженности процессора, на который полагался Диспетчер задач, который по-прежнему используется вкладкой Подробности диспетчера задач и Process Explorer, входящий в комплект Sysinternals.

В результате, поскольку динамически настраиваемые процессоры автоматически переходят в расширенный режим под нагрузкой, процент загруженности ЦП диспетчера задач на процесс, который активно выполняет код, обычно будет значительно больше, чем время его процессора. Но поскольку это число находится на шкале, которая ограничена 100 %, диспетчер задач создает впечатление, что процесс занимает больше вычислительных мощностей системы, чем есть на самом деле. Некоторое время сам диспетчер задач сообщал об общей загрузке ЦП более 100 %. Поскольку это противоречит здравому смыслу даже для людей, которые понимают концепцию полезности, диспетчер задач теперь ограничивает сообщаемые значения на отметке в 100 %. Это приводит в дальнейшем еще к большему искажению. Я покажу.

На приведенных ниже скриншотах Process Explorer и вкладка Производительность диспетчера задач подтверждают, что ровно половина из двенадцати потоков полностью загружены, а остальные процессоры почти полностью простаивают. Однако обратите внимание, что Process Explorer сообщает об общем проценте загруженности ЦП чуть более 50, а диспетчер задач сообщает о 83. Возможно, это должно быть 83 % по шкале 166 %. Но что это вообще значит? Процент буквально означает на сотню. Вкладка Производительность диспетчера задач также показывает, что базовая частота процессоров составляет 2,40 ГГц, но во время этого измерения скорость составляет 3,94 ГГц. Получается, что 83 % умножить на 2,40/3,94 это 50,56%, что близко к фактическому использованию. 83 процента в данном случае фактически находятся во временной шкале 164,17 (100 %*3,94/2,40). Это объясняет, как получаются числа, но не делает их интуитивно понятными или значимыми.

Диалоговое окно "Информация о системе" в Process ExplorerДиалоговое окно "Информация о системе" в Process ExplorerВкладка "Производительность" диспетчера задачВкладка "Производительность" диспетчера задач

На вкладке Процессы диспетчера задач указано, что моя тестовая программа потребляет 82,8 %, то есть почти все из 83 % общего использования, о которых она сообщает. В то же время на вкладке Подробности диспетчера задач указано, что моя программа потребляет 50 % ресурсов ЦП. Цифры на вкладке "Подробности", основанные на "проценте загруженности процессора", а не на "процент полезности процессора" и более понятны, чем числа на вкладке "Процессы".

Вкладка "Процессы" диспетчера задачВкладка "Процессы" диспетчера задачИ его вкладка "Подробности"И его вкладка "Подробности"

Давайте возьмем его на ступеньку выше и запустим восемь потоков, привязанных к потокам ЦП, задействуя две трети процессора, оставив остальные простаивать. Вкладка Производительность диспетчера задач сообщает о 100 % загрузке ЦП, подразумевая, что система работает на максимальной мощности, в то время, как и она, и Process Explorer ясно показывают, что четыре из двенадцати процессоров простаивают и готовы к работе. На вкладке Процессы диспетчера задач указано, что тестовая программа использует 100 % ЦП, а на вкладке Подробности указано, что она потребляет только 67 % две трети доступной вычислительной мощности.

Process ExplorerProcess ExplorerВкладка "Производительность" диспетчера задачВкладка "Производительность" диспетчера задачВкладка "Процессы" диспетчера задачВкладка "Процессы" диспетчера задачВкладка "Сведения" диспетчера задачВкладка "Сведения" диспетчера задач

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

Здесь можно взглянуть на точку зрения моего коллеги Джеффа Стоукса по поводу данного вопроса.

Подробнее..

Что нам стоит Resource Governor настроить

04.10.2020 22:08:33 | Автор: admin

Наверное, каждый, кто работает с SQL Server оказывался, или ещё окажется, в такой ситуации: вечер пятницы, ты уже мысленно готов отдыхать и тут начинают прилетать уведомления о высокой нагрузке на CPU твоего SQL Server, телефон начинает звонить и в системе мониторинга ты видишь картинку как на КДПВ.

И, с одной стороны, в этом может не быть особой проблемы - да, серверу тяжело, да, это неприятно, но ведь, господи, ну сформируется ваш отчёт не за 15, а за 45 секунд - делов-то, вы же видите - вас много, а сервер один, нужно просто немножко подождать. Но что, если при всём при этом, есть какие-то бизнес-процессы, которые не могут ждать? Что если при такой нагрузке продажа товара становится настолько медленной, что покупатели отказываются от покупки?

Вот было бы здорово, если бы можно было разделить процессы/пользователей и сказать SQL Server - вот это вот очень важные ребята, их запросы должны выполняться в первую очередь. А вот эти - они, конечно, тоже важные, но они могут подождать подольше. А вот это вот - это вообще запросы от системы мониторинга, которые давно уже надо переписать, и на них вообще можно не обращать внимания, пока мы тут занимаемся важными вещами.

И иногда их и правда можно разделить - с помощью Resource Governor.

Сразу несколько примечаний:

  1. Resource Governor доступен только в Enterprise Edition. Если у вас любая другая редакция (ну ещё Developer, но он же у вас не в проде, да?) - к сожалению, использовать его вы не сможете.

  2. Тут мы не говорим о таких важных вещах, как оптимизация запросов, структур хранения данных, разнесении нагрузки на разные реплики, секционировании, шардировании.

  3. Мы говорим только о том, что такое Resource Governor, как и для чего он может быть полезен, когда бесполезен, чем опасен, как его настроить, что можно мониторить и как его обойти и выключить (если вдруг что).

  4. В один пост я пытаюсь засунуть достаточно много информации и где-то сознательно, а где-то несознательно, будут допущены упрощения.

  5. Сдуру можно сломать всё что угодно, всё что вы делаете, вы делаете на свой страх и риск.

Прежде чем начать разговор о Resource Governor, на всякий случай скажу. что кроме CPU запросы используют диск и оперативную память - SQL Server читает данные с диска и записывает их в buffer pool (но Resource Governor никаким образом не позволяет влиять на buffer pool), откуда их уже "забирает" CPU. Память, кроме того, чтобы использоваться в качестве buffer pool, нужна ещё для сортировок, джойнов и всяких таких вещей (можно немного глянуть тут, где я писал про использование varchar(max)).

И вот, Resource Governor позволяет делать три вещи:

  1. Создавать пулы ресурсов (CPU, RAM, IOPS) - ограничивать ресурсы (или обеспечивать их необходимый минимум), доступные пользовательским сессиям.

  2. Создавать группы рабочей нагрузки (workload group), привязанные к пулам, для более эффективного управления ресурсами внутри пула.

  3. Определять к какой группе (и, соответственно, пулу) будет относиться пользовательская сессия.

Почему рисунок такой отстойный?

потому что умею (да и то не очень) только в paint и немножко в draw.io.

я старалсяя старался

Если вы посмотрите в dmv sys.dm_exec_sessions, в нём есть столбец group_id - это идентификатор группы нагрузки resource governor, именно при установке соединения (точнее, после авторизации) и до конца жизни сессии определяется к какой группе (и, соответственно, пулу) она будет относиться.

По-умолчанию, у нас есть два пула - internal и default и две группы - internal и default (не знаю почему я не дорисовал Internal group). Собственно, по названию, должно быть понятно - internal - это то, что используют процессы самого SQL Server - мы не можем менять ни группу, ни пул - и не надо. default - это то, куда, по-умолчанию, попадают все пользовательские сессии.

Тут есть одна важная вещь, про которую нужно обязательно сказать. В SQL Server есть такая штука как Dedicated Admin Connection (DAC) - крайне, крайне желательно убедиться, что вы можете его использовать, поскольку при подключении через DAC, админская сессия попадает в internal pool. Даже если что-то пошло совсем не так как ожидалось, через DAC можно будет подключиться и что-то поправить. Без DAC, если будут проблемы с подключениями из-за Resource Governor, вероятно, придётся запускать сервер в однопользовательском режиме, за что остальные пользователи, я думаю, спасибо не скажут. После того, как вы включили возможность его использовать не только локально - научитесь его использовать при подключении через SSMS.


Теперь, когда введение можно считать законченным, перейдём непосредственно к Resource Governor.

Чтобы создать пул мы используем команду CREATE RESOURCE POOL (MSDN):

CREATE RESOURCE POOL pool_name  [ WITH      (          [ MIN_CPU_PERCENT = value ]          [ [ , ] MAX_CPU_PERCENT = value ]           [ [ , ] CAP_CPU_PERCENT = value ]           [ [ , ] AFFINITY {SCHEDULER =                    AUTO                 | ( <scheduler_range_spec> )                   | NUMANODE = ( <NUMA_node_range_spec> )                } ]           [ [ , ] MIN_MEMORY_PERCENT = value ]          [ [ , ] MAX_MEMORY_PERCENT = value ]          [ [ , ] MIN_IOPS_PER_VOLUME = value ]          [ [ , ] MAX_IOPS_PER_VOLUME = value ]      )   ]  [;]    <scheduler_range_spec> ::=  { SCHED_ID | SCHED_ID TO SCHED_ID }[,...n]    <NUMA_node_range_spec> ::=  { NUMA_node_ID | NUMA_node_ID TO NUMA_node_ID }[,...n]  

И пройдёмся по параметрам:

  1. MIN_CPU_PERCENT - если процессор загружен на 100%, не меньше этого процента будет использоваться на выполнение запросов тех сессий, которые попали в этот пул. ВАЖНО: если им в этом пуле столько и не надо, "недоиспользованный" CPU, будет доступен другим пулам, если нужен им.

  2. MAX_CPU_PERCENT - если процессор загружен на 100%, запросы сессий из этого пула, суммарно, не будут использовать больше указанного процента. ВАЖНО: Это не жёсткое ограничение, если запросам из пула нужно будет больше, а запросам из других пулов будет достаточно ресурсов, запросы из этого пула БУДУТ использовать больше.

  3. CAP_CPU_PERCENT - а вот это жёсткое ограничение. Запросы сессий из этого пула не смогут использовать больше, чем указано, даже если процессор больше вообще никто не использует.

  4. AFFINITY - позволяет привязать пул ЛИБО к конкретному(-ым) шедулерам (условно, ядрам процессора), ЛИБО к конретной(-ым) NUMA-нодам

  5. MIN/MAX_MEMORY_PERCENT - задают (в процентах, понятно) сколько памяти из всей памяти может быть выделено запросам из пула. Ещё раз обращаю внимание - эта настройка никак не влияет на buffer pool, мы им не управляем. Это про memory grants.

  6. MIN/MAX_IOPS_PER_VOLUME - задаёт минимальное и максимальное КОЛИЧЕСТВО IO операций (без деления на чтение и запись, только общее), доступное запросам из пула.

Отдельно нужно добавить про MIN_CPU_PERCENT - сумма всех MIN_CPU_PERCENT по всем пулам не может превышать 100%. В идеале, я бы и до 100% не стал доводить, оставив хоть что-то internal и default пулам.

Чтобы создать группу, используем команду CREATE WORKLOAD GROUP (MSDN):

CREATE WORKLOAD GROUP group_name[ WITH    ( [ IMPORTANCE = { LOW | MEDIUM | HIGH } ]      [ [ , ] REQUEST_MAX_MEMORY_GRANT_PERCENT = value ]      [ [ , ] REQUEST_MAX_CPU_TIME_SEC = value ]      [ [ , ] REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value ]      [ [ , ] MAX_DOP = value ]      [ [ , ] GROUP_MAX_REQUESTS = value ] ) ][ USING {    [ pool_name | "default" ]    [ [ , ] EXTERNAL external_pool_name | "default" ] ]    } ][ ; ]

Параметры:

  1. IMPORTANCE - задаёт "приоритет" сессии в группе. Разные группы могут относиться к одному пулу, соответственно, мы можем сказать, что сессии вот в этой группе "более важны", чем в другой. Это не значит, что "более важные" сессии будут выполняться, а "менее важные" ждать - просто больше ресурсов из пула будет доступно "более важным" сессиям.

  2. REQUEST_MAX_MEMORY_GRANT_PERCENT - по умолчанию 25%, задаёт какое количество из максимальной памяти пула сессия может получить в своё распоряжение. В общем случае, если ну никак не получается выделить столько памяти - запрос упадёт с ошибкой.

  3. REQUEST_MAX_CPU_TIME_SEC - если запросу потребовалось больше времени, чем тут указано, он не прервётся, но будет сгенерировано событие cpu_threshold_exceeded, которое можно отловить с помощью Extended Events. Начиная с определённого CU для SQL Server 2016/2017, появился trace-флаг, включение которого приведёт к тому, что запрос будет прерван, если CPU time превысит указанное значение.

  4. REQUEST_MEMORY_GRANT_TIMEOUT_SEC - сколько секунд запрос будет ждать выделения памяти, если время прошло, а память так и не появилась - запрос падает с ошибкой.

  5. MAX_DOP - указывает допустимую степень параллелизма. Это значение "важнее", чем указанное в настройках сервера, БД, или в хинте в запросе. Если у вас везде 1, а тут 4 - запросы из этой группы могут выполняться с MAX DOP = 4.

  6. GROUP_MAX_REQUESTS - сколько запросов могут одновременно выполняться. Если хочет выполняться больше, чем указано, придётся подождать. Попробуем ещё с этим поиграться.

Последнее, о чём нужно поговорить, перед тем как уже пощупать руками - это функции классификации. Пулы и группы мы создадим, но как дать понять SQL Server какие сессии к какой группе должны относиться?

Тут, к сожалению, всё не очень просто. Ну, точнее, просто, но не всем подойдёт (привет 1С). Функция классификации - это обычная scalar UDF, созданная в БД master. К ней есть два требования - она должна быть объявлена как SCHEMABINDING и должна возвращать значение типа SYSNAME. Нужно понимать, что выполняется эта функция сразу после логина и выполняется для каждого соединения, соответственно, она должна выполняться очень-очень-ОЧЕНЬ быстро, иначе станет очень узким местом и вам придётся использовать DAC, чтобы её заменить.

Ещё немного про функцию классификации

В MSDN использован пример с lookup-таблицей и сразу дана куча оговорок, что нужно выполнять к ней обращения с NOLOCK или под SNAPSHOT IL, но вообще, вроде как, lookup-таблицы в функции классификации - это далеко не best practice и потенциально достаточно опасное мероприятие.

Нужно добавить, что нельзя изменять (ALTER) функцию, которая указана в качестве функции классификации, и нельзя менять привязку групп к пулам, если в них есть пользователи. НО! На лету можно: добавлять новые пулы и группы, и можно заменить одну функцию классификации на другую.

Для отключения Resource Governor необходимо выполнить команду:

ALTER RESOURCE GOVERNOR DISABLE;

Вот теперь введение точно можно считать законченным и можно создавать пулы/группы/функцию и проверять/мониторить это всё.

Начнём с CPU и создадим пулы:

CREATE RESOURCE POOL [pool1]WITH (    MIN_CPU_PERCENT = 15,    MAX_CPU_PERCENT = 15,    CAP_CPU_PERCENT = 20);CREATE RESOURCE POOL [pool2]WITH (    MIN_CPU_PERCENT = 50,    MAX_CPU_PERCENT = 90);

Первый пул, в случае "борьбы" за процессор сможет забирать не менее и не более 15 процентов, но из-за CAP_CPU_PERCENT не сможет использовать больше 20 процентов CPU, даже если никакой "борьбы" нет. Второй пул, в случае "борьбы" сможет взять не менее 50 и не более 90 процентов, при этом, если никому больше процессор не нужен будет - сможет взять все 100.

Создаю группы нагрузки:

CREATE WORKLOAD GROUP [pool1_group1]WITH (    IMPORTANCE = HIGH,    REQUEST_MAX_CPU_TIME_SEC = 5,    MAX_DOP = 2)USING [pool1];CREATE WORKLOAD GROUP [pool2_group1]WITH (    IMPORTANCE = HIGH)USING [pool2];CREATE WORKLOAD GROUP [pool2_group2]WITH (    IMPORTANCE = MEDIUM)USING [pool2];CREATE WORKLOAD GROUP [pool2_group3]WITH (    IMPORTANCE = LOW,    GROUP_MAX_REQUESTS = 1 )USING [pool2];

В первом пуле я создаю всего одну группу нагрузки, указываю, что сессии из этой группы смогут рассчитывать только на 2 ядра (на уровне сервера стоит MAXDOP = 4), и что максимальная длительность запроса составляет 5 секунд. Важность запросов из группы я объявляю как высокую, но, поскольку группа в пуле одна, эта важность не повлияет ни на что.

Во втором пуле создано три группы с разной важностью и в группе с самым низким приоритетом указываю, что только один запрос из группы может выполняться.

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

USE [StackOverflow2013]GOCREATE LOGIN p1g1 WITH PASSWORD = N'1', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF;CREATE LOGIN p2g1 WITH PASSWORD = N'1', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF;CREATE LOGIN p2g2 WITH PASSWORD = N'1', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF;CREATE LOGIN p2g3 WITH PASSWORD = N'1', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF;CREATE USER p1g1 FOR LOGIN p1g1;CREATE USER p2g1 FOR LOGIN p2g1;CREATE USER p2g2 FOR LOGIN p2g2;CREATE USER p2g3 FOR LOGIN p2g3; EXEC sp_addrolemember N'db_owner', N'p1g1';EXEC sp_addrolemember N'db_owner', N'p2g1';EXEC sp_addrolemember N'db_owner', N'p2g2';EXEC sp_addrolemember N'db_owner', N'p2g3';

А вот и функция классификации:

USE [master]GOCREATE FUNCTION fnClassify()RETURNS SYSNAME WITH SCHEMABINDINGASBEGIN    RETURN         CASE ORIGINAL_LOGIN()             WHEN 'p1g1' THEN 'pool1_group1'            WHEN 'p2g1' THEN 'pool2_group1'            WHEN 'p2g2' THEN 'pool2_group2'            WHEN 'p2g3' THEN 'pool2_group3'        ELSE 'default' END;END;

И сразу проверим, куда эта функция отнесёт нас:

SELECT master.dbo.fnClassify();
В моём случае - default, но

если функция вернёт неверное имя группы или NULL - это достаточно безопасно - в случае любых сомнений у Resource Governor куда отнести сессию, сессия будет отнесена в группу default.

Последнее, что нужно сделать - указать Resource Governor созданную функцию классификации и применить изменения:

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.fnClassify);  ALTER RESOURCE GOVERNOR RECONFIGURE;  

Теперь можно логиниться с созданными учётными данными и посмотреть, что из этого вышло.

SELECT     s.session_id,     s.login_name,     wg.group_id,    wg.name AS workload_group_name,    wg.pool_id,    rp.name AS pool_nameFROM sys.dm_exec_sessions sJOIN sys.dm_resource_governor_workload_groups wg ON s.group_id = wg.group_idJOIN sys.dm_resource_governor_resource_pools rp ON wg.pool_id = rp.pool_idWHERE s.session_id >= 50
в dmv resource governor есть ещё много интересной информациив dmv resource governor есть ещё много интересной информации

Мы видим, что все новые пользователи благополучно "расползлись" по назначенным группам. Object Explorer и моё основное соединение остались в группе и пуле default.

Теперь попробуем нагрузить процессор и помониторить - работают ли указанные при настройке ограничения. В perfmon есть две группы счётчиков: SQLServer: Workload Group Stats и SQL Server: Resource Pool Stats. Обратите внимание, что доступные счётчики зависят от версии вашего SQL Server.

В сессии p1g1 запускаю запрос, который не делает ничего полезного, только грузит процессор, причём хинтом указываю, что он может использовать все 8 ядер моего лютого i5-8250u, если ему это нужно

USE StackOverflow2013;GOSELECT SUM (CAST (VoteTypeId AS decimal(12,2))) / AVG (CAST (VoteTypeId AS decimal(14,4)))FROM dbo.VotesOPTION (MAXDOP 8);GO

В то же время, в perfmon смотрим на показания SQLServer: Workload Group Stats: CPU Usage% и CPU Delayed % по группе pool1_group1:

CPU Usage% упёрся в CAP_CPU_PERCENT = 20, Resource Governor не даёт использовать больше CPU моему запросу, а сам запрос может использовать только 2 ядра, вместо положенных 8, из-за того, что при создании группы нагрузки, я ограничил запросы из группы именно этим значением. CPU Delayed %, в свою очередь показывает, что пул хотел бы получить в своё распоряжение ещё около 5% процессорного времени, но Resource Governor строго его ограничил.

Посмотрим тот же запрос и те же счётчики, но выполненный от имени p2g3, пользователя, который входит в группу с наименьшим приоритетом (IMPORTANCE = LOW) во втором пуле.

Поскольку это был единственный запрос, который выполнялся в этот момент, запросу ничего не мешало использовать все ядра и все 100% CPU. Правда CPU Delayed там где-то подпрыгивал аж до 0,483%, но это связано с какими-то внутренними процессами из Internal pool, которым тоже нужен был CPU. А что будет, если запустить, параллельно ещё что-нибудь тяжелое в том же пуле (pool2), но из другой группы нагрузки, с более высоким приоритетом?

Добавляю в запрос ещё немного вычислений и запускаю от имени p2g1 (IMPORTANCE = HIGH) и через пару секунд тот же самый запрос от имени p2g3 (IMPORTANCE = LOW):

USE StackOverflow2013;GOSELECT SUM (CAST (VoteTypeId AS decimal(12,2))) / AVG (CAST (VoteTypeId AS decimal(14,4))) * AVG (CAST (PostId AS decimal(19,4)))FROM dbo.VotesOPTION (MAXDOP 8);GO

Тут картинка становится интереснее. Пока запрос был один, запрос из группы с высоким приоритетом забирал весь доступный CPU, но как только появился запрос из группы с низким приоритетом - пришлось делиться. От щедрот, как видно на графике, было выдано 10% CPU, соответственно, пока запросы выполнялись параллельно, запрос из группы с низким приоритетом мог использовать только 10% CPU, и только когда первый запрос завершился, он смог использовать все 100%.

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

Сначала запрос был запущен от имени пользователя с низким приоритетом, потом со средним и в конце - с высоким:

Видно, что сначала группе с низким приоритетом было доступно 100%. Как только подключился запрос из группы со средним приоритетом - он забрал себе 70-75%, а низкому приоритету осталось 25-30%. Когда пришёл босс, он забрал себе около 65-70% процессорного времени, средний оставил себе ещё 22,5-25%, а низкому приоритету осталось всего 7.5-10% процессорного времени.

Как вы видите, сначала завершился процесс с высоким приоритетом, затем со средним и после них - с высоким. И это не смотря на то, что выполнять запросы они начинали в обратном порядке!

Теперь, когда мы увидели как взаимодействуют процессы из разных групп внутри одного пула, давайте посмотрим как будут взаимодействовать процессы из разных пулов. Тот же самый запрос я запущу в трёх сессиях: от имени пользователя p1g1 из пула 1 и от имени пользователей p2g1 и p2g3 из пула 2, с высоким и низким приоритетом. Во-первых, я хочу посмотреть как будет делиться CPU между пулами, а во вторых - как будет делиться CPU между группами с разными приоритетами, когда им, параллельно, приходится делить CPU с другим пулом. Ещё раз обращаю внимание, что "приоритеты" (IMPORTANCE) - не влияют на приоритет пула, они влияют на "важность" запросов только внутри того пула, к которому привязана группа.

сверху - использование CPU разными пулами; снизу - использование CPU внутри второго пуласверху - использование CPU разными пулами; снизу - использование CPU внутри второго пула

Верхний график - это использование CPU разными пулами (SQL Server: Resource Pool Stats: CPU Usage %). Сначала я запустил запрос от имени пользователя p1g1, привязанного к пулу с жёстко ограниченным CPU. Он сразу забрал свои максимально-максимально допустимые 20%, но как только подоспели запросы из второго пула, пришлось часть ресурсов отдать.

Напоминаю, что в первом пуле у нас стоит MAX_CPU_PERCENT = 15, а во втором пуле MAX_CPU_PERCENT = 90. Суммарно, получается, больше 100%, соответственно в дело вступают минимальные проценты. У первого пула минимум = 15%, у второго - 50%. Поэтому первый пул может рассчитывать на все свои 15%, а второй получает оставшиеся 85%.

Нижний график - это делёж процессора разными группами второго пула. Сначала был запущен запрос из группы с низким приоритетом и забрал все максимально доступные пулу 85%, но потом пришёл процесс с высоким приоритетом и забрал, примерно, 75% из них. Когда запрос с максимальным приоритетом завершился, запрос с минимальным приоритетом получил весь доступный пулу CPU обратно и тоже быстро завершился, после чего первый пул получил свои дополнительные 5% и дожал выполнение.

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

SELECT     s.session_id,    s.status,    r.task_address,    r.scheduler_idFROM sys.dm_exec_sessions s LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_idWHERE s.login_name = N'p2g3';

Обе сессии в состоянии running, но запрос (request) и соответствующий таск был создан только для одной и только ей доступен шедулер (сверху). Только после того, как запрос от первой сессии выполнился, начал выполняться второй (снизу).


Теперь попробуем поиграться с IO. Для начала отключим Resource Governor, удалим пулы и группы:

USE [master];GOALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);  ALTER RESOURCE GOVERNOR DISABLE; DROP WORKLOAD GROUP [pool1_group1];DROP WORKLOAD GROUP [pool2_group1];DROP WORKLOAD GROUP [pool2_group2];DROP WORKLOAD GROUP [pool2_group3];DROP RESOURCE POOL [pool1];DROP RESOURCE POOL [pool2];

Для начала нужно прикинуть сколько IO вообще способен выдать мой жёсткий диск. Хочу отметить, что оценка пропускной способности дисковой подсистемы - это достаточно нетривиальная задача, которую я тут решать не собираюсь. Мне нужно знать только сколько IOPS на чтение сможет выдать мой диск, если я его слегка подгружу на чтение, чтобы показать как работает Resource Governor и не более.

Используем для этого старый-добрый счётчик Физический диск: Обращений к диску/с, параллельно запустив что-то, что будет его активно читать, например вот так (не делайте этого на проде):

USE [StackOverflow2013]GODBCC DROPCLEANBUFFERS;GOSELECT *FROM dbo.Posts;    --сессия 1SELECT *FROM dbo.Comments; --сессия 2SELECT *FROM dbo.Votes;    --сессия 3

В разных сессиях я читаю разные таблицы, поскольку Enterprise (и, скорее всего, Developer) Edition умеет делать "shared scan" и результат может быть несколько некорректным. На графике ниже можно оценить с какой любовью и заботой подбирал жёсткий диск производитель моего ноута.

Итак, в среднем SQL Server может рассчитывать на 75 IOPS (на самом деле побольше, потому что запросы я начал выполнять через несколько секунд, после начала измерений). Окей, создаю пулы, группу, функцию классификации и запускаю Resource Governor.

USE [master];GOCREATE RESOURCE POOL [pool1]WITH (    MIN_IOPS_PER_VOLUME = 50);CREATE RESOURCE POOL [pool2]WITH (    MIN_IOPS_PER_VOLUME = 30,    MAX_IOPS_PER_VOLUME = 50);GOCREATE WORKLOAD GROUP [pool1_group1]USING [pool1];CREATE WORKLOAD GROUP [pool2_group1]USING [pool2];ALTER FUNCTION fnClassify()RETURNS SYSNAME WITH SCHEMABINDINGASBEGIN    RETURN         CASE ORIGINAL_LOGIN()             WHEN 'p1g1' THEN 'pool1_group1'            WHEN 'p2g1' THEN 'pool2_group1'        ELSE 'default' END;END;GOALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.fnClassify);  ALTER RESOURCE GOVERNOR RECONFIGURE;  

Итак, посмотрим, как же разделится IO, если я запущу из разных сессий, относящихся к разным группам нагрузки, те же самые бессмысленные сканирования - для этого используем счётчики Disk Read IO/sec и Disk Read IO Throttled/sec из SQL Server: Resource Pool Stats. Сразу обращу ваше внимание, что в группе SQL Server: Workload Group Stats нет счётчиков, относящихся к IO, поэтому, вероятнее всего, "важность" группы никак не влияет на IO.

видит Бог, я пытался получить ровный график хоть где-товидит Бог, я пытался получить ровный график хоть где-то

К сожалению, с моим HDD, тяжеловато получить красивые графики нагрузки на диски (и это я ещё не показываю Latency), но хоть кусочек в начале, да получился.

На верхнем графике, где показаны Read IOPS, видно, что сначала выполнялись запросы сессий только из пула 2 и Resource Governor "резал" их до 50, что указано в качестве максимального количества IOPS. После того, как добавился запрос из сессии, относящейся к первому пулу, основной его задачей было постараться сделать так, чтобы у всех выполнились минимальные ограничения - 50 в первом пуле и 30 во втором. Причём, скорее всего, из-за того, что во втором пуле IO были ограничены "сверху", и Resource Governor и так приходилось резать ему пропускную способность, "тормозить" IO первого пула ему приходилось только тогда, когда жёсткий диск уже не мог обеспечить минимум для второго пула.


В заключение, добавлю, что Resource Governor появился с SQL Server 2008 и с тех пор неплохо так обновился. Всё, что написано выше, в принципе, уже должно работать в SQL Server 2014, но на всякий случай - проверьте документацию по своей версии.

Последнее, что нужно рассказать - это когда Resource Governor может помочь. Наверное, можно было с этого начать, но мне кажется, что после демонстрации проще понять о чём речь.

В случае нагрузки на CPU, Resource Governor имеет шансы помочь только в том случае, если CPU - это реально узкое место. Если процессор сервера не загружен на 100% - маловероятно, что от Governor'а будет толк. Да, вы можете использовать CAP_PERCENT, но это значит, что в моменты, когда особой нагрузки нет, он будет только вредить.

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

В случае с IO он, наверное, может помочь, но нужно всё очень тщательно просчитать, поскольку мы оперируем не процентами, а непосредственно количеством операций, да ещё и без деления на чтение и запись. К тому же, мы указываем одно и то же количество операций, которое применяется сразу ко всем томам, а в случае, если подключены массивы/диски с разной "пропускной способностью", польза такого ограничения IO резко снижается.

Будьте осторожны и не забывайте про DAC.

Дополнительное чтиво:

  1. MSDN про Resource Governor

  2. Roy Ernest: Resoruce Governor

  3. MSDN про функции классификации

Подробнее..

Перевод Бешеный рендер в 64 ядра AMD Threadripper Pro 3995WX

08.03.2021 18:14:03 | Автор: admin

Когда AMD начала предлагать процессоры Threadripper с большим количеством ядер, единственным рынком, который потреблял столько, сколько производила AMD, был рынок графического дизайна компании, которые занимались визуальными эффектами и рендерингом; им понравились количество ядер, поддержка памяти, полосы PCIe и цена. Но если есть что-то ещё, повышающее производительность, то это само стремление к производительности Threadripper Pro.


Брррр вот во что превращается вычислительная графика

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

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

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

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

Если вычислительная часть программного обеспечения не подвержена такой нагрузке, например, эта часть структурно более линейна, то потратить полгода на его переработку для GPU это напрасная трата сил. Или даже если математика лучше работает на GPU, попытки перестроить 20-летнюю (или ещё более старую) кодовую базу для GPU всё равно требуют значительных усилий со стороны группы экспертов.

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

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

Некоторые плагины имеют ускорение GPU, например Blender Cycles, и переход на ещё более ускоренную GPU рабочую нагрузку занимает некоторое время например. область, привлекающая большое внимание GPU, дизайн с ускоренной трассировкой лучей.

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

Скорее всего, киностудия предпочтёт медленный рендеринг более высокого качества на CPU, чем быстрый и шумный на GPU, или же, наоборот, рендеринг изображения в более низком разрешении, а затем и рендеринг более высокого класса с искусственным интеллектом.

Поставляющие продукцию для отрасли OEM-производители сообщили нам, что ряд студий прямо скажут: рендеринг их рабочего процесса на CPU единственный способ рендеринга. Другой аспект память: соответствующий задаче CPU может иметь от 256 ГБ до 4 ТБ DRAM, тогда как лучшие GPU имеют пропускную способность в 80 ГБ (и это очень дорогие графические процессоры).

Вот о чём я говорю: VFX-студии до сих пор предпочитают вычисления на CPU, и, чем таких вычислений больше, тем лучше. Когда компания AMD выпустила новые процессоры на базе Zen, в частности 32- и 64-ядерные модели, их сразу же резервировали как потенциальную замену Xeon, с которыми работали студии VFX.

В компонентах AMD внимание уделяется вычислениям FP ключевому элементу в дизайне VFX. С двумя ядрами на сокет в сочетании с большим количеством кеша на одно ядро, процессор AMD был лучшим в деле. Это означает, что, хотя первые многоядерные вычислительные компоненты обладали неоднородной архитектурой памяти, это не было большой проблемой, как в случае с некоторыми другими вычислительными процессами.

Ряд компаний VFX, насколько мы понимаем, сосредоточились на платформе AMD Threadripper поверх соответствующего EPYC. Когда оба компонента впервые появились на рынке, VFX-студиям было очень легко инвестировать в рабочие станции, построенные на базе Threadripper, тогда как EPYC больше предназначался для серверной стойки.

Посмотрим на Threadripper 3000 и EPYC 7002: есть 64 ядра, 64 полосы PCIe 4.0 и большой выбор. студии VFX тогда всё ещё предпочитали Threadripper в основном из-за того, что эти процессоры предлагали лучшую мощность в 280 Вт в чём-то, что могло бы легко прийти от системных интеграторов, таких как Armari. Эти интеграторы специализируются на high-desk и high-compute, они также запрашивали у AMD большего.

Сегодня компания AMD развернула платформу Threadripper Pro, удовлетворяющую некоторым из требований выше. Тогда как VFX всегда ориентирован на вычисления в ядре, TR Pro предоставляет удвоенную полосу PCIe, удвоенную пропускную способность памяти, поддержку до 2 ТБ памяти, а также поддержку от администратора-профессионала.

Линии PCIe могут быть расширены до локального хранилища (которое всегда важно в VFX), а также больших RAM-дисков; поддержка администратора через DASH помогает поддерживать управление системами компании. AMD Memory Guard также входит в линейку Pro, которая создана, чтобы обеспечивать полное шифрование памяти.

Помимо работы с VFX компания AMD мировой лидер в области вычислений с помощью TR Pro в проектировании продуктов с помощью Creo, 3D-визуализации через KeyShot, в области проектирования архитектурных моделей с помощью ПО Autodesk Revit, а также в областях Data Science, таких как анализ массивов данных о нефти и газе, где наборы данных возрастают до сотен гигабайт и требуют существенной вычислительной поддержки.

Threadripper Pro против Workstation EPYC (WEPYC)

Глядя на преимущества, которые дают эти новые процессоры, становится ясно, что они скорее компоненты EPYC в стиле рабочей станции, чем "усовершенствованные" драйверы Threadripper. Вот объясняющая таблица:

Чтобы получить (начиная с EPYC) эти новые компоненты, всё, что AMD нужно было сделать, это поднять TDP до 280 Вт и урезать поддержку DRAM. Если начинать с базового Threadripper, есть 34 существенных изменения. Так почему же название по-прежнему Threadripper Pro, а не Workstation EPYC?

Чтобы ответить на этот вопрос, снова вернёмся в студии VFX. Когда они уже купились на брендинг и образ мысли Threadripper, сохранить название компонентов Threadripper значит, помочь сгладить переход. Как было сказано, они предпочитают Threadripper, а не EPYC (из того, что сказали нам), и поэтому сохранение названия означает, что не нужно никого переучивать.

Кроме того, линия процессора EPYC несколько изломана: есть стандартные версии, высокопроизводительные модели H, высокочастотные модели F и серия заказных конструкций под B, V, другие серии для конкретных клиентов. Сохраняя название Threadripper Pro, AMD сохраняет всё под одним началом.

Предложения Threadripper Pro: от 12 до 64 ядер

В середине прошлого года AMD анонсировала эти процессоры, а также Lenovo Thinkstation P620 как платформу их запуска. По моему опыту, линейка Thinkstation очень хорошо спроектирована, и сегодня мы тестируем наш 3995WX в P620.

TR Pro анонсировали вместе с Lenovo, и мы не были уверены, что Threadripper станет доступен какому-то другому OEM-производителю. Мы спросили об этом самих OEM-производителей в том же году, ещё до того, как узнали, существует ли TR Pro на самом деле; они заявили, что AMD даже не отметил платформу в своём плане развития, о котором мы тогда рассказывали.

С тех пор мы узнали, что у Lenovo был эксклюзивный срок в полгода; информацию предоставили другим производителям (ASUS, GIGABYTE, Supermicro) только после того, как было объявлено об этом.

В связи с этим AMD объявила, что Threadripper Pro выходит на рынок розничной торговли как для других OEM-производителей, которые будут проектировать системы, так и для конечных пользователей, которые будут собирать свои системы.

Несмотря на использование того же сокета LGA4094, что и у другие процессоров Threadripper и EPYC, TR Pro заблокируют на материнских платах WRX80. На данный момент нам известно о трёх моделях, например Supermicro и GIGABYTE, и об ASUS Pro WS WRX80E-SAGE SE Wi-Fi, которая у нас была, однако мы не смогли её протестировать.

Из четырёх перечисленных выше процессоров три лучших идут в продажу. Стоит отметить, что только 64-ядерный процессор поставляется с 256 МБ кеша L3, тогда как 32-ядерный поставляется с 128 МБ L3.

AMD придерживается такой архитектуры, что в этих чиплетах (chiplet) используется только абсолютно необходимое количество наборов микросхем, кеш L3 на одно ядро, а также 8 ядер на набор микросхем (в линейке продуктов EPYC дело обстоит немного иначе). Четвёртый процессор, 12-ядерный, по-видимому, является специфическим процессором, он создан только для OEM-производителей готовых систем.

Threadripper Pro против всех

Эти предложения Threadripper Pro созданы конкурировать с двумя сегментами рынка: во-первых, с самой AMD, демонстрирующий высокую производительность всем пользователям профессиональных систем высокого класса, построенных на аппаратном обеспечении первого поколения Zen.

Второе предложение нацелено на пользователей рабочих станций Intel с односокетным Xeon W (который имеет 28 ядер) либо на пользователей двухсокетной системы Xeon, которая дороже или которая потребляет намного больше энергии просто потому, что она двухсокетная, но при этом архитектура памяти системы неоднородная.

У нас есть почти все системы (нет 7702P, но есть 7742), и на самом деле это единственные процессоры, которые следует учитывать, если 3995WX в вашем случае один из вариантов:

Intel достигает максимума на 28 ядрах, и обойти его невозможно. Технически у Intel есть линейка процессоров AP до 56 ядер, однако это для специализированных систем, а для тестирования нам не отправили ни одного процессора этой линейки. Кроме того, это $ 20 000+ на один процессор, а также два процессора в одной системе, которые прикрепили болтами в одной упаковке.

Лучшее оборудование AMD это Threadripper, лучший доступный процессор EPYC версий 2P. Самым лучшим здесь был бы 7702P, вариант с одним сокетом и по гораздо более конкурентоспособной цене, однако у нас для целей тестирования его нет; вместо него у нас есть AMD EPYC 7742 версия с двумя сокетами, но с несколько большей производительностью.

Мы должны поблагодарить следующие компании за то, что они любезно предоставили оборудование для наших многочисленных испытательных стендов. Кое-какого железа на этом стенде нет, но оно используется в других тестах.

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

Мы также сравниваем гораздо больше показателей, чем показано в типовом обзоре, все показатели вы можете увидеть в нашей базе данных эталонов. Мы называем эту базу Bench, также в верхней части [в оригинальном обзоре на английском языке] есть ссылка на случай, если база понадобится вам. чтобы сравнить какие-то процессоры позже.

Узнайте подробности, как получить Level Up по навыкам и зарплате или востребованную профессию с нуля, пройдя онлайн-курсы SkillFactory со скидкой 40% и промокодомHABR, который даст еще +10% скидки на обучение.

Другие профессии и курсы
Подробнее..

Полку ARM прибыло представлен первый 64-битный процессор ARM Cortex-R82

06.09.2020 20:21:10 | Автор: admin

ARM-процессоры занимают новые для себя ниши. Это уже давно не только маломощные чипы с минимальным энергопотреблением. Недавно анонсировано третье поколение ARM-процессоров Thunder-X, о чем мы уже рассказывали. Теперь представлен процессор, который превосходит все предыдущие решения в серии R.

Он предназначен для работы в real-time системах, которые должны быть крайне надежными. Т.е. речь идет про оборудование, которое эксплуатируется в экстремальных условиях. Это промышленность, медицина, службы спасения и т.п.



Для того, чтобы процессор мог выполнять все требуемые операции, его архитектуру несколько модернизировали и обновили. Так, Cortex-R характеризуется улучшенной аппаратной обработкой прерыванией, включая детерминированную. Были усовершенствованы аппаратные инструкции деления, защита памяти (MPU), коррекция ошибок на всех уровнях (включая как системные шины, так и кеш L1). Есть и еще одна особенность мгновенное горячее резервирование на тот случай, если выходит из строя одно из ядер.


Чип будет работать в системах с оптимизированным ПО, которое экономно использует аппаратные ресурсы. Это не пользовательские приложения. Поэтому разработчики сделали представителей серии R производительными, но без рекордных показателей, как у серии А. Напомним, что чипы серии А используются как в смартфонах, так и в серверах.

Новые процессоры ARM серии R планируется использовать, в частности, в compute-on-storage drives. Это умные накопители, которые способны выполнять сложные задачи в автономном режиме, не нагружая ими хост-системы. Соответственно, производительность хост-систем при выполнении тех же задач будет выше.

Разработчики утверждают: серия Cortex-R может брать на себя такие задачи, как транскодирование видео на лету, ускорение работы с базами данных или анализ информации в режиме реального времени. R82, по мнению разработчиков, в два раза превосходит R8 по производительности. В типовых же нагрузках при работе с нейросетями новые процессоры превосходят коллег в 14 раз.


Благодаря MMU процессор имеет возможность работать с виртуальной памятью без ограничения физическим объемом DRAM. Кроме того, R82 опционально поддерживает и выполнение специфических SIMD-инструкций (ARM NEON), обеспечивая параллелизм на уровне данных.

Новыми процессорами уже заинтересовались производители умных накопителей, включая NGD.

Подробнее..

Перевод ARMv9 в чем преимущество?

06.04.2021 18:11:06 | Автор: admin

Что такое масштабируемые векторные расширения (Scalable Vector Extension)? Что они значат для индустрии и пользователей?

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

Мы находимся на пороге серьезных изменений в индустрии, которых не происходило уже несколько десятилетий. x86 доминирует в компьютерной индустрии уже продолжительное время, но активное развитие ARM, вероятно, станет серьезной проблемой для x86.

В этом году ARM выпустила архитектуру следующего поколения, которая задаст курс отрасли на следующее десятилетие, ARMv9. Это важное событие, которое заслуживает пристального внимания.

Есть много вещей, о которых стоит поговорить, но наиболее важной темой является стандартизация того, что мы называем масштабируемым векторным расширением (Scalable Vector Extension 2, SVE2). Вы наверняка слышали про наборы инструкций SIMD (Single Instruction Multiple Data, одиночный поток инструкций, множественный поток данных), такие как MMX, SSE, AVX, AVX-512 от Intel или Neon от ARM. Однако вы можете не знать, для чего они нужны. Я постараюсь объяснить, что отличает SVE/SVE2 от более старых наборов инструкций SIMD.

Знали ли вы, что Fujitsu сыграла важную роль во всем этом? Мы наблюдаем своего рода возвращение к супервычислениям старой школы, которые встречались в суперкомпьютерах Cray-1 несколько десятилетий назад. Фактически компания Cray не умерла и сейчас занимается созданием суперкомпьютеров на базе ARM: LRZ to Deploy HPEs Cray CS500 System with Arm Fujitsu A64FX Processors.

Суперкомпьютер Cray-1, 1976 год. Высота примерно 1.8м, диаметр 2.1м.

ARMv9 это процессор, который я могу купить в магазине?


Это не то же самое, когда Intel или AMD выпускают новый микропроцессор, который вы можете купить и установить в ПК для повышения производительности. ARMv9 не имеет физического воплощения. Это новая микропроцессорная архитектура, которая обратно совместима с предыдущими поколениями ARM, такими как ARMv8.

Позвольте мне объяснить, как это работает. Множество компаний по всему миру, таких как Qualcomm, Apple, Fujitsu Ampere Computing, Amazon, проектируют собственные микропроцессоры. Это многоступенчатый процесс. Например, ни Apple, ни AMD не производят собственные чипы. Вместо этого они разрабатывают дизайн микросхемы, а затем отправляют его на заводы, например, Global Foundries или TSMC. Там дизайн травят на кремниевых пластинах, которые затем разрезают на отдельные микрочипы и упаковывают.

Компания ARM Ltd. не похожа на Qualcomm или Ampere Computing. Они не производят готовые чертежи, которые можно передавать на завод. Вместо этого они продают чертежи интеллектуальных блоков. Компании вроде Apple могут купить эти блоки и объединить их в итоговый чертеж, который отправится на фабрики.

Система-на-Кристалле ARM Neoverse N1, произведенная TSMC
Но это все очень вариативно. Например, у вас есть чертежи реальных микропроцессорных ядер, таких как Neoverse N1. Другая компания может купить этот дизайн, открыть в инструментах для проектирования, скопировать четыре ядра, нарисовать несколько линий соединения, добавить кэш-памяти, и вот у них получился новый микропроцессор. В реальной жизни этот процесс, конечно, сложнее, но основную мысль, думаю, вы поняли.

ARMv9, как и предыдущий ARMv8, не законченный чертеж, который регламентирует соединение транзисторов. Это то, как вы размещаете транзисторы для достижения высокопроизводительной архитектуры. Мы называем это микроархитектурой.


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

ARMv9 это архитектура центрального процессора, что-то более абстрактное. Это похоже на соглашение между аппаратным и программным обеспечением. Архитектура обозначает, какие регистры должны быть на микропроцессоре и сколько бит они должны содержать, какие инструкции необходимо поддерживать и куда записывать результат после выполнения инструкции.

Пример инструкций для загрузки чисел из памяти по адресам 14 и 23 в регистры x1 и x2 соответственно, сложения содержимого регистров и записи результата в x3.

load x1, 14       ; x1  memory[14]load x2, 24       ; x2  memory[24]add  x3, x1, x2   ; x3  x1 + x2

Чтобы узнать больше, читайте: How Does a Modern Microprocessor Work?

Архитектура процессора важна для разработчиков инструментов. Программное обеспечение, такое как компиляторы и линковщики, работает с заданной архитектурой. Это значит, что выпуск ARMv9 равнозначен выпуску нового стандарта для разработчиков программного и аппаратного обеспечения. Пока Apple, Ampere и Qualcomm производят оборудование, которое понимает инструкции, указанные в спецификации ARMv9, программное обеспечение, производящее код для этой спецификации, будет работать.

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

Что нового в ARMv9?


Чтобы показать, насколько большой вклад производит выпуск новой архитектуры, мы вспомним про ARMv8. ARMv8 была выпущена восемь лет назад и стала первой 64-битной архитектурой компании ARM Ltd. Микропроцессоры на базе ARMv7 были 32-битными. Это означало, что регистры внутри ЦП могли работать только с числами, которые содержали не более 32 двоичных цифр.

Появление ARMv8 было важным событием для Apple, так как это позволило им неожиданно рано для индустрии перейти на 64-битную архитектуру. Это дало iPhone и iPad фору. Несомненно, Apple хотела заниматься высокопроизводительными архитектурами как можно быстрее, поэтому они стремились создать процессоры ARM для настольных компьютеров.

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

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

Я не рассказал, что такого особенного в векторах и что это такое. Они имеют большое значение для науки. Старые суперкомпьютеры, такие как Cray-1, были созданы для векторной обработки, то есть для обработки огромного количества векторов.

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

Именно это приходит в ARMv9 благодаря добавлению целого ряда новых инструкций, которые называются SVE2, или Scalable Vector Extension 2. Другими словами, процессоры ARM становятся все более похожими на старые суперкомпьютеры.

Для дополнительного чтения: ARM, x86 and RISC-V Microprocessors Compared.

Суперкомпьютер в кармане


Почему ARM сегодня выбирает архитектуру как у суперкомпьютеров? Что происходит?

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

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

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

Читать далее: RISC-V Vector Instructions vs ARM and x86 SIMD.

ARM и высокопроизводительные вычисления


Следующим шагом после настольных компьютеров и серверов, естественно, являются высокопроизводительные вычисления (High Performance Computing, HPC). Настоящие суперкомпьютеры. В далеком прошлом в этом сегменте доминировали специальные аппаратные решения, такие как ARM, а затем появились крупные центры обработки данных с серийным оборудованием x86 и мощными видеокартами.

Intel и AMD хорошо зарабатывают на этом рынке, поскольку машинное обучение и анализ данных стали гораздо более распространенными и важными. Естественно, ARM хочет получить кусок этого рынка. Первым серьезным шагом стал микропроцессор Fujitsu A64FX на базе ARM.

У Fujitsu есть опыт построения Cray-подобных компьютеров с векторной обработкой. Они объединились с ARM, чтобы расширить процессоры ARM набором инструкций Scalable Vector Extension. Таким образом, это не изобретение ARM, а адаптация уже существующего набора инструкций для высокопроизводительных вычислений к процессорам ARM.

Эта комбинация, используемая для A64FX, стала основной для создания самого мощного суперкомпьютера в мире: Japans Fugaku gains title as worlds fastest supercomputer.

Процессор A64FX на архитектуре ARMv8, разработанный Fujitsu для высокопроизводительных вычислений. Это первый процессор с Scalable Vector Extension.

Но следует помнить об одном важном факте: это было расширением и не является частью спецификации ARMv8. То есть ваши iPhone или iPad с процессором на ARMv8 не может запускать код, созданный для суперкомпьютера Fugaku, потому что у них нет поддержки инструкций SVE.

Для сравнения, в ARMv9 такие инструкции стали частью стандарта. Именно поэтому я говорю, что ARM кладут суперкомпьютер в карман.

Но есть и более сложная история, которая требует более подробного рассмотрения. Как видите, ARM предлагает создавать процессоры, которые способны выполнять один и тот же код вне зависимости от их стоимости и мощности.

Они делают это таким образом, что прирост производительности обычного кода может превышать определенные ранее пределы. Подобные вещи невозможны с решениями, которые Intel и AMD использовали с инструкциями AVX для своих микропроцессоров x86.

Чтобы лучше понять почему, нам нужно рассмотреть различия и сходства между векторной обработкой и инструкциями SIMD. Но сначала рассмотрим, что такое вектор.


Вы можете смотреть на векторы по-разному. Например, как на набор цифр. Но на самом деле они указывают направление в пространстве, как стрелки. Координаты (x, y) точки указывают, где находится точка. Координаты (x, y) вектора указывают, как далеко растягивается вектор по осям. Причина, по которой векторы могут иметь больше чисел, заключается в том, что они не ограничены двухмерным или трехмерным пространством. Они могут существовать в воображаемом пространстве с сотнями, если не тысячами, измерений. В математике возможно все, что вы можете вообразить.

Что такое вектор?


Вектор это просто причудливый математический термин для списка чисел. Например:

[3, 5, 9]

Удобно работать со списками чисел, обращаясь к ним по имени или иному идентификатору. Например, два вектора с именами v1 и v2.

v1  [3, 2, 1]      v2  [1, 2, 2]

И вот способ выразить, что я складываю векторы и сохраняю результат в v3.

v3  v1 + v2  ; v3 должен быть [4, 4, 3]

Почему я использую стрелки ()? Это полезно при объяснении того, что происходит внутри компьютера, потому что обычно мы храним числа в некоторой области памяти. Эта память может быть пронумерована или названа. Внутри микропроцессора есть небольшая область памяти, которая разделена на фрагменты, называемые регистрами. В микропроцессорах ARM эти регистры имеют имена, такие как x0, x1, , x31 или v0, v1, , v31.

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


Упрощенная схема микропроцессора. Числа из памяти передаются по цветным линиям, которые называются шинами. Регистры подают числа на вход математическим сопроцессорам или другим блокам, которые выполняют вычислительные операции.

Противоположность векторам скалярная величина. Это причудливое словосочетание для отдельных чисел. Итак, простой пример для скалярных операций с использованием стрелочной нотации.

x1  3        ; записать 3 в x1x2  4        ; записать 4 в x2x2  x1 + x2  ; сложение x1 и x2 дает 7

Векторы используются для многих вещей. Даже если вы не программист, вероятно, вы использовали приложение для работы с таблицами, например, Microsoft Excel. Столбец в таблице можно рассматривать как вектор. Обычно мы рассматриваем его как один логический элемент. Например, мы можем сложить все элементы в столбце или добавлять каждую ячейку столбца с каждой ячейкой на той же строке, но в другом столбце. Примерно это происходит внутри процессора, когда мы складываем два вектора. Вместе несколько столбцов образовывают таблицы. Говоря математическим языком, несколько векторов образуют матрицы. То есть набор чисел, организованных в строки и столбцы.

Представьте, что столбцы Amount и Unit Cost это векторы. Столбец Total Cost это результат поэлементного математического вычисления двух векторов.

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

Хотя современные компьютеры обычно не работают с матрицами, вычисления на матрицах можно ускорить с помощью векторов. Вот почему векторные инструкции важны для ускорения машинного обучения, распознавания изображений и речи. Математика векторов и матриц называется линейной алгеброй. У меня есть вступление для любопытных: The Core Idea of Linear Algebra.

Но не будем углубляться в математику. То, что нам нужно, связано с микропроцессорами. Инструкции в современном микропроцессоре, используемые для работы с векторами, называются SIMD.

SIMD против векторных инструкций


Технически ARM Neon и SVE являются формой SIMD (Single Instruction Multiple Data). Под этими инструкциями мы подразумеваем такие вещи, как сложение, вычитание и умножение. Таким образом, основная идея SIMD заключается в том, что вы отправляете одну инструкцию для процессора, а он выполняет одну и ту же операцию с несколькими значениями одновременно.

Один поток инструкций, один поток данных (SISD) и один поток инструкций множественные потоки данных (SIMD)
Подобные наборы инструкций существуют уже некоторое время. Вы, наверное, слышали про наборы инструкций MMX, SSE, а теперь и AVX на микропроцессорах x86 Intel и AMD. Они были созданы, чтобы выполнять обработку мультимедиа, такую как кодирование и декодирование видео. Инструкции ARM Neon наиболее похожи на них. Эти инструкции выглядят так:

LDR v0, [x4]    ; v0  memory[x4]LDR v1, [x6]    ; v1  memory[x6]ADD v4.16B, v0.16B, v1.16B STR v4, [x8]    ; v4  memory[x8]

В этом примере скалярные регистры x4, x6 и x8 содержат адреса в памяти, по которым располагаются числа в памяти.

Инструкция LDR загружает числа из памяти в регистр. Инструкция STR делает обратное: записывает числа из регистра в память.

Инструкция ADD выглядит странно. Почему там есть суффикс .16B после имени каждого регистра?

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


Векторные регистры, такие как v0 и v1, имеют размер 128 бит. Что это значит? По сути, это максимальное количество двоичных разрядов, которые может содержать векторный регистр.

Это устанавливает верхний предел того, над сколькими числами мы можем выполнять операцию одновременно и сколько двоичных разрядов может иметь каждое из этих чисел. Например, если вы хотите складывать 64-битные числа, то вы сможете работать только с двумя, потому что в 128-битный регистр их помещается только два. Однако если числа будут меньше, то вы сможете уместить их больше. Например, при работе со значениями цвета мы обычно представляем компоненты красного, зеленого и синего как 8-битные значения. В 128-битный регистр их поместится 16.

128/8 = 16

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

ADD v4.2D, v0.2D, v1.2D

В терминах микропроцессора мы называем 32-битное число машинным словом (word), а 64-битное число двойным машинным словом (double-word). Таким образом, .2D означает два двойных слова, а .4S четыре одинарных.

128/32 = 4

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

Количество элементов, на которые мы разбиваем регистр во время вычисления, определяет, сколько дорожек будет настроено для вычислений. Подумайте о дороге, где числа, словно машины, идут параллельно по нескольким полосам. Ниже приведен пример этого. У нас есть регистры v1 и v2, которые используют для вычислений, а результат сохраняется в регистр v3. Таким образом, мы разбиваем на два элемента (.2D), и у нас есть две дорожки для вычислений. Каждая дорожка получает одно арифметико-логическое устройство (АЛУ).

Сколько АЛУ используется в SIMD-вычислениях. У нас есть две дорожки вычислений. Каждая дорожка обслуживается одним АЛУ.

Если вам не нравятся мои иллюстрации, то вот иллюстрация ARM, которая демонстрирует задумку на четырех дорожках.

Сложение регистров v8 и v9 с четырьмя дорожками

Проблемы с инструкциями SIMD


Инструкции SIMD, подобные тем, которые вы видите ниже, могут выполняться с разными аргументами.

ADD v4.2D, v0.2D, v1.2D ADD v4.4S, v0.4S, v1.4S

Однако они кодируются как отдельные инструкции. Это быстро выходит из-под контроля, что хорошо видно на примере x86. Intel начала с MMX, затем появились SSE, SSE2, AVX, AVX2 и наконец AVX-512. MMX, например, имел 64-битные векторные регистры, поэтому вы могли выполнять параллельную работу над двумя 32-битными регистрами или восемью 8-битными.

Со временем, когда транзисторов становилось все больше, было принято решение сделать новые векторные регистры большего размера. Например, SSE2 имеет 128-битные регистры. В конце концов этого оказалось недостаточно, и мы получили AVX, а AVX2 предоставил нам 256-битные регистры. Теперь, наконец, AVX-512 представил нам невероятные 512-битные регистры. Итак, теперь мы можем вычислять шестьдесят четыре 8-битных значения цвета параллельно.

Каждый раз, когда Intel делала доступными регистры большего размера, им приходилось добавлять множество новых инструкций. Почему? Потому что длина векторного регистра прописана в инструкции SIMD. Например, инструкция ADD потребуется для:

  1. Каждого регистра длиной 64, 128, 256 или 512 бит.
  2. Для каждого из регистров нужен отдельный вариант с нужным числом дорожек.

Таким образом, добавление инструкций SIMD привело к резкому увеличению числа инструкций, особенно для x86. И конечно же, не каждый процессор поддерживает эти инструкции. Только новые будут поддерживать AVX-512.

Почему ARM не следует стратегии AMD и Intel


Эта стратегия не работает для ARM. У Intel и AMD простая миссия. Они просто пытаются сделать самые мощные узкоспециализированные процессоры, которые они могут выпустить в любое время в магазин.

ARM, напротив, пытается удовлетворить широкий спектр потребностей. ARM работает как на крошечных встраиваемых устройствах, так и на суперкомпьютерах, таких как Fugaku. ARM может предложить дизайн процессора для сервера с использованием 512-битных векторов, но его поддержка на крошечном ARM, предназначенном для работы в бюджетном телефоне, будет невозможна. Конечно, ARM может сделать доступным множество различных наборов инструкций.

И действительно, ARM предлагает разные профили для разных сегментов рынка. Но ARM по-прежнему заинтересованы в том, чтобы одно программное обеспечение могло работать с широким спектром их процессоров.

SVE и SVE2 позволяют ARM задавать разную физическую длину векторных регистров для каждого типа микросхем. В SVE/SVE2 векторный регистр должен иметь длину от 128 до 2048 бит. Для смартфоном с низким энергопотреблением они могут продавать дизайны с 128-битными векторными регистрами, а для суперкомпьютеров с 2048-битными.

Красота SVE в том, что один код будет работать как на суперкомпьютере, так и на дешевом телефоне. Это невозможно с инструкциями SIMD x86. Хотя я не являюсь экспертом по асемблерному коду ARM, судя по тому, как выглядит код при использовании Neon и SVE, мне кажется, что последний будет более эффективным даже при равной длине векторного регистра.

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

SVE в действии


Если мы посмотрим на инструкции Neon, то они кодируют количество дорожек так же, как указано в предыдущем примере.

ADD v4.2D, v0.2D, v1.2D ADD v4.4S, v0.4S, v1.4S

Но если мы переведем это в инструкции SVE, то мы увидим что-то подобное.

ADD v4.D, v0.D, v1.D ADD v4.S, v0.S, v1.S

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

Предикация


Вместо этого в SVE используется то, что мы называем предикацией. Есть набор специальных регистров p0, p1, , p15, которые работают как маски для вычислительных дорожек. Их можно использовать для включения или выключения дорожек. Таким образом, использовавшаяся ранее инструкция сложения выглядела бы так:

ADD v4.D, p0/M, v0.D, v1.D

Теперь у нас есть дополнительный аргумент p0/M, который позволяет процессору сохранять результаты сложения v0 и v1 в v4 только когда соответствующий элемент p0 равен логической единице (истина). В псевдокоде это выглядит следующим образом.

while i < N   if p0[i] == 1      v4[i] = v0[i] + v1[i]   else      v4[i] = v0[i]   end   i += 1end

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

LD1D z1.D, p0/Z, [x1, x3, LSL #3]

Здесь происходит несколько процессов, поэтому необходимо некоторое объяснение. [x1, x3, LSL #3] это типичный для ARM способ указания адреса памяти. Это можно прочесть так:

base_address = x1 + x3*2^3z1  memory[base_address]

Но поскольку мы используем предикат, то это не совсем правильно. Нам нужно отфильтровать то, что загружается. Более точно это выглядит так:

base = x1 + x3*2^3while i < N   if p0[i] == 1      v1[i] = memory[base + i]   else      v1[i] = 0   end   i += 1end

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

julia> mask = [false, true, true, false];julia> A = [2, 4, 8, 10];julia> B = [1, 3, 7, 9];julia> A[mask]2-element Vector{Int64}: 4 8 julia> B[[true, false, false, true]]2-element Vector{Int64}: 1 9 julia> A[mask] + B[mask]2-element Vector{Int64}:  7 15

В этом примере вы видите, что у нас есть векторы с четырьмя элементами. Мы используем маску, аналогичную регистрам предикатов, для выбора двух средних элементов.

Таким образом, мы можем выполнить сложение только двух средних значений.

Как работать с вектором неизвестной длины


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

Это помогает нам значительно упростить код векторной обработки и избежать необходимости знать точную длину вектора. Допустим, нам нужно обработать шесть 32-битных значений. То есть N = 6, и это единственное, что вы знаете во время компиляции. Инструкции Neon будут выглядеть так:

ADD v4.4S, v0.4S, v1.4S  ; v4  v0 + v1

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

С SVE этого делать не придется. Вместо этого нам приходит на помощь волшебная инструкция WHILELT. Вот пример:

WHILELT p3.s, x1, x4

Но что она делает? Я объясню на примере псевдокода. Допустим, есть M дорожек для векторной обработки. Вы не знаете значение M до начала выполнения, но, допустим, что M = 4. Тем не менее, мы знаем количество элементов, которые хотим обработать, то есть N = x4 = 6. Инструкция WHILELT (WHILE Less Than, пока меньше чем) работает так:

i = 0while i < M   if x1 < x4      p3[i] = 1   else      p3[i] = 0  end  i += 1  x1 += 1end

Таким образом, если мы представим выполнение этих векторных операций в цикле, то на первой итерации p3 будет выглядеть так:

x1 = 0p3 = [1, 1, 1, 1]

На второй итерации в какой-то момент x1 станет больше, чем x4, поэтому получаем следующее:

p3 = [1, 1, 0, 0]

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

Так работает вся обработка SIMD. Вы обрабатываете партии чисел. Так, например, если вам нужно обработать 20 элементов, а ваш векторный регистр вмещает 4 дорожки, то вы можете сделать всю работу за 5 итераций (54 = 20). Но что если у вас 22 элемента?

Вы не можете выполнить полный пакет из четырех элементов. Таким образом, вам нужно доделать остатки вручную, по одному элементу за раз. С регистрами предикатов такой проблемы нет. Вы просто убираете из маски последние элементы. Это работает и с записью элементов в память.

Операции загрузки и сохранения


Другой важной особенностью SVE-инструкций является поддержка того, что мы называем операциями сборки-разборки (gather-scatter). Это означает, что вы можете заполнить векторный регистр данными, которые распределены по нескольким ячейкам памяти, всего за одну операцию. Точно так же вы можете записывать результаты из вектора в несколько местоположений. Принцип аналогичен тому, что мы обсуждали с предикатами.

Почему это полезно? В языках программирования более высокого уровня данные хранятся обычно следующим образом.

struct Sale {    int unit_price;    int sold_units;    int tax;}Sale sales[1000];

Допустим, у нас тысячи таких объектов. Обычно мы хотим проводить расчеты между связанными полями. Например, умножить цену unit_price на количество проданных единиц sold_units. Это значит, что вы хотите, чтобы в одном векторном регистра были цены за единицу, а в другом количество проданных единиц. Однако значения этих полей не лежат в памяти последовательно. Они чередуются.

Есть много таких деталей, которые позволяют применять SVE-инструкции к гораздо большее разнообразному коду. Можно векторизовать больше циклов for, что дает больше возможностей для повышения производительности.

Что предлагает SVE2?


Здесь, вы, естественно, задаетесь вопросом, а что добавляет SVE2, чего еще нет в SVE?

Расширение SVE было необязательным для архитектуры ARMv8. В то время SVE2 это часть стандарта. Это означает, что Neon и SVE получили еще более тесную интеграцию. В SVE добавлены инструкции, которые делают SVE2 заменой Neon. Теперь вы можете делать все, в чем был хорош Neon с помощью SVE2.

Помните, SVE создавался только для суперкомпьютерных вещей, а для мультимедийных рабочих нагрузок, для которых создавался Neon? Мультимедийным материалам обычно не нужны длинные регистры. Рассмотрим цветной пиксель, закодированный как RGBA. Это четыре 8-битных значения, которые помещаются в 32-битный регистр.


Каждый пиксель состоит из четырех компонент: красный, зеленый, синий цвета и прозрачность. Каждый байт должен вычисляться независимо. Мы можем сделать это, используя 32-битный векторный регистр с 4 дорожками.

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

Это дает ARM отличный набор инструкций, который может работать как с наиболее энергоэффективными, так и с наиболее производительными микросхемами. При этом пользователям необходимо выполнить компиляцию только один раз. Помимо этого, получается более простой код с точки зрения компилятора. А ARM не нужно участвовать в этой гонке вооружений с инструкциями SIMD, в которой участвуют Intel и AMD.

Им не нужно каждые несколько лет добавлять множество новых SIMD-инструкций. SVE2 дает фундамент с большой стабильностью и хорошим пространством для роста.

Последствия для пользователей, разработчиков и отрасли


Для разработчиков это значит, что написание и оптимизация кода ARM станет проще. Разработка программ для машинного обучения, распознавания лиц и голоса станет проще. Не придется беспокоиться, поддерживает ли целевая платформа нужные инструкции.

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

ARM также будет все больше вытеснять Intel и AMD из прибыльного бизнеса в центрах обработки данных. Я не являюсь экспертом по дизайну микросхем, но, видя, как RISC-V использует этот набор инструкций и понимает все преимущества, мне кажется, что Intel и AMD совершили ошибку, когда отказались от ARM. Их стратегия с SIMD не кажется мне разумной. Подозреваю, что эта ошибка будет их преследовать.

Подробнее..

Перевод Какой предел у предсказателя ветвлений? Проверили на x86 и M1

19.05.2021 12:19:31 | Автор: admin

Некоторое время назад я смотрел на высоконагруженную часть кода и обратил внимание на это:

if (debug) {    log("...");}

И тут я задумался. Это часть цикла, от которого требуется высокая производительность, но этот фрагмент выглядит как пустая трата времени, ведь мы никогда не устанавливаем флаг отладки. Нормально ли иметь в коде условные операторы, которые никогда не выполняются? Уверен, это влияет на производительность программы

Про флаги отладки
Одно историческое решение этой конкретной проблемы, связанной с откладкой называется runtime noping. Идея состоит в том, чтобы изменить код во время выполнения и исправить неиспользуемую инструкцию ветвления на nop. Например, ознакомьтесь с обсуждением ISENABLED на https://bugzilla.mozilla.org/showbug.cgi?id=370906.

Насколько плохо использовать избыточное количество условных операторов?


В те времена основное правило звучало так: полностью предсказанное ветвление практически не имеет дополнительных затрат процессорного времени.

Но насколько это правда? Для одного условного оператора точно, а как насчет десяти? А сотни? Или даже тысячи? Где граница, когда добавление еще одного условного оператора становится плохой идеей?

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

const char *getCountry(int cc) {        if(cc == 1) return "A1";        if(cc == 2) return "A2";        if(cc == 3) return "O1";        if(cc == 4) return "AD";        if(cc == 5) return "AE";        if(cc == 6) return "AF";        if(cc == 7) return "AG";        if(cc == 1) return "AI";        ...        if(cc == 252) return "YT";        if(cc == 253) return "ZA";        if(cc == 254) return "ZM";        if(cc == 255) return "ZW";        if(cc == 256) return "XK";        if(cc == 257) return "T1";        return "UNKNOWN";}

Конечно, этот код может быть оптимизирован. Но потом я задумался: нужно ли его оптимизировать? Будет ли снижение производительности от большого количества простых переходов?

Про оптимизацию
Интересный факт: современные компиляторы достаточно умны. Новый gcc (>= 11) и чуть более старый clang (>= 3.7) действительно могут значительно оптимизировать этот код. Но не будем отвлекаться, эта статья посвящена инструкциям ветвления на низком уровне!

Стоимость перехода


Начнем с теории. Сперва нам необходимо разобраться, как изменяется время выполнения условного перехода в зависимости от количества этих переходов. Как оказалось, оценить время выполнения одного ветвления не так просто. На современных процессорах ветвление занимает от одного до двадцати тактов.

Существует по крайней мере четыре вида инструкций, которые влияют на поток выполнения программы:

  1. безусловный переход (jmp на x86),
  2. call/return,
  3. переход при выполнении условия (je на x86),
  4. переход при невыполнении.

Переходов на самом деле больше
Это упрощение. Конечно, есть много способов изменить поток выполнения программы, например: программные прерывания, системные вызовы, VMENTER/VMEXIT.

Переход при выполнении условия особенно проблематичен, так как он может занять много процессорного времени. Для снижения временных затрат современные процессоры пытаются предсказать будущее и выбрать правильную ветвь кода до того, как условие будет вычислено. Этим занимается специальная часть процессора, которая называется предсказатель ветвлений (Branch Predictor Unit, BPU).

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

Источник
Предсказатель имеет несколько структур данных, но сегодня мы рассмотрим Branch Target Buffer (BTB). В этой структуре предсказатель хранит адреса условных операторов, которые уже были выполнены. В целом механизм намного сложнее, более подробно можно ознакомится в магистерской диссертации Владимира Юзелаца (Vladimir Uzelac) на примере процессоров 2008 года.


В данной статье мы рассмотрим как BTB ведет себя в разных условиях.

Зачем нужно прогнозировать переходы?


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

BR label_a;    X1    ...label_a: Y1

В упрощенной модели процессора операции будут проходить через конвейер следующим образом:


В первую очередь происходит выборка инструкции BR. Это безусловный переход, изменяющий поток выполнения. В это время инструкция перехода еще не декодирована, поэтому процессор производит выборку следующей инструкции. Без предсказателя ветвления на втором такте блок выборки команды либо должен ожидать декодирования, либо переходить к следующей, в надежде, что она окажется правильной.

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

Ситуация с потерей пары тактов из-за выборки не тех инструкций называется пузырем. У нашего теоретический процессора появился пузырь на два такта из-за ошибки в предсказании.

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

Играем с BTB


Как мы говорили ранее, сегодня мы рассмотрим Branch Target Buffer структуру данных, которая отвечает за определение следующего адреса после ветвления. Важно отметить, что BTB независим от системы, которая оценивает результат ветвления. Помните, мы хотим узнать, увеличивается ли время выполнения переходов при увеличении их количества.

Подготовить эксперимент, который создает нагрузку только на BTB относительно просто. В основе этого теста лежит работа Мэтта Годболта (Matt GodBolt). Оказывается, достаточно последовательности безусловных переходов. Рассмотрим следующий x86 код:


Это код состоит из последовательности инструкций jmp +2 (то есть буквально безусловный переход на следующую инструкцию), что создает значительную нагрузку на BTB. Для того, чтобы избежать пузырей, каждый переход требует правильного ответа от BTB. Такое предсказание ветвления должно происходить в самом начале конвейера до завершения декодирования команды. Этот механизм также необходим для любого ветвления, вне зависимости от его типа.

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


Мы провели подобный эксперимент для нескольких разных процессоров. В примере выше использовался процессор AMD EPYC 7642. В первый холодный запуск выполнение инструкции jmp занимало в среднем 10.5 тактов, а во все последующие запуски примерно 3.5 такта. Код теста составлен так, чтобы быть уверенным, что именно BTB тормозит первый запуск. Если взглянуть на исходный код, то можно увидеть некоторую магию с прогревом кэшей L1 и i-TLB без использования BTB.

Замечание 1. На данном процессоре инструкция перехода без предсказания занимает примерно на 7 тактов больше, чем инструкция перехода с предсказанием. Даже в случае безусловного перехода.

Плотность имеет значение


Чтобы получить полную картину, следует задуматься о плотности jmp-инструкций в коде. Например, в коде выше на блок в 16 байт приходится 8 переходов. Это очень много. Следующий код содержит одну инструкцию на каждые 16 байт. Обращаем внимание, что инструкции nop перепрыгиваются. Размер блока не влияет на количество выполненных инструкций, только на плотность кода.


Изменение размера блока может быть очень важным. Это позволяет нам контролировать размещение инструкций jmp. Напомним, что BTB индексируется по адресу инструкции. Значение указателя и выравнивание могут повлиять на размещение в BTB и помочь нам разобраться в его строении. Выравнивание может привести к необходимости добавить дополнительные nop. Последовательность из измеряемой инструкции jmp и последующих nop я буду называть блоком. Важно, что при увеличении размера блока увеличивается размер исполняемой программы. При больших значениях размера блока можно заметить просадку по производительности, которая связана с исчерпанием места в L1-кэше.

Эксперимент


Наш эксперимент призван продемонстрировать снижение производительности в зависимости от количества ветвления при разном размере исполняемой программы. Надеюсь, мы сможем доказать, что производительность в основном зависит от количества блоков и, следовательно, от размера BTB, а не от размера рабочего кода.

Взгляните на код в нашем GitHub. Если вы захотите увидеть сгенерированный машинный код, то вам придется выполнить специальную команду. Вот пример заклинания для gdb:


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


Про отметку 4096 блоков
Хорошо, возможно, я немного переоцениваю график. Может быть отметка 4096 связана с кэшем микроопераций или каким-то артефактор декодера инструкций? Чтобы доказать, что этот всплеск связан с BTB я посмотрел на счетчики производительности Intel BPUCLEARS.EARLY и BACLEAR.CLEAR. Их значение невелико для количества блоков 4096 и увеличивается для количества блоков больше 5378. Это убедительное доказательство того, что падение производительности вызвано BPU и, вероятно, BTB.

Это потрясающий график. Во-первых, очевидно, что что-то происходит на отметке 4096 блоков вне зависимости от размера блока. Проговорим еще раз.

  • В самой левой части мы видим, что код достаточно мал меньше 2048 байт. Это позволяет уместиться в каком-то кэше и получить примерно 1.5 тактов на инструкцию при полностью спрогнозированном ветвлении. Великолепно.
  • С другой стороны, если ваш высоконагруженный цикл будет состоять не более, чем из 4096 переходов, то вне зависимости от плотности кода вы получите примерно 3.4 такта на каждый успешно предсказанный переход.
  • Если переходов больше 4096, то предсказатель ветвления выходит из игры и каждый переход станет занимать до 10.5 тактов. Это совпадает с тем, что мы видели раньше: переход без предсказания занимает около 10.5 тактов.

И что же это значит? Это значит, что вам следует избегать инструкций ветвления, если вы хотите уменьшить промахи в предсказании, так как BTB имеет только 4096 быстрых ячеек. Впрочем, это не самый полезный совет, ведь мы не специально помещаем столько безусловных переходов в код.

Есть пара выводов по обсуждаемому процессору. Я повторил эксперимент с последовательностью условных переходов, которые всегда выполняются. Получившаяся диаграмма выглядит почти идентичной. Единственная разница заключается в том, что условный переход je на два такта медленнее, чем безусловный jmp.

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


Этот скучный код перебирает jne, за которым следуют два nop (размер блока 4). С помощью этого теста (jne никогда не выполняется), предыдущего (jmp всегда выполняется) и всегда выполняющегося перехода je мы можем нарисовать следующую диаграмму:


Во-первых, мы видим, что всегда выполняющийся условный переход je занимает больше времени, чем безусловный jmp, но это заметно только при количестве переходов больше 4096. Это ожидаемо, так как условие решается позже в конвейере, что создает пузырь. Далее, взгляните на синюю линию, которая чуть выше нуля. Это условный переход jne, который никогда не выполняется и занимает 0.3 такта на блок вне зависимости от количества блоков. Вывод очевиден: у вас может быть сколько угодно ветвлений, которые никогда не используются и это вам практически ничего не будет стоить. На отметке 4096 скачка нет, а значит, что BTB в данном случае не используется. Кажется, что для условных переходов, о которых нет информации, всегда делается предсказание о невыполнении условия.

Замечание 2. Условные переходы, которые никогда не выполняются, практически бесплатны. По крайней мере на этом процессоре.

Пока мы установили, что всегда исполняемые инструкции ветвления занимают BTB, а никогда не исполняемые нет. А как насчет других инструкций, например, call?

Мне не удалось найти этого в литературе, но кажется, что call и ret также занимают место в BTB для повышения производительности. Я смог продемонстрировать это на нашем AMD EPYC. Давайте посмотрим на следующий тест:


На этот раз вызовем несколько инструкций callq, каждая из которых должна быть полностью предсказанной. Эксперимент построен так, что каждый callq вызывает уникальную функцию, которая содержит retq. Один возврат соответствует одному вызову.


Этот график подтверждает теорию: вне зависимости от плотности кода (исключение: блок 64 байта значительно медленнее) стоимость операций начинает увеличиваться после отметки 2048. На этой отметке BTB заполняется предсказаниями call и ret и не может хранить больше данных. Из этого следует важное заключение:

Замечание 3. В вашем высоконагруженном коде должно быть меньше двух тысяч вызовов функций, по крайней мере на этом процессоре.
На нашем тестовом процессоре последовательность полностью предсказанных вызовов и возвратов занимает около 7 циклов, что примерно равно двум безусловным переходам jmp. Это согласуется с результатами выше.
Мы тщательно протестировали AMD EPYC 7642. Мы начали с этого процессора, так как предсказатель ветвления оказался прост, а диаграммы понятны. Оказалось, что на новых процессорах все не так просто.

AMD EPYC 7713


Новое поколение AMD EPYC более сложное, чем предыдущие. Давайте проведем два самых важных эксперимента. Во-первых, jmp:


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

Замечание 4. На данном процессоре можно получить переходы за менее, чем 1 такт, когда высоконагруженный цикл занимает меньше 32 КиБ.

Затем, после отметки 4096 начинается некоторый шум. А после отметки в 6000 переходов падение скорости замедляется. Мы можем предположить, что за этим пределом срабатывает иной механизм прогнозирования, который поддерживает производительность на одном уровне.


Вызовы call/ret показывают примерно тоже самое. Предсказания после отметки в 2048 блоков начинают ухудшаться, а за пределами 3000 блоков вообще не срабатывают.

Xeon Gold 6262


Процессор Intel показывает совершенно другие результаты:


Наш тест показывает, что предсказанный выполняющийся переход занимает два такта. Intel задокументировала снижение тактовой частоты при высокой плотности ветвления. Это объясняет, что линия для 4-байтового блока колеблется около отметки в 3 такта. Рост количества циклов на инструкцию начинается на 4096 блоках, что подтверждает теорию о том, что Intel BTB содержит 4096 ячеек.

График с размером блока 64 байта выглядит непонятным, но легко объясняется. Стоимость операции ветвления остается неизменной до 512 операций, а затем начинает расти. Это объясняется внутренним устройством BTB, которое называется 8-way associative. Похоже, что с размером блока 64 байта мы можем использовать максимум половину из 4096 ячеек BTB.

Замечание 5. На процессорах Intel избегайте расположения jmp/call/ret на интервалах по 64 байта.

Наконец график call/ret:


Точно так же можно видеть, что предсказания ветвления перестают работать после отметке в 2048 инструкций. В этом эксперименте один блок использует две инструкции call и ret. Это еще раз подтверждается, что размер BTB составляет 4k. Блок размером 64 байта обычно медленнее, из-за наполнения nop, но в нем предсказатель начинает ломаться раньше из-за проблем с выравниванием инструкций. Обратите внимание, что такого эффекта не наблюдалось на процессорах AMD.

Apple Silicon M1


До сих пор мы рассматривали процессоры серверного сегмента. А как Apple Silicon M1 вписывается в эту картину?

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


Тест с предсказанными jmp показывает интересные вещи. Во-первых, когда код помещается в 4096 байт (1024 * 4, 512 * 8 и так далее), то вы можете ожидать, что jmp будет выполняться за 1 такт. Это замечательно.

Помимо этого, вы можете ожидать, что jmp выполнится за три такта. Это тоже очень хорошо. Ухудшения начинаются, когда размер кода превышает 200 КиБ. Это видно на графике с размером блока 64 на отметке 3072 (3072 * 64 = 196 КиБ) и на отметке 6144 при размере блока 32 (6144 * 32 = 196 КиБ). В документации указано, что L1-кэш инструкций процессора имеет размер 192 КиБ. Наш эксперимент это подтверждает.

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


Однако, если мы не доверяем коду flush-bpu (адаптированному коду Мэтта Годболта), эта диаграмма показывает две вещи. Во-первых, стоимость перехода без предсказания коррелирует с расстоянием перехода. Чем длиннее прыжок, тем он дороже. Мы не наблюдали такого поведения на процессорах x86.

Мы видели, сколько стоят последовательности предсказанных и не предсказанных переходов. На первом графике мы видим, что при превышении размера в 192 КиБ предсказатель ветвлений становится неэффективным. В эксперименте с якобы отключенным предсказателем мы видим те же значения. Например, для блока в 64 байта безусловный переход jmp занимает 3 такта. В случае, если предсказатель не сработал, то 8 тактов. Для большого объема кода безусловный переход занимает 8 тактов. Получается, что BTB соединен с L1 кэшем. Пол Клэйтон (Paul A. Clayton) предположил возможность такой архитектуры еще в 2016.

Замечание 6. На M1 предсказанные переходы занимают обычно 3 такта, а не предсказанные зависят от расстояния, на которое происходит переход. Вероятно, что BTB связан с L1-кэшем.

График call/ret получился забавным:


Как и в предыдущем графике, мы можем видеть значительный прирост производительности, если укладываемся в 4096 байт. В противном случае мы можем рассчитывать на 4-6 тактов на последовательность call/ret. На графике можно видеть забавные проблемы, связанные с выравниванием в памяти. Причина этих проблем не установлена. Сравнение этого графика с аналогичными для x86 может быть некорректным, так как инструкция call значительно отличается от варианта для x86.

M1 выглядит достаточно быстрым, особенно с предсказанными переходами, которые выполняются за 3 такта. В нашем тесте переходы перед предсказаниями не выполнялись дольше 8 тактов. А последовательность call + ret для кода с высокой плотностью должна соответствовать пяти тактам.

Заключение


Мы начали эту статью с кусочка обычного кода и задали простой вопрос: как влияет на производительность добавление условных операторов, который никогда не выполняются?

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

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

С другой стороны, на M1 выглядит так, как будто BTB ограничен размером кэша L1. Но если вы пишете максимально производительный код, то он в идеале должен быть меньше 4 КиБ.

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

Источники


Я не первый человек, который изучал, как работает BTB. Мои эксперименты основаны на следующих материалах:



Подробнее..

Перевод Яблочная ARMия

26.03.2021 20:17:43 | Автор: admin

Apple отказывается от процессоров Intel в пользу собственных на базе ARM. Последуют ли её примеру другие производители ПК?

Apple отказывается от процессоров Intel в пользу своих собственных. Почему это произошло и каковы возможные последствия для всего рынка ПК? Как случилось, что микроархитектура CPU, изначально появившаяся в безвестных британских домашних компьютерах в 1980-х годах, бросает вызов империи Intel? В этой статье мы рассмотрим специфику проектирования процессоров ARM, проследим за тем, как они совершенствовались с годами и как достигнутый прогресс отразился на тестах производительности, а также сопоставим полученные результаты с результатами тестов железа от Intel. Ещё порассуждаем о конкуренции на рынке ПО и как она сказывается на нас, потребителях. И хорошо ли для пользователей ПК иметь микроархитектуру, построенную на совершенно отличном от привычного набора инструкций.
Что представляет собой процессор от Intel? Что такое ПК? В те дни, когда компоненты для IBM поставляли различные производители, у неё (IBM) имелись собственные процессоры 801 RISC. Однако она отказалась от них в пользу более экономичных Intel 8088, и так повелось, что в любой совестимый ПК можно было поставить процессор с архитектурой x86.
В теории проектировать и производить x86-совместимые процессоры мог любой, однако по закону Intel обладала патентом на наборы команд CPU.Это означало, что всем желающим их приобрести, пришлось бы покупать лицензию. Если сторонняя фирма и занималась разработкой или производством процессоров x86, то только потому, что Intel или суд дали на это разрешение. С AMD дела обстоят иначе, поскольку она заключила соглашение о патентной лицензии с Intel, чтобы потом не судиться друг с другом до беспамятства.
Долгое время производством CPU на архитектуре x86 занималось несколько компаний: IBM с её линейкой 386-х и 486-х процессоров, AMD, Cytrix, VIA, NEC, Transmeta и др. Дизайн их CPU оставлял желать лучшего. Intel всегда была победителем, в то время как другие (за исключением AMD и IBM) были лишь рядовыми спортсменами. Вы, конечно, могли бы возразить, что на рынке была конкуренция. Но считалась ли конкуренцией битва за отбросы? Суть в том, что у Intel не было достойного соперника даже сегодня, учитывая, что дела у AMD идут хорошо, ей (AMD) принадлежит всего лишь 18% рынка. Сам производитель заявлял в 2020-м году о том, что стремится заполучить 10% рынка серверов и снова достигнуть высот 2006 года, когда на долю Opteron приходилось 25% рынка.
Можно, конечно, сетовать на отсутствие конкуренции, но что можно изменить, чтобы положить конец создавшемуся положению вещей? Недавно Apple сделала громкое заявление о том, что она отказывается от процессоров на базе Intel и переводит всё своё железо на CPU собственной разработки. Речь идёт не только о лэптопах и низкопроизводительных iMacs, но даже о высокопроизводительных рабочих станциях на базе Intel Xeon. Планы, конечно, грандиозные, но как она собирается воплощать их в жизнь?

Старые добрые времена

Итак, Apple не собирается строить будущие процессоры на базе архитектуры x86. Ни для кого не секрет, что iPhone очень популярны. Кроме того, их причисляют к самым быстрым смартфонам на рынке мобильных устройств. При желании компания могла бы задействовать любую микроархитектуру своих мобильных CPU для разработки настольных систем. Опять же, кто проектировал эти процессоры? Сама Apple, используя архитектуру набора команд (ISA) по лицензии ARM.

Для справки: микроархитектура ARM использует сокращённый набор команд (RISC), в то время как микроархитектура x86 использует полный набор команд (CISC).

Пару слов о RISC. Принципами проектирования RISC-микропроцессора являются оптимизация набора команд и работы ядра, гарантия того, что инструкции можно выполнить за один цикл памяти, устранение ненужных команд. Со временем наборов инструкций стало больше, в основном за счёт отдельных криптографических/векторных/SIMD функций. Так что слово сокращённый не соответствует действительности.

Реализация подобных проектных решений влечёт за собой интересные последствия. Оптимизация набора инструкций сокращает число задействованных транзисторов и, как следствие, количество потребляемой энергии, требуемой для выполнения любых действий. И потому x86 с её схемой CISC изначально требуется больше транзисторов для выполнения любой вычислительной работы и больше затрат энергии. Для настольных ПК это обстоятельство большой проблемы не представляет, однако для ноутбуков и смартфонов каждый ватт на счету.

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

Вступайте в ARMию

Далее мы проследим за тем, как архитектура ARM развивались с течением времени.

ARM это компания, которая разрабатывает спецификации АСК (архитектуры системы команд) процессоров ARM и улучшает их с помощью новых технологий. В их число входит особый дизайн ядер big.LITTLE, набор инструкций NEON SIMD и усовершенствованные математические сопроцессоры. Как правило, каждому новому семейству CPU производитель присваивает своё имя. Так у Apple оно впервые появилось с выходом линейки процессоров ARM11 с 32-битной архитектурой. Впоследствии разработчики Яблока создали собственную микроархитектуру на базе обновлений 64-битной ARMv8.

Результаты тестов в Geekbench мобильных процессоров ARMРезультаты тестов в Geekbench мобильных процессоров ARM

Первые iPhone работали на SoC от Samsung. Эта система на кристалле была построена на базе процессоров ARM11 с архитектурой ARMv6 2002-го года выпуска. Разработка и реализация iPhone осуществлялась в соответствии с нуждами, бытовавшими на заре появления смартфонов. В них была представлена SIMD (вычислительная система с одиночным потоком команд и множественным потоком данных) для считывания MPEG-файлов, увеличенный кэш (всего лишь 32К) и восьмиступенчатый конвейер. Так как функции изменения очерёдности команд и предсказания ветвлений были ограничены, то производительность первых iPhone не иначе как слабой не назовёшь.
iPhone 3GS стал первым удобным для пользования смартфоном от Apple (с точки зрения программных функций). Он всё ещё работал на SoC от Samsung, но теперь имел в составе улучшенное ядро Cortex-A8. Результаты испытаний показали увеличение скорости на 107% запишите это на счёт суперскалярного 13-ступенчатого конвейера и 10-ступенчатого конвейера NEON SIMD для ускорения медиаприложений. Помимо удвоенного кэша L1 в 3GS был впервые представлен кэш L2 на 256K, а также встроенный сопроцессор. Двигаясь по пути наименьшего сопротивления, ARM и Apple без труда оптимизировали CPU на ранних стадиях, что привело к увеличению скорости процессоров работы в два раза.
Apple A4 стала первой SoC собственной разработки Apple. Она дебютировала на оригинальном iPad с частотой 1 ГГц, однако позже использовалась в iPhone 4 при частоте 800 МГц. Если бы у Яблока была своя модель развития микропроцессоров Тик-так, как у Intel, то это была бы стадия так. Построенная на базе прежней архитектуры Cortex-A8 и того же 45-нм техпроцесса от Samsung она предлагала значительные улучшения за счёт увеличения частоты и удвоения кэша L2 до 512К и шины памяти до 64 бит.
Вместе с iPad 2 компания Apple представила свою принципиально новую однокристальную систему Apple A5 с частотой 1 ГГц. Позже та же SoC была заявлена в iPhone 4S, только работала она при 800 МГц. Выпуск Apple A5 стал знаковым событием для Яблока: теперь его ядра имели обновлённый дизайн Cortex-A9, а сам процессор стал двухъядерным. 45-нм техпроцесс от Samsung и тактовая частота остались прежними, зато быстродействие памяти выросло до 400 МГц, а кэш L2 снова удвоился до 1 Мб. В Cortex-A9 также были представлены ключевые улучшения: 8-ступенчатый конвейер с упреждающим считыванием, способный выполнять команды с изменением их последовательности, улучшенный NEON SIMD и математический сопроцессор с увеличенной вдвое скоростью.

Релиз A6 случился тогда, когда Apple начала брать под контроль разработку своих смартфонов и внедрять собственные дизайнерские идеи в ARMv7. Apple A6 были последними процессорами от Apple, построенными на 32-битной архитектуре. И хотя кэши L1 и L2 были те же, что и у А5, техпроцесс уменьшился до 32 нм, а тактовая частота выросла до 1,3 ГГц. Благодаря грамотным решениям в архитектуре производительность значительно увеличилась, потребление энергии же сократилось.

Судя по всему, A6 построен на ядре Cortex-A9, однако в нём использованы компоненты улучшенного чипа Cortex-A15, включая тогда ещё новые v4 FPU и Advanced SIMD v2. Анализ показывает, что в него было включено 5 функциональных модулей (2 арифметико-логических устройства (АЛУ), 2 математических сопроцессора/набора инструкций NEON и 1 модуль загрузки/сохранения). И вот этот значительно улучшенный FPU, оптимизированный кэш, специально выделенный модуль для загрузки/сохранения всё это привело к тому, что производительность памяти увеличилась втрое, а быстродействие вдвое.

С этого времени дела у производителя пошли в гору, а его А7 и вовсе совершил прорыв, став первым 64-битным процессором, в то время как остальные производители отстали с его выпуском на год. Благодаря архитектуре ARMv8-А на базе 28-нм техпроцесса от Samsung Apple добавила кэш L3 на 4 Мб, удвоила кэш L2 до 1 Мб и L1 до 128 Кб. Фактически Apple удвоила разрядность за счёт 4-х АЛУ, 2-х модулей для загрузки/сохранения, 2-х блоков передачи управления, 3-х модулей FPU/NEON. А7 достиг отметки 1млрд. транзисторов, а производительность его увеличилась на 33% по сравнению с А6. В то время Geekbench 2, изначально предназначенный только для замера производительности 32-битных систем, начал устаревать. Результаты же тестов в Geekbench 3 показали, что ядра А7 Cyclone превзошли своих конкурентов в два раза!

64-битное ядро Cyclone64-битное ядро Cyclone

Apple А8 остаётся под вопросом. Похоже, в то время Apple уделяла больше внимания графическому ускорителю. Тогда же она разработала собственный пользовательский шейдер и, видимо, тогда же производитель начал переходить на новый 20-нм техпроцесс от TSMC. Схожая ситуация и с выпуском Apple А9, однако благодаря внедрению 20-нм техпроцесса от TSMC и 14-нм техпроцесса от Samsung тактовая частота процессора выросла до 1,8 ГГц, а L2 увеличился втрое до 3 Мб.
Появлению Apple А10 предшествовали два больших сдвига: внедрение технологии big.LITTLE от ARM, использующей высоко- и маломощные ядра для сбалансированного энергопотребления, и переход на уменьшенный до 16-нм техпроцесс от TSMC. Лёгкой победой стало увеличение частоты до 2,3 ГГц, которого удалось добиться посредством двух маломощных ядер Zephyr. Они работали на частоте 1 ГГц и тем самым использовали лишь 20% мощности больших ядер. Тогда же состоялся переход на новую микроархитектуру ARMv8.1-A, по сути являвшейся корректировочной версией прежней микроархитектуры. Эта система на кристалле от Apple была последней, проходившей тестирование в Geekbench 2. Результаты испытаний показывали лишь увеличение тактовой частоты, в то время как в новых версиях Geekbench появились замеры производительности графического ускорителя. И, согласно этим результатам, скорость работы элементов GPU от Apple стабильно росла.

В Apple A11 были представлены 2 крупных (Monsoon) и 4 малых (Mistral) вычислительных ядра, причём последние были построены на базе ядер Apple A6 Swift. В отличие от A10, малые ядра могли работать независимо от крупных ядер. Крупные ядра значительно улучшились: теперь они могли декодировать до 7 инструкций за такт вместо прежних 6. В то же время число блоков ALU увеличилось на две единицы, и теперь общее их количество достигло 6.

Спроектированные в 2012-м году Apple Swift стали большим шагом вперёдСпроектированные в 2012-м году Apple Swift стали большим шагом вперёд

A12 стал ещё одним шагом вперёд для Apple он был первым доступным широкому кругу пользователей 7-нанометровым чипом. A12 сильно изменился в плане организации кэша, что в свою очередь способствовало уменьшению времени отклика и увеличению пропускной способности. Кэш L3 был изъят в пользу системного кэша L2 на 8 Мб, а L1 был удвоен до 256 К. Чип содержал 2 крупных высокопроизводительных ядра Vortex и 4 малых энергоэффективных ядра Tempest на базе Apple A6 Swift. Крупные ядра имели однопоточный быстрый режим до 2,5 ГГц. Микроархитектуры A11 и A12 были очень мощными, даже для десктопных процессоров.

Разработчики текущей модели A13 продолжили делать ставку на систему кэша. System Level Cache получила аж 16 Мб на обслуживание SoC. У малых ядер (Thunder) имеется 4Мб кэша L2, у крупных (Lightning) 8Мб. В целом дизайн A13 похож на коммуникационный процессор с шириной декодирования 7 и улучшенным множителем.
Apple, несомненно, поборется с Intel за рынок настольных ПК. Дизайн CPU, как и всего ПК, у Яблока в целом хорошо проработан. Однако важно помнить, что положение Apple отлично от остальных лицензиатов ARM. Apple проектирует чипы с тем расчётом, чтобы продавать их в продуктах по премиальной цене. Наверняка в её гаджетах будут мощные батареи и прочие свистелки-дуделки, а владелец будет знать, что его вложения окупятся.

Однако для сторонних производителей такая модель ведения бизнеса просто невозможна. Взять хотя бы AMD: ранее она не могла конкурировать с Intel, и с трудом делает это сейчас. Так собирается ли производитель процессоров на базе ARM отнять рынок ПК (или даже лэптопов) у Intel и АMD? Нет. Цены на рынке десктопов демократичны, а потребление электроэнергии не представляет проблемы. И потому зацепиться на нём тому, кто производит продукцию на базе ARM, будет непросто.
Вот где системы ARM могут действительно составить конкуренцию x86-й архитектуре, так это в мобильном секторе. Взять хотя бы Lenovo Flex 5G, который работает на однокристальной системе Snapdragon 8cх. Мы не будем приводить всех характеристик самого SoC, лишь упомянем, что он построен на микроархитектуре Cortex-A76, имеет 3 АЛУ, 2 модуля FPU/SIMD, 2 модуля загрузки/хранения, блок передачи управления. Безусловно, такие характеристики указывают на высокую производительность чипа, однако это лишь часть того, что Apple вкладывает в свой CPU следующего поколения. Четырёхъядерный Snapdragon набрал 716 баллов в однопоточных тестах. Это меньше половины того, что показал Apple A13.

И пока Intel снова косячит со своим технологическим процессом, Apple по крайней мере удаётся грамотно проектировать чипы и за счёт этого увеличивать их производительность: лицензированные ядра ARM намереваются бросить вызов Intel Core i5. В то время как AMD выжимает все соки из рабочих станций, ARM завоёвывает позиции на прибыльном HPC (вычислениях на суперкомпьютерах) и на серверном поприще. Очевидно, Intel вытесняют по всем фронтам.



Подробнее..
Категории: Apple , Процессоры , Arm , Смартфоны , Cpu

Самый большой процессор в мире Cerebras CS-1. Разбор

29.01.2021 18:07:40 | Автор: admin
Наверняка вы подумали, что это какой-то очередной кликбейт. Что это за самый большой процессор в мире? Похоже сейчас нам будут рассказывать о процессоре, который на 5 процентов больше других, и то если рассматривать этот процессор только с определенной стороны.И да просмотры и прочтения мы хотим собрать, но

Сегодня мы расскажем вам о процессоре компании Церебро, под названием Cerebras CS-1.И он действительно огромный!


Например, GPU, который считался самым большим раньше это процессор Nvidia V100, а вот новый процессор Церебро. Он почти в 57 раз больше!Площадь самого чипа 462 квадратных сантиметра это почти столько же сколько площадь всей Nvidia 3090, вместе с системой охлаждения и разъемами.







А что вы скажете на то, что этот монстр способен симулировать некоторые физические модели быстрее самих законов физики?Заинтриговали? Что ж тогда присаживайтесь, наливайте чаек. Сегодня будет разбор по-настоящему огромного однокристального процессора!

Итак, что же это за монстр такой и зачем он нужен?Давайте сразу ответим на второй вопрос этот процессор создан для машинного обучения и искусственного интеллекта. Кроме того он сильно расширит возможности для различного сложного моделирования и сможет заглядывать в будущее. Вообще, искусственный интеллект это невероятно интересная и актуальная тема, а ее главные ограничения это слабые вычислительные мощности.А если хотите узнать о реальных проектах с использованием искусственного интеллекта у Илона Маска есть такой в запасе Open UI.

Если вы думали, что закон Мура со своим увеличением количества транзисторов в процессоре каждые 1,5 года это быстро, то посмотрите на потребности в области ИИ, ведь спрос на эти вычисления удваивается каждые 3,5 месяца!

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

Скажем так если вы возьмете двигатель от Ferrari и запихнете ее в старые Жигули, то машина конечно поедет быстрее, но как Ferrari все равно не поедет.Поэтому тут нужен принципиально иной подход,ведь для того? чтобы получить настоящий гиперкар надо взять хорошие тормоза, подвеску, рассчитать аэродинамику; с компьютерами точно также.

Компания Церебро это и сделала они решили разработать свою систему с нуля, то есть вообще все от архитектуры самих процессоров, до системы охлаждения и питания.









Это огромная машина, потребляющая 20 килоВатт, и занимающая треть стандартной серверной стойки, то есть можно размещать по три таких компьютера в одной стойке! А сам чип, по своей сути и предназначению, напоминает серверные GPU от NVIDIA, так что давайте их и сравним. Возьмем Nvidia Tesla V100.





Цифр много, приготовьтесь! Кроме размеров самого кристалла, процессор Церебро обладает четырьмя сотнями тысяч ядер, что в 78 раз больше, чем число ядер на NVIDIA Tesla V100! Количество транзисторов взрывает мозг 1,2 триллиона, против 21 миллиарда у NVIDIA.

А сколько там памяти? 18 гигабайт l2 cache memory прямо на чипе! Это в три тысячи раз больше, чем у V100. Кстати у 3090 от той же NVIDIA, памяти на чипе тоже 6 мегабайт, прямо как у V100. Ну а про ширину полосы пропускания даже говорить страшно у V100 это 300 Гигабит в секунду, а у Церебро 100 ПЕТАбит в секунду. То есть разница в 33 тысячи раз!



А чтобы достичь схожей вычислительной мощности они заявляют, что нужна тысяча 100 карт NVIDIA, что суммарно будет потреблять в 50 раз больше мощности и занимать в 40 раз больше места это очень значительная экономия электроэнергии и свободного пространства.





Это конечно прекрасно цифры поражают. Но как удалось их достичь?

Суть в размере. Чип большой, нет, даже огромный. Именно это позволяет разместить столько всего на одном кристалле. И главное, что связь между элементами мгновенная, потому что не нужно заниматься сбором данных с разных чипов.

Однако, размер это одновременно и главный недостаток Церебро.

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









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

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

Сам же чип собирает TSMC по, вы не поверите, 16 нанометровому техпроцессу. И тут вы можете справедливо возмутится. Как же так? Все уже делают чипы на 5 нм, какой смысл делать на древних 16 нм?

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

Суть в том, что ребята решили, как бы, подстраховаться. Ведь 16 нм техпроцессу уже почти семь лет: детали и тонкости при его производстве отлично изучены. Так сказать уменьшают риски! Но стоит сказать, что уже ведется разработка и тестирование такого чипа на 7 нм, но его выход конечно будет зависеть от спроса на первое поколение! И там цифры просто огромные, только посмотрите на таблицу.





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

Национальная лаборатория энергетических технологий Министерства энергетики США заявила, что CS-1 первая система, которая смоделировала работу более миллиона топливных ячеек быстрее, чем в режиме реального времени.

Это означает, что когда CS-1 используется для моделирования, например, электростанции на основе данных о ее текущем состоянии, она может сказать, что произойдет в будущем быстрее, чем законы физики дадут такой же результат.Вы поняли? С помощью этого ПК можно заглянуть в будущее с высокой точностью, и если нужно подкорректировать и изменить его.И еще, например, в симуляции с 500 миллионами переменных Cerebras CS-1 уже обогнал суперкомпьютер Joule, занимающий 69-е место в рейтинге самых мощных суперкомпьютеров мира. Так что похоже со спросом проблем не ожидается.



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

Из открытых источников мы нашли только что в 2020 году в суперкомпьютерном центре Питтсбурга было куплено 2 компьютера Cerebras CS-1 за 5 миллионов долларов. Но система делается только под заказ и под каждого конкретного клиента, так что цена может варьироваться.

Выводы



Это явно уникальная система. И такого раньше никто не делал! Большинство производителей считают, что гораздо выгоднее и эффективнее наштамповать кучу маленьких процессоров, так как вероятность брака или поломки сильно падает и каждая ошибка сильно дешевле.Разработчики Церебро же решили пойти рискованным путем и, судя по тому, что процессор Cerebras CS-2 уже тестируют, их путь успешен.

И если все что они заявили сбудется, то нас ждет абсолютно новая эра серверных вычислений, невероятные возможности для создания компьютерных моделей, новые мощности искусственного интеллекта. Нет сомнений, что и гиганты рынка, такие как Nvidia, Intel, Google, посмотрев на удачный опыт Церебро займутся разработкой своих огромных однокристальных систем.А вы только представьте, что будет если совместить это с квантовыми вычислениями, о которых мы недавно делали разбор? Ух!

Будем следить за развитием технологий, и продолжим дальше делать для вас такие интересные обзорные материалы про самые современные достижения!



PS. Кстати, лайк если поняли пасхалку в Церебро ведь решетка радиатора выполнена в форме специальной сетки, которая используется в компьютерном моделировании для расчетов. Отсылка к предназначению Церебро!
Подробнее..

Новый глава Intel вернул с пенсии ведущего архитектора Nehalem

22.01.2021 14:05:41 | Автор: admin


Новый генеральный директор Пэт Гелсингер до своего ухода из Intel работал в компании 30 лет и поднялся до ранга CTO, потом ушёл. Теперь его возвращение и назначение на должность CEO считают признаком выздоровления Intel. Возможно, компания сможет переломить тренд и вернуться на лидирующие роли в бизнесе. Однако нужен кардинальный технологический прорыв. А кто для него подойдёт лучше, чем бывший технический директор Пэт Гелсингер, главный технарь в компании?

Гелсингер с первых дней оправдывает ожидания, которые на него возлагают. Он начал с того, что возвращает на работу в компанию ведущих инженеров и архитекторов CPU, своих бывших коллег.

Хотя Гелсингер официально вступит в должность только 15 февраля, но его возвращение уже вызвало ажиотаж среди сотрудников научно-исследовательских команд Intel, пишет AnandTech.

Последняя новость возвращение на работу старшего научного сотрудника Гленна Хинтона, который был ведущим архитектором ядра Nehalem, а последние три года провёл на пенсии. Другие ведущие архитекторы Nehalem Ронак Сингал и Пер Хаммерлунд. Первый и сейчас работает в Intel над процессорами следующего поколения, а второй уже пять лет работает в Apple.


Анонс Nehalem на стенде 12-летней давности

Nehalem микроархитектура процессоров компании Intel, представленная в IVкв. 2008года, для ядра Bloomfield в исполнении LGA 1366 и для ядра Lynnfield в исполнении LGA 1156.

Микроархитектура построена на базе Core, но с кардинальными изменениями, включая новый встроенный контроллер памяти, новую шину QPI вместо FSB, возможность встроить графический процессор, кэш 3-го уровня и поддержку Hyper-threading.


Микроархитектура Intel Nehalem в 4-ядерной реализации

Гленн Хинтон тоже ветеран Intel с 35-летним опытом работы (профиль на LinkedIn). Кроме роли архитектора Nehalem, он был ведущим разработчиком микроархитектуры Pentium 4, одним из трёх ведущих архитекторов Intel P6 (из которого вышли Pentium Pro, P2 и P3) и, в конце концов, одним из создателей базовой архитектуры Intel Core, которая до сих пор находится на переднем крае технологий Intel.

Он также ведущий архитектор Intel i960 CA, первого в мире суперскалярного микропроцессора. На Хинтона зарегистрировано более 90 патентов из восьми микропроцессорных проектов, в которых он участвовал. Хинтон ещё более десяти лет работал в Intel после выхода Nehalem, но именно микроархитектура Nehalem везде упоминается как его главное достижение.

На своей страничке в LinkedIn Хинтон пишет, что будет работать над захватывающим проектом высокопроизводительного процессора.



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



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

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

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

Подробности о новом проекте пока не разглашаются. Мы не знаем, что это такое. Нет уверенности даже, что новый CPU основан на архитектуре x86.

Intel сейчас оказалась в крайне тяжёлой ситуации. Новый процессор Apple M1 на микроархитектуре ARM практически не уступает по производительности топовым процессорам Intel, а по энергоэффективности превосходит их.



Впервые за 15 лет компания, не имеющая лицензии x86, создаёт микропроцессор для потребительского рынка, который вполне может конкурировать с чипами x86. Если Apple сохранит или улучшит свои позиции по отношению к Intel и AMD, это заметят и другие компании с лицензиями на ARM. Nvidia, которая купила ARM в ожидании одобрения регулятора, безусловно, заметит это. Если ARM может превзойти x86, то вся экосистема WinTel уязвима так, как этого не было с самого начала эпохи персональных компьютеров, пишет Stratechery. Падение Intel от короля индустрии к наблюдателю началось уже в 2005 году: несмотря на то, что у Intel имелась лицензия ARM для производства XScale, компания не захотела сосредоточиться на энергоэффективности, а предпочла диктовать дизайн клиентам, таким как Apple, рассматривая их новый iPhone, вместо того, чтобы попытаться приспособиться под них (как это сделала TSMC).



Так что новый процессор Intel тоже может быть основан и на архитектуре ARM. Так или иначе, но реальные результаты работы увидим только через 3-5 лет.

Известно, что в Intel несколько групп разработки работает над разными проектами. Мы видим постоянное обновление архитектуры Skylake, а также первые итерации ядра Cypress Cove, которое включает 10-нм ядро Ice Lake (портировано на 14-нм) и графику из Tiger Lake.





Это реальные продукты, которые выходят на рынок.

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

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

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


Пэт Гелсингер во времена работы техническим директором Intel демонстрирует процессоры Intel Itanium 2

Таланты хотят работать с талантами, а грамотные инженеры с другими грамотными инженерами. Мы уже сейчас видим, что технический бэкграунд и авторитет Гелсингера заставляет вернуться с пенсии архитектора CPU для работы над новыми проектами и это ещё до того, как Гелсингер официально заступил в должность.
Подробнее..

Софт пожирает мир. Закат универсальных CPU

24.03.2021 12:04:07 | Автор: admin

Tesla по сравнению с другими автомобилями сегодня примерно как первый смартфон среди кнопочных телефонов в 2006 году

Десять лет назад Марк Андриссен опубликовал в WSJ статью Почему софт пожирает мир ("Why Software Is Eating The World"). Он утверждал, что произошёл фундаментальный сдвиг в важности программного обеспечения для человеческой цивилизации.

Раньше компьютерные компании IBM, Oracle или Microsoft продавали компьютеры и софт в качестве инструментов. Теперь появилось поколение компаний, которые создают программное обеспечение и используют его сами, чтобы войти в другую отрасль и изменить её. Uber и Airbnb не продают программное обеспечение таксопаркам и гостиничным компаниям, а используют его сами. Tesla и Amazon показывают удивительный рост скорее как софтверные компании, а не как магазин и производитель автомобилей. Трансформируя целые отрасли экономики, софт пожирает мир.

В то же время персональный компьютер теряет статус универсальной технологии. Это два параллельных процесса, которые происходят на наших глазах.

Понятие универсальной технологии


В экономике есть теория универсальных технологий (general-purpose technology, GPT). Это многоцелевые технологии, которые применяются сразу во многих отраслях и меняют всю экономику целиком, потенциально вызывая и социальные изменения в обществе. Примеры таких технологий паровой двигатель, железная дорога, электричество, электроника, автомобиль, компьютер, интернет. Подробнее о GPT см. научную работу "General purpose technologies Engines of growth?" (Journal of Econometrics, Volume 65, Issue 1, January 1995, pages 83-108).

Например, автомобиль. Целые отрасли экономики трансформировались под влиянием грузоперевозок и массовой автомобилизации. Скажем, сеть магазинов Walmart основана исходя из того факта, что у большинства людей есть личные автомобили. Бизнес полностью основан на двух технологиях: 1) грузоперевозки; 2) личные автомобили. И речь идёт о розничных магазинах, а не о транспортной компании.


Walmart

Или электричество. также сильно трансформировало целые отрасли экономики и изменило общественный уклад.

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

Софт пожирает мир


Интересно посмотреть на конкретные отрасли, которых были дестабилизированы программным обеспечением в прошлом и что произошло дальше. Одной из первых стала музыкальная индустрия, затем книгоиздательство. Хотя в фундаментальном смысле эти рынки по-прежнему контролируют музыкальные лейблы и книжные издательства, а не IT-компании, поскольку музыка, книги всё это слишком мелкие, нишевые рынки по сравнению с IT.

В телевидении и кинобизнесе технологии (а теперь и пандемия) тоже сломали старую модель и изменили все правила, но в целом вопросы регулируются внутренними концернами, а не IT-компаниями, потому что для IT они не являются стратегическими вопросами первостепенной важности. Контент больше не правит миром.

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

Закат универсальных процессоров


Согласно теории GPT, универсальная технология может столкнуться с проблемами в конце своего жизненного цикла: в процессе замедления прогресса другие технологии вытесняют её в определённых нишах. По мнению учёных Нейла Томпсона (MIT) и Свеньи Спануты (ETH Zurich), сейчас подобное происходит с универсальными компьютерами, см. статью "The Decline of Computers as a General Purpose Technology" (Communications of the ACM, March 2021, Vol. 64 No. 3, Pages 64-72, doi: 10.1145/3430936).

Сегодня мы наблюдаем такой переход. Прогресс в CPU замедляются, и поэтому приложения переходят на специализированные процессоры. Исследователи подчёркивают: речь не о том, что компьютеры в целом разучатся делать какие-то вычисления, а именно об окончании экономического цикла GPT. На его место приходит фрагментарный цикл, когда экономика подталкивает пользователей к специализированным вычислительным платформам на процессорах специального назначения. Этот процесс угрожает подкрепляющему циклу технологического развития (см. рис. 1).


Рис. 1. Исторический подкрепляющий цикл технологического развития (а) заменяется фрагментарным циклом (b)

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

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

На протяжении десятилетий человечество извлекало пользу из этого благотворного экономического цикла GPT по мере прогресса универсальных процессоров. Рынок вырос от нескольких дорогостоящих мейнфреймов для военной, космической и других областей до более чем двух миллиардов универсальных компьютеров. Этот рост подпитывал увеличение инвестиций в улучшение процессоров. Например, Intel за последнее десятилетие потратила $183 млрд на НИОКР и новые производственные мощности. Это принесло огромные дивиденды: по некоторым оценкам, производительность процессоров с 1971 года увеличилась примерно в 400 000 раз.

Альтернатива специализированные процессоры. Поскольку универсальный CPU должен хорошо выполнять множество различных вычислений, это приводит к неоптимальным конструктивным компромиссам. Штраф за производительность от этого компромисса особенно высок для специализированных приложений, которые можно сильно распараллелить. Например, специализированные интегральные схемы ASIC или части гетерогенных микросхем показывают лучший результат для специализированных приложений, поскольку железо адаптировано к вычислениям.

Насколько сильно специализация отражается в конструкции процессора видно в сравнении типичных CPU и GPU.

Тип Модель Параллельных вычислений Скорость Полоса памяти Доступ к кэшу L1
CPU Intel Xeon E5-2690v4 28 2,63,5 Ггц 76,8 ГБ/с 512 тактовых циклов
GPU Nvidia P100 3584 1,1 ГГц 732 ГБ/с 80 тактовых циклов

GPU работает на меньшей тактовой частоте, но в каждом такте может выполнять в 100 раз больше параллельных вычислений, чем CPU. Это делает его намного быстрее для сильно распараллеленных задач. Например, приложения для машинного обучения (AlexNet и Caffe) выполняются в 35+ раз быстрее на GPU, чем на CPU, по данным Nvidia.

В то же время у специализированных процессоров существенные недостатки: они запускают только ограниченный набор программ, их труднее программировать и часто они требуют для управления универсального CPU. Для универсальных процессоров постоянные затраты (единовременные инженерные затраты, NRE) распределяются по большому количеству микросхем. В отличие от них, у специализированных процессоров гораздо меньшие рынки сбыта и, следовательно, более высокие постоянные затраты на каждый чип. Для понимания, общая стоимость разработки и производства специализированного CPU на передовых технологиях составляет около $80 млн, на технологиях более старого поколения $30 млн.

За последние десятилетия специализированные процессоры (кроме GPU) использовались только в узких нишах: военные приложения, игры, майнинг. Но ситуация начинает меняться. По мнению исследователей, на сегодняшний день все основные вычислительные платформы мобильные устройства, Интернет вещей и облачные/суперкомпьютерные вычисления переходят на специализированные процессоры. Разве что рынок ПК остаётся на более универсальных CPU.

Отраслевые эксперты группы International Technology Roadmap for Semiconductors (ITRS), которая координирует технологические усовершенствования для поддержания закона Мура, в своём докладе косвенно одобрили этот сдвиг в сторону специализации CPU. Они признали, что традиционный универсальный подход с уменьшением размера транзисторов больше не должен определять требования к конструкции, а её следует адаптировать к конкретным приложениям.

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


Рис. 2. Ежегодное улучшение результата SPECInt в новых моделях CPU (a) и ежегодное снижение цен с поправкой на производительность (b), источники: 1, 2

Из-за коварных законов физики растёт стоимость производства микросхем. В 2017 году стоимость строительства и оснащения завода по производству микросхем последнего поколения превысила $7 млрд.


Рис. 3. Стоимость нового завода (a) и количество производителей, освоивших передовой техпроцесс по производству микросхем в данном году (b)

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

Но с нынешней скоростью улучшения CPU в районе 8% в год ситуация кардинально изменяется: инвестиции в специализированные CPU становятся крайне выгодными.

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

  • становится сложнее финансировать инновации,
  • новые CPU не такие впечатляющие, по сравнению со старыми
  • меньше новых пользователей (многие пропускают апгрейд на новое поколение CPU, ожидая следующего)
К сожалению, депрессивные эффекты тоже подкрепляют друг друга, как и положительные эффекты в момент расцвета GPT.

Если текущие тенденции сохранятся, то к 20262032 годам (в зависимости от темпов роста рынка) передовые полупроводниковые производства сможет поддерживать только один производитель-монополист, а ежегодные постоянные затраты на строительство одного нового объекта для каждого размера узла будут равны ежегодному доходу отрасли. Чтобы предотвратить такой мрачный сценарий, уже через 10 лет производители будут вынуждены резко замедлить разработку новых технологических процессов и снизить финансирование, что ещё больше замедлит прогресс в универсальных CPU, считают исследователи.

Вывод


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

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

В любом случае, программное обеспечение это новая форма базовой грамотности современного человека. Если в стране или в компании низкий уровень грамотности, это невозможно компенсировать ничем другим. Всё теперь работает на софте.



На правах рекламы


Серверы для размещения сайтов и разработки это про наши эпичные! Все серверы из коробки защищены от DDoS-атак, скорость интернет-канала 500 Мегабит, автоматическая установка удобной панели управления VestaCP для размещения сайтов и даже автоматическая установка Windows Server на тарифах с 4 ГБ ОЗУ, 2 vCPU и 20 ГБ дискового пространства или выше. Лучше один раз попробовать ;)

Подробнее..

Intel Pentium Pro 25 лет ближайший общий предок

11.11.2020 14:20:14 | Автор: admin

Возможно, мне следовало написать эту статью месяцем раньше, ведь именно 1 ноября 1995 года увидел свет новейший процессор Intel для серверов и рабочих станций Pentium Pro, со временем ставший легендой. Если исходить из названия, можно подумать, что это всего лишь продвинутая версия старого доброго Пентиума, на тот момент только начавшего входить в мейнстрим-сегмент.

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

Причина тому проста: все это время линейка развивалась параллельно классическому Pentium. Да, позже были Pentium II Xeon, Pentium III Xeon, далее просто Xeon, но все они основывались на той же микроархитектуре, что и современные им настольные процессоры, не отличаясь от них принципиально.

Пожалуй, только Itanium был столь же оторван от народа. Хотя топовые настольные компьютеры (особенно брендовые) на базе этих процессоров выпускались, в домашнюю среду попадали они нечасто, и даже не из-за цены. Большинство из них работали под управлением Windows NT или OS/2, не слишком востребованных у простых пользователей.

Ставить же Windows 95 не имело большого смысла Pentium Pro был первым процессором, оптимизированным для выполнения именно 32-битного кода, и в 16-битных приложениях показывал весьма скромные результаты. Впрочем, тестов в тексте не будет будет много букв и красивых картинок.

Немного мифологии


Пожалуй, в этом месте стоит отвлечься и вернуться в начало нулевых, когда герой статьи был уже немолод (это сейчас мы можем спокойно лет 5-7 просидеть без замены процессора, а тогда средний срок актуальности платформы составлял 2-3 года). Примерно в это время я впервые услышал о Pentium Pro и немало удивился. Крутой по описанию процессор показался мне странным, ведь на тот момент я не знал всей последовательности истории его создания.

У него не было поддержки MMX, платформы для него поддерживали только FPM DRAM (Fast Page Mode Random Access Memory) и EDO DRAM (Extended Data Out Random Access Memory). Для меня тогда это были просто симмы, про DIMM c FPM и EDO чипами я тогда не знал. Такие платформы не умели работать с дисковыми накопителями даже в режиме UDMA/33. Хотя все это было у обычных (ключевое слово поздних) Пентиумов. Про отсутствие AGP я уже молчу.

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

Пачка фактов



Прежде чем обратиться к истории, взглянем фактам о нашем герое в лицо.

Официальные спецификации:

  • Частота от 150 до 200 МГц. Существовали также инженерные образцы на 133 МГц и овердрайв (о нем будет сказано отдельно) на 333 МГц.
  • Частота системной шины 60 МГц (на моделях 150 и 180 МГц) или 66 МГц (все остальные).
  • Кэш L1 16 КБайт.
  • Кэш L2 256, 512 или 1024 КБайт, работающий со скоростью ядра.
  • Техпроцесс 0.6 (133 МГц), 0.5 (150 МГц) или 0.35 (166-200 МГц) мкм для ядра, 0.5 (256 КБайт) или 0.35 (512 КБайт) для кэша L2.
  • Разъем Socket 8 (387 контактов SPGA, часть контактов расположена в шахматном порядке), керамический или пластиковый (для модели 200 МГц с 1024 КБайт кэша) корпус.

Но это лишь сухие цифры. Давайте пройдемся по более занимательным фактам:

  • На данный момент (ноябрь 2020 года) это физически самый большой x86-процессор. Размеры корпуса составляют аж 63х68 мм. Это больше, чем Intel Xeon Scalable и AMD EPYC/Ryzen Threadripper.
  • Это первый х86-процессор с полноскоростным L2-кэшем, связанным с ядром отдельной шиной (Pentium 60/66 формально имели полноскоростной кэш, но он располагался на системной шине вне корпуса процессора).
  • Это первый х86-процессор со встроенным (в корпус) L2-кэшем.
  • Это первый х86-процессор с мультичиповой компоновкой: в одном корпусе были расположены кристаллы ядра и кэша, причем в топовой версии использовалось 2 кристалла кэша.
  • Не совсем про процессор, но про чипсет для него: первая х86-система с многоканальной оперативной памятью (чипсеты 450KX/GX поддерживали FPM память с 2 или 4-way Interleave).
  • Первый х86-процессор с внеочередным исполнением команд (Out-of-order execution).
  • И наконец, самое важное: это первый x86-процессор Intel с RISC-ядром и трансляцией нативных команд х86 в микрокоды (компания NexGen на год опередила Intel, представив свой Nx586 в 1994 году).

За исключением микроархитектуры NetBurst (Pentium 4/Pentium D) и потомков Atom, все остальные х86-процессоры Intel являются прямым (хотя и очень серьезным) развитием именно ядра P6, примененного в Pentium Pro. Этот факт вместе с последним пунктом списка и позволяют назвать его общим предком большинства современных CPU производства Intel.

Крупные инновации были и после: многоядерность, переход на 64-битную архитектуру. Но ключевыми моментами, давшими х86 архитектуру доступ в сегмент тяжелой техники серверов и рабочих станций, был именно переход на внутреннее RISC-ядро и внедрение Out-of-order execution.

Основное блюдо история


Одна из задач истории развеять мифы. Этим мы и займемся. Итак, на дворе осень 1995 года. 486 процессор еще не устарел последние новые процессоры от Intel (486DX4-100) и чипсеты вышли полтора года назад, AMD обновила свой 5х86 (не путать с К5, который был уже аналогом Penitum!) совсем недавно. Многие еще используют 386 и более ранние машины. Pentium кажется вершиной прогресса суперскалярная архитектура, 64-битная внешняя шина. Только в июне вышла 133 МГц модель, настоящий Hi End. Никакого еще MMX, процессоры с ним выйдет только в 1997 году.

Топовый чипсет на тот момент 430NX (Neptune, 4-5 чипов) поддерживает до 512 Мбайт FPM памяти с контролем четности, но без механизма коррекции ошибок ECC, позволяет объединить на одной плате до двух процессоров, поддерживает шины PCI и EISA (опционально). И при этом все еще не имеет собственного контроллера IDE (наверное, не так и страшно все равно серьезные машины делались со SCSI).

Лишь в январе 1995 года появился чипсет для Pentium среднего уровня 430FX (Triton I, 2 чипа, до 128 МБайт FPM/EDO памяти, из них только 64 кэшируемых, IDE максимум PIO4 со скоростью до 16.6 МБайт/сек). И все же, цены на Pentium-машины еще очень высоки.

Характеристики и цены


И вот 1 ноября Intel являет свету нашего героя. Частоты вплоть до поражающих воображение 200 МГц (были представлены вариант на 150, 180 и 200 МГц с 256 КБайт кэша), кэш переехал с материнской платы в корпус процессора (но, пока еще на отдельном кристалле). Быстрее был только Digital (DEC) Alpha 21164, который успел достичь невероятных 333 МГц в октябре того же года, но и цена на него была намного выше.

Это был уже настоящий RISC для рабочих станций высочайшего уровня. Но и у Pentium Pro цены были отнюдь не для эконом-класса от $974 до $1325 в партиях от 1000 штук. Появившиеся позже модели с большими объемами кэша стоили еще дороже вплоть до $2675 за модель с 1 МБайт кэшем.

Не менее интересными были и сопутствующие чипсеты 450KX (Mars) и 450GX (Orion). Mars поддерживал 2 процессора и до 1 ГБайт двухканальной FPM памяти с EСС и был рассчитан на рабочие станции. Orion метил на серверный рынок и поддерживал уже 4 процессора (официально) и до 8 ГБайт оперативной памяти в четырех каналах.

Оба чипсета могли работать с памятью в многоканальном режиме, налагая при этом определенные ограничения на подбор памяти для активации двухканального режима требовалось 4 SIMM или 2 DIMM модуля, для четырехканального 8 SIMM или 4 DIMM.


Обратите внимание, что DIMM не значит SDRAM, в таком формате бывали и исконно симмовые FPM. Как видите, характеристики более чем на уровне из новомодных фишек не было лишь поддержки EDO, и то фактически EDO память работает как минимум на части плат, естественно с производительностью обычной FPM. Таким образом, миф об отсталости платформы в части поддержки памяти и внешних шин, на мой взгляд, развеян.

Чипсеты: корпорация монстров


Сами чипсеты были монструозны стандартный комплект включал в себя не привычных два чипа, а целых восемь. Пересчитаем? Мост шины PCI раз, контроллер памяти из двух микросхем (DRAM Control и Data Path) два и три, четыре чипа физического интерфейса памяти (уже 7) и классический южный мост PIIX восемь! Такой комплект, например, размещался на первой плате, анонсированной Intel для новых процессоров, Intel Performance/AU Aurora.

Это была одна из первых (по моим подсчетам вторая после Intel Advanced/ATX Thor на i430FX) плат в новом форм-факторе ATX. На полноразмерную плату все это добро еле поместилось, оставив место только для четырех слотов памяти. И это стандартный комплект. Каждый контроллер памяти набора 450GX поддерживал до 4 ГБайт памяти, для поддержки полного объема нужно было добавить еще один контроллер и физические интерфейсы для него еще плюс шесть микросхем. Итого четырнадцать!

Некоторые компании, вскоре представили сервер с шестью и даже восемью процессорами ALR Revolutoin 6x6 (он же продавался под марками Unisys и Gateway 2000), Axil Northbridge, NCR OctaScale. NCR и Corollary представили свои наборы микросхем (возможно, расширений для чипсетов Intel пока мне не удалось найти информацию о них) для реализации восьмипроцессорных машин.

Причем Corollary представила знаменитый Profusion, который во многих источниках путают с Intel 450NX это разные продукты. 450NX поддерживал до четырех процессоров Pentium II/III Xeon, Profusion до восьми. К моменту выхода Xeon Corollary уже принадлежала Intel, но это уже совсем другая история.

Апдейты


В 1996 году подоспело обновление появились модели с 512 КБайт кэша и новый чипсет Intel 440FX, замена прежнего 450KX. Принципиальных новшеств в нем было всего два: поддержка EDO/BEDO памяти и шины USB (реализована не во всех платах), при этом контроллер памяти лишился многоканального режима работы. Но важнее было другое сниженная стоимость плат на основе нового набора, ведь он размещался всего в трех чипах:

  • Data Bus Accelerator,
  • PCI and Memory Controller,
  • Южный мост PIIX3.

Большим серверам обновление не полагалось (и не очень нужно было!) 450 чипсет в слегка обновленном варианте NX достался и новым Xeon.

Обратите внимание, что функционально новый 440FX оказался близок к верхнеуровневому 430HX для Pentium. В то время как более простой 430VX получил поддержку SDRAM, но производительности ему это не прибавило. В апреле того же года компания VIA Technologies объявила о своих планах по выпуску чипсета Apollo (690) с поддержкой SDRAM, но известна лишь одна модель платы, выпущенная на нем, не увидевшая крупносерийного производства. Мне пока не удалось найти даже ее фото.

О поддержке Pentium Pro заявляли и другие, многочисленные в то время, производители чипсетов, но все эти наборы микросхем были выпущены уже после анонса Pentium II, и все платы на них производились уже с разъемом Slot1. Причина проста: Pentium Pro так и остался в верхнем сегменте рынка и более бюджетные наборы чипов для него не были интересны целевой аудитории.

Пришествие Pentium II


И вот, грянул богатый на события 1997 год. В январе появились новые Pentium MMX для мультимедийных ПК и новый чипсет 430TX (с более адекватной поддержкой SDRAM, чем VX, но все равно не умеющий кэшировать более 64 МБайт памяти, что однозначно указывало на его нишу). Также процессоры лишились поддержки SMP (некоторые источники утверждают, что она все же имелась в процессорах с частотой до 166 МГц).


Спустя несколько месяцев, в мае, увидел свет и новый Pentium II (ядро Klamath) с поддержкой MMX и несколько более высокими частотами. Что немаловажно, он демонстрировал куда более высокую производительность при выполнении привычного 16-битный кода. При этом для снижения стоимости он получил новую компоновку, картридж SECC, внутри которого располагалась печатная плата с распаянным ядром процессора и микросхемами кэш-памяти.

Объем кэша сохранили на уровне 512 КБайт, как у последних на тот момент Pentium Pro, но скорость урезали до половины частоты ядра. Кэшируемый объем ОЗУ составлял 512 МБайт в первых Pentium II против 4 ГБайт в Pentium Pro и более поздних Pentium II на ядре Deschutes.

Ограничена в новом процессоре и поддержка многопроцессорных конфигураций максимальное количество процессоров в системе равнялось двум. Также от Pentium Pro в наследство он получил только один чипсет 440FX. С одной стороны, казалось, что песенка Pentium Pro спета, с другой в его истории оставалась какая-то недосказанность.

В августе 1997 года Intel выпускает сразу два связанных продукта, отнюдь не предназначенных для совместного использования. Первым был чипсет 440LX, принесший полноценную поддержку SDRAM (поддержка EDO осталась, но максимальный объем памяти уменьшился вдвое до 512 МБайт!), быстрых дисков UDMA/33 и новую шину для видеокарт AGP.

С нашим героем теоретически работать он мог (шина обновилась незначительно 66 МГц GTL+ вместо 60/66 МГц GTL), но практически не было выпущено плат с разъемом Socket 8, не была реализована производителями плат программная поддержка Pentium Pro с переходником Slot1-Socket8. Это сделали гораздо позднее энтузиасты ретросистем.

Встречайте: Pentium Pro


Вторым продуктом августа был новый Pentium Pro! Тот самый вожделенный многими вариант на 200 МГц с 1 МБайт кэша L2. Он получил новый пластиковый корпус, содержащий целых три чипа, два из которых были кристаллами с 512 КБайт кэш-памяти. Он же стал самым горячим х86-процессором на тот момент целых 47 Вт TDP! Поддержки MMX при этом он не получил.

Таким маневром Intel развела процессоры по нишам универсальный вариант Pentium II, бюджетный Pentium MMX (после его сменил Intel Celeron) и серверный Pentium Pro (о рабочих станциях речи почти не шло во многих случаях Pentium II стал предпочтительнее, лишь когда не хватало 512 МБайт ОЗУ, он не мог заменить предшественника).

Таким образом, наш герой оставался королем х86-мира еще почти год до апреля 1998 года, когда появился его настоящий наследник Pentium II Xeon с полноскоростным кэшем (от 512 КБайт до 2 МБайт), более быстрой 100 МГц шиной и, конечно, новыми чипсетами. Но финал истории Pentium Pro еще не сыгран.

Лицевая сторона процессора Intel Pentium II OverDrive
Оборотная сторона процессора Intel Pentium II OverDrive
12 июня 1997 года был запущен в эксплуатацию суперкомпьютер ASCI Red, базировавшийся на множестве серверов с процессорами Pentium Pro, объединенных в кластер. Спустя время, 10 августа 1998 года, появился последний процессор для разъема Socket 8, созданный специально для обновления этой системы. Ему дали имя Pentium II OverDrive, и это был последний OverDrive, выпущенный Intel.

Процессор был выпущен ограниченной серией, часть которой поступила в широкую продажу. В основе лежало ядро Deschutes, работавшее на частоте 333 МГц, компанию ему составили 512 КБайт полноскоростного кэша от Pentium II Xeon. Это было специализированное компромиссное решение с очень оригинальной компоновкой на небольшой плате размещались ядро, кэш и модуль VRM, понижавший питание со стандартных для Pentium Pro 3.1-3.3 В до 2.0 В, необходимых для Deschutes.

Снизу платы размещался пластиковый ответный коннектор с 387 ножками. От Pentium II он унаследовал поддержку инструкций MMX и ограничение на максимальное число процессоров в одной системе, но заказчику этого было достаточно ASCI Red состоял из двухпроцессорных модулей. Именно на этом заканчивается история Pentium Pro как платформы.

В руках коллекционера


Мне сложно сказать, когда герой этой статьи перешел из разряда устаревшей техники в область интересов коллекционеров ретро-техники. Свою коллекцию я начинал в далеком 2008 году. Возможно, кому-то из вас известно имя Digital Vintage. Первоначально я занимался исключительно мобильной техникой, а благодаря сотрудничеству с Selectel появилась возможность разместить и полноразмерные экспонаты.


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

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


Лишь этим летом мне досталась Венера плата Intel Performance/VS Venus, а чуть позже и ранняя Аврора Intel Performance/AU Aurora, упомянутая ранее. На их основе собраны две машины (на радостях я придумал собственный самосбор-бренд SERVERGHOST в честь моего первого домашнего сервера). Оба компьютера собраны из аутентичных компонентов тех лет и укомплектованы соответствующим программным обеспечением притворяются рабочим местом разработчика под Windows NT и OS/2 Warp соответственно. Также для фотосессии удалось одолжить у коллеги по увлечению редчайший Pentium II OverDrive.

Характеристики двух ретромашин:

Ранняя машина SERVERGHOST Constellation P6/SE Big Tower:

  • Intel Pentium Pro 180 МГц с 256 КБайт L2 кэша.
  • Intel Performance/AU Aurora на основе чипсета Intel 450KX.
  • 128 МБайт ОЗУ (4х32 МБайт SIMM).
  • Adaptec AHA-2940U контроллер SCSI.
  • 2.1 ГБайт жесткий диск Quantum SCSI.
  • Видеокарта 4 МБайт Matrox Millennium.
  • Звуковая карта на чипе Yamaha.
  • Сетевая плата Intel Pro/100 PCI.
  • 8x CD-ROM LG со слотовой загрузкой.
  • Установлена OS/2 Warp 3.0 (Connect), среда разработки Sybil 2.0 и набор ПО на каждый день.

Поздняя машина SERVERGHOST Constellation P6/SE Desktop:

  • Intel Pentium Pro 200 МГц с 256 КБайт L2 кэша.
  • Intel Performance/VS Venus на основе чипсета Intel 440FX (также известна как Intel VS440FX).
  • 128 МБайт ОЗУ (4х32 МБайт SIMM).
  • BusLogic Flashpoint LT контроллер SCSI.
  • 4.3 ГБайт жесткий диск Seagate SCSI (7200 rpm).
  • Видеокарта 4 МБайт Matrox Millennium.
  • Звуковая карта Creative Sound Blaster 16 PnP ISA
  • Сетевая плата Intel Pro/100 PCI.
  • 12x CD-ROM Vuego.
  • Установлена Windows NT 4.0 Workstation, среда разработки Delphi 3 и набор ПО на каждый день.

В планах сборка двухпроцессорной машины (плата в процессе поиска) и приобретение четырехпроцессорного сервера или, если повезет, ALR 6x6.

Естественно, о каком-либо повседневном использовании этих машин речи уже давно не идет выйти в интернет можно, но доступны для просмотра лишь немногие сайты, особенно если использовать аутентичное ПО. Главную проблему создает обилие JavaScript и современные алгоритмы шифрования, которые Netscape 1996 года не поддерживает.


Офисное ПО тех лет вполне функционально, но, конечно, не имеет никаких облачных функций, 3D-графика в зачаточном виде, просмотр видео доступен, но с большими ограничениями тот же DivX или MPEG-2 эти машины не вытягивают. А вот музыку слушать можно, даже параллельно с выполнением других задач. В серверном варианте вполне можно реализовать веб-сервер, но эффективен он будет, пожалуй, только при размещении веб-сайта в ретростиле и с минимумом динамических страниц.

Вместо заключения


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

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

Подробнее..

Заставить ваш смартфон летать Samsung представила 5-нм процессор

16.11.2020 20:18:08 | Автор: admin

На днях Samsung раскрыла характеристики 5-нм процессора для мобильных устройств нового поколения. Процессор назван Exynos 1080. CPU поддерживает работу с ИИ и камеры разрешением до 200 Мп. Новый процессор увеличит производительность мобильных устройств и минимизирует возможные задержки при загрузке контента.

Характеристики нового процессора


Характеристики Exynos 1080
Photo: Samsung.com


  • Количество ядер 8.
  • 3-кластерная архитектура по принципу 1+3+4
    • 1х ARM Cortex-A78 c частотой 2,8 Ггц;
    • 3 х ARM Cortex-A78 с частотой 2,6 ГГц;
    • 4 х энергоэффективных Cortex-A55 с частотой до 2 Ггц.
  • Формат оперативной памяти LPDR5 или LPDR4х.
  • +50% рост производительности в одноядерном режиме.
  • Видеочип: 10-ядерный графический ускоритель ARM Mali-G78 MP10.
  • Доступно аппаратное декодирование видео 4К HDR10+ на скорости до 60 кадров в секунду.
  • Поддержка камер с разрешением до 200 MP.
  • Разрешение дисплея WQHD+.
  • Встроенный 5G-модем с поддержкой сети двух типов: mmWave и в диапазоне до 6 ГГц.
  • Bluetooth 5.2 со скоростью до 2 Мбит/с и Wi-Fi 6 со скоростью до 7 Гбит/с.
  • Ресиверы спутниковых систем: GPS, ГЛОНАСС, Beidou и Galileo.


Что еще известно


Samsung проводила презентацию нового чипа совместно с китайской компанией Vivo Communication Technology. Вероятно, первый смартфон на базе Exynos 1080 выйдет под брендом Samsung или Vivo. Возможно, им станет в январе будущего года Samsung Galaxy S21.


Впервые о наличии у южнокорейского гиганта чипа нового поколения стало известно в октябре 2020 года. Тогда же представители компании раскрыли его рейтинг AnTuTu. Благодаря новому процессору устройство на базе Exynos 1080 набрало 650 тыс. баллов, это выше, чем у Snapdragon 865 и Snapdragon 865 Plus флагманских восьмиядерных процессоров. Чип позиционируется как основа для топовых смартфонов и планшетов. Известно, что в компании работают еще над одним процессором будущего Exynos 2100.

На данный момент CPU от Samsung стал третьим в мире мобильным процессором, выполненным по 5-нм техпроцессу. Первых представителей показала Apple. В сентябре мир увидел чип A14, дебютировавший для IPad Air 4. Спустя месяц показан аналогичный чип в составе новых iPhone 12.

В конце октября свой чип показала Huawei процессор Kirin 9000 для флагманского телефона Mate 40. Смартфон стал первым среди Android-устройств обладателем 5-нм чипа.

Подробнее..

Перевод Самые разгоняемые процессоры, которые запомнились надолго

19.11.2020 12:06:35 | Автор: admin

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

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

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

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

Intel Pentium MMX 166



Дата выпуска: 8 января 1997 года

Стандартная тактовая частота: 166 МГц

Разгон: 207 266 МГц (~54%)

Pentium MMX появился во время, когда процветали тёмные делишки розничных продавцов, на которые производители процессоров x86 ответили блокировкой верхней границы множителей. Поэтому во многих MMX для разгона использовалось повышение частоты шины. Разлоченные процессоры MMX предоставляли оверклокерам больше возможностей, и самым главным среди них был MXX 233, хотя его цена (594 долларов) для многих была неподъёмной.

Более выгодным предложением, при своей цене 407 долларов, был MMX 166, а при установке на материнскую плату с чипсетом 430TX, имевшую стандартную скорость шины 75 МГц, можно было достичь 225 или 266 МГц (множитель 3 или 3,5). Чтобы превзойти порог в 200 МГц, процессорам MMX 166 с заблокированным множителем нужно было переставить перемычку для переключения на 83 МГц (2,5 * 83 = 207 МГц) (если такая возможность имелась), однако стабильность и нагрев при такой скорости шины были намного более проблемными, как и поиск качественной EDO/SDRAM RAM, необходимой для работы с этой частотой.

Intel 486DX2-40



Дата выпуска: март 1992года

Стандартная тактовая частота: 40 МГц и 50 МГц

Разгон: 66 МГц (~65%)

В процессорах P24 DX2 486 появился множитель тактовой частоты процессора, удваивающий скорость системной шины, а саму частоту системной шины можно было настраивать при помощи перемычек или DIP-переключателей на материнской плате. Изначально линейка включала в себя модели на 20, 25 и 33 МГц (позже она была дополнена моделями на 40 и 50 МГц). Пользователи получили возможность разгона, не требующего пайки и замены кварцевого генератора.

Кроме того, можно было добиться производительности уровня DX2-66 (стоившего 799 долларов), купив за 400 долларов 486DX2-40 и повысив его стандартную скорость шины с 20 МГц до 33 МГц.

Из-за проблем со стабильностью и слотом VLB при скоростях шины выше 33 МГц возможностти разгона снижались с повышением базовой частоты; вплоть до того, что многие Intel DX2-66 вообще не разгонялись, а некоторые были часто ограничены только 80 мегагерцами (2 x 40 МГц).

Intel Celeron 300A



Дата выпуска: 24 августа 1998 года

Стандартная тактовая частота: 300 МГц

Разгон: 375 504 МГц (~55%)

Считается, что оверклокинг получил огромную популярность в конце 90-х благодаря простоте разгона легендарного Celeron 300A. Чтобы разогнать его на 50% до 450 МГц, достаточно было просто изменить скорость шины с номинальных 66 МГц на 100 МГц. Хотя максимальная частота некоторых материнских плат составляла 83,3 МГц, ограничивая оверклокинг 375 мегагерцами, платы с поддержкой системной шины (FSB) на 103 МГц позволяли получить 464 МГц.

Самые качественные чипы при повышении напряжения могли работать на частоте FSB 112 МГц, обеспечивая частоту процессора 504 МГц. Примечательно, что 300A обычно мог достигать 450 МГц без дополнительных требований к напряжению, на номинальных 2,0 В. Производительности чипа также способствовал расположенный на кристалле кэш L2, а при цене 149 долларов он был особенно удобен для сборщиков систем.

AMD Athlon 700 (Thunderbird) / Duron 600 (Spitfire)



Дата выпуска: 5 июля 2000 года (Athlon 700) / 19 июня 2000 года (Duron 600)

Стандартная тактовая частота: 700 МГц/ 600 МГц

Разгон: 770 900 МГц (~12%) / 800 1000MHz (~59%)

Карандашный мод AMD Thunderbird стал воплощением мечты оверклокера. AMD заблокировала напряжение и множители линейки K7, пытаясь воспрепятствовать мошеннической перемаркировке процессоров. Оверклокеры быстро разобрались, что ключом к разблокированию производительности являются перемычки платы, встроенные в корпус.

Изначально сочетание соединительных перемычек в блоках L3, L4 и L6 позволяло замыкать соединения L1 для разблокировки множителя. Также можно было замыкать соединения блока L7 для изменения напряжения ядра, и для осуществления этого процесса достаточно было мягкого графитного карандаша или ручки, наносящей токопроводящие дорожки.

Поскольку системная шина AMD EV6 была чувствительна к разгону, оверклокинг множителя обеспечивали широкие возможности только в линейке Duron благодаря её пониженному напряжению ядра (1,5 В вместо 1,7 /1,75 В), что позволяло добиться большего относительного повышения до максимально допустимых 1,85 В.

При стоимости всего 112 долларов Duron 600 за несколько минут легко можно было приблизить по производительности к процессору, многократно превосходящему его по цене.

Intel Core 2 Quad Q6600 G0 Revision



Дата выпуска: 8 января 2007 года (версия B0)/ 22 июля 2007 года (версия G0)

Стандартная тактовая частота: 2,4 ГГц

Разгон: 3,4 3,6 ГГц (~46%)

Core 2 Quad Q6600 достиг завидного рекорда срока жизни и производительности, став выбором де-факто для оверклокеров, стремившихся приобрести бюджетный четырёхъядерный CPU. С января 2007 года его первоначальная цена (851 доллар) быстро падала, и в мае достигла 530 долларов; дальнейшая реструктуризация цен в июле совпала по времени с выпуском версии G0. При цене в 266 долларов 2,4-гигагерцовый четырёхъядерный чип сравнялся по стоимости с новым двухъядерным 3-гигагерцовым E6850, частоту которого смог с лёгкостью превзойти Q6600 более ранней версии B3.

Новая версия G0 обеспечивала чуть меньшее энергопотребление, что вылилось в улучшение возможностей разгона. Благодаря этому многие пользователи смогли почти без усилий добиться стабильных 3,4 3,6 ГГц. Появление доступной платформы Intel P35 и дальнейшее снижение цены Q6600 на протяжении всего 2008 года с 224 долларов (в апреле) до 183 долларов (в октябре) предоставило возможность надёжного разгона в пределах 50% (множитель 9x и системная шина 400 МГц давали 3,6 ГГц) при вполне умеренных затратах. Эта модель оставалась очень конкурентоспособной ещё долго после того, как многие современные ей процессоры потеряли свою популярность.

Intel Pentium III 500E



Дата выпуска: 25 октября 1999 года

Стандартная тактовая частота: 500 МГц

Разгон: 667 775 МГц (~50%)

Причинами разгоняемости Coppermine Pentium III 500E и 550E были биннинг процессоров компанией Intel с запасом, низкая частота системной шины (100 МГц) и интегрированный кэш L2. Бюджетные цены (239 долларов) и возможность использования старых материнских плат со Slot 1 благодаря переходникам с Socket 370 на Slot 1 обеспечивали замечательную производительность при скромных затратах.

500E запросто мог работать на 667 МГц после выбора в BIOS частоты системной шины 133 МГц или после изолирования изолентой или лаком контакта A14 переходника Slocket. На более дорогих платах можно было достичь 750 МГц (FSB 150 МГц) и выше, получив аналог производительности Pentium III 800, стоившего 850 долларов.

Однако при разгоне существовали некоторые особенности, например, материнские платы должны были поддерживать делители тактовых частот AGP и PCI (соответственно, 1:2 и 1:4) для обеспечения стабильности установленных компонентов и быстрой PC133 RAM.

AMD Athlon XP-M 2500+ (Barton Mainstream 45W TDP)



Дата выпуска: 12 марта 2003 года

Стандартная тактовая частота: 1,87 ГГц

Разгон: 2,4 2,7 ГГц (~32%)

В начале 2004 года сообщество оверклокеров обратило внимание на тот факт, что в мобильных процессорах Barton есть разлоченный множитель тактовой частоты; кроме того, они предназначены для работы при пониженном напряжении (1,45 В по сравнению с десктопными 1,65 В). Эти факторы часто обеспечивали феноменальные возможности для разгона, которых не хватало в десктопных моделях.

Когда широкой публике стал известен потенциал оверклокинга этого чипа, его цена за считанные недели поднялась с изначальных 75 долларов на 30%. На надёжной материнской плате nForce2 с хорошим охлаждением при повышении напряжения до 1,8 В и выше часто можно было достичь разгона до 30-40%. Несмотря на то, что такой впечатляющий рост не позволял ликвидировать разницу в производительности с новыми Athlon 64, модель Athlon XP-M 2500+ всё-таки не стоила от 200 до 400 долларов.

AMD Opteron 144 / 146 (K8 Venus)



Дата выпуска: 2 августа 2005 года

Стандартная тактовая частота: 1,8 ГГц / 2,0 ГГц

Разгон: 2,5 3,0 ГГц (~63%)

Имея тот же кремний, что и производимые в Сан-Диего процессоры Athlon 64, модели Opteron для Socket 939 стоимостью 125 и 183 доллара обладали серьёзным ценовым преимуществом по сравнению с имеющим схожие характеристики Athlon 64 3700+ (329 долларов) и ещё лучше проявляли себя на фоне FX-57 за 1000 долларов.

Как и у всех процессоров с залоченным от повышения множителем, способность Opteron к разгону была непосредственно связана с мощью выбранной материнской платы. Биннинг серверных чипов Opteron с запасом в сочетании с надёжной платой для оверклокинга, например, на чипсете nForce4 и частотами HyperTransport, достигающими (и превосходящими) 300MT/с, позволяли добиться разгона, редко обеспечиваемого процессорами корпоративного класса.

При том, что все модели Opteron имели приблизительно одинаковый потолок разгона, самые дешёвые чипы за 144 долларов быстро были раскуплены во многих странах.

Intel Core i7 2600K / Core i5 2500K



Дата выпуска: 9 января 2011 года

Стандартная тактовая частота: 3,4 ГГц (Turbo 3,8 ГГц) / 3,3 ГГц (Turbo 3,7 ГГц)

Разгон: 4,6 5,0 ГГц (~49%)

Когда Intel объявила об ограничении верхнего множителя частоты и о почти отсутствующих возможностях разгона системной шины в новых чипсетах Cougar Point, совместимых с Sandy Bridge, большинство пользователей посчитали это концом оверклокинга для платформ Intel. Однако на самом деле модели 2500K и 2600K оказались идеальными для разгона, позволяя с минимальными затратами времени и улучшением охлаждения добиться стабильного оверклокинга на 30-50%.

Популярность 2600K была такой, что результаты разгона этого процессора в 2011 году составляли 28% от всех опубликованных на сайте HWBot, а в 2012 году превосходили по количеству результатов его потомка, 3770K. Благодаря низкой цене (всего 216 долларов) плюс хорошим возможностям воздушного или водяного охлаждения Intel 2500K стал стандартом де-факто для оценки всех CPU потребительского уровня.

Intel Core i7 920



Дата выпуска: 17 ноября 2008 года

Стандартная тактовая частота: 2,67 ГГц (Turbo 2,93 ГГц)

Разгон: 3,5 4,0 ГГц в версии C0, 3,8 4,2 ГГц в версии D0 (~58%)

Новая архитектура Nehalem и платформа X58 казались достаточно привлекательными, чтобы привлечь многих пользователей долгоживущих систем Core 2 LGA 775. Хотя флагман i7 965 EE при цене 1 000 долларов был на треть дешевле Core 2 QX9770, он всё равно был менее актуальным, чем i7 920.

Первые процессоры Bloomfield версии C0 требовали высоких напряжений при частотах выше 3,6 ГГц, а следующая версия D0 часто имела возможность сохранять номинальное напряжение 1,26 В вплоть до 4 ГГц и достигать абсолютного потолка разгона почти в 4,5 ГГц, если пользователь пробовал повысить напряжение до 1,5 В.

Популярность 920 была (и остаётся) такой, что отчёты о его разгоне составляют треть от общего количества результатов процессоров LGA 1366.

Intel Pentium 4 1.6A / Celeron 2.0 (Northwood)



Дата выпуска: 7 января 2002 года (Pentium 4) / 18 сентября 2002 года (Celeron 2.0)

Стандартная тактовая частота: 1,6 ГГц / 2,0 ГГц

Разгон: 2,4 2,8 ГГц (~48%) / 2,66 3 ГГц (~46%)

Появление ядра Northwood было долгожданным событием после разочаровавшего Williamette, высокое напряжение и тепловыделение которого препятствовал массовому оверклокингу. Хотя P4 с увеличенной тактовой частотой имели малую ценность по сравнению с XP, модель 1.6A с ценой 125 долларов превратила дефицит производительности в выгоду благодаря низкой базовой частоте системной шины (100 МГц), которую можно было легко поднять до 150 МГц и получить скорость 2,4 ГГц.

Разгон Celeron благодаря множителю 20x всё равно был выше, хотя производительность серьёзно ограничивал скромный кэш L2 объёмом всего 128 КБ. Тем, кто стремился к усиленному разгону, необходимо было поднять напряжение выше 1,6 В или через BIOS, или проводным модом (соединив контакты CPU для повышения предела Vcore). Последний способ был основной причиной явления под названием S.N.D.S. (Sudden Northwood Death Syndrome, синдром внезапной смерти Northwood), более известного как электроперенос.

Этот фактор, а также то, что 1.6A вредила продажам дорогих моделей Intel, заставило компанию прекратить продажи 1.6A всего шесть месяцев спустя после его выпуска в январе 2002 года.

Intel Xeon LV 1.6 D1 revision (Prestonia)



Дата выпуска: сентябрь 2003 года

Стандартная тактовая частота: 1,6 ГГц

Разгон: 2,6 3,2 ГГц (~63%)

Чаще всего разгон ассоциируется с игровыми системами, однако больше десятка лет большую популярность имел двухпроцессорный разгон. Задолго до того, как QX9775 и плата Intel Skulltrail стали синонимами производительности, многие фанаты охотились за бюджетными Xeon LV 1.6.

По сути, ядро Prestonia являлось процессором Pentium 4 Northwood, в который в качестве стандартных функций были добавлены SMP (симметричная многопроцессорная обработка данных) и HyperThreading. Хотя 1,6-гигагерцовый Xeon ценой всего 200 долларов потреблял многообещающие 1,274 В, оверклокеры обычно не могли воспользоваться возможностью повышения напряжения, поскольку большинство плат имели её блокировку. Однако простым повышением частоты системной шины можно было получить 2,6 ГГц.

Если пользователь был больше склонен к авантюрам, он мог воспользоваться тремя аппаратными модами и получить разгон на 100% (или даже больше!): модом U-Wire, при котором соединялись два (1,5 В) или три (1,6 В) набора контактов сокета, модом BSEL, изолирующим или размыкающим контакты CPU, повышая при этом предел FSB до 200 МГц, или модом vDIMM, повышающим напряжение ОЗУ.

Тех, кто пожелал расширить пределы технологий, ждала награда в виде 3,2-гигагерцовой производительности сдвоенных процессоров примерно за 700 долларов (общая стоимость процессоров, кулеров, платы и ОЗУ).

AMD Athlon XP 1700+ (Thoroughbred-B)



Дата выпуска: 10 июня 2002

Стандартная тактовая частота: 1,46 ГГц

Разгон: 2,2 2,5 ГГц (~44%)

Первый Thoroughbred-A представлял собой практически предыдущий Palomino с уменьшенным размером кристалла и в качестве готового продукта довольно сильно разочаровывал. Выпущенный в июне 2002 года AMD Thoroughbred-B был более адаптирован к 130-нанометровому техпроцессу, что отразилось в повышении частот ядра, а также увеличении эффективности, поскольку версия B демонстрировала примечательные возможности разгона при минимальном повышении напряжения или вообще без повышения.

В сочетании с мощной материнской платой на чипсете nForce2 процессор XP 1700+ ценой 60 долларов при стандартном напряжении был способен достичь скорости ядра почти 2 ГГц. С платой на nF2, способной поднимать частоту системной шины выше 200 МГц, возможно было добиться стабильного разгона на 40% при умеренных 1,7 В, что превышало производительность флагмана AMD Athlon XP 2800+ за 397 долларов и создавало угрозу Intel Pentium 4.

Intel Pentium D 820 / D 805



Дата выпуска: 26 мая 2005 года (D 820) / декабрь 2005 (D 805)

Стандартная тактовая частота: 2,8 ГГц / 2,66 ГГц

Разгон: 3,5 4,2 ГГц (~26%)

Pentium D 820 оказался довольно выдающейся аномалией два одиночных ядра в корпусе многочипового модуля по гораздо более низкой цене, чем самый дешёвый двухъядерный AMD Athlon 64 X2 (241 долларов), даже дешевле на 30 долларов, чем одноядерный Athlon 64 3500+. Pentium D 820 обеспечивал умеренную производительность, ни в коей степени не конкурировавшую с двойным Athlon, однако имел приличный потенциал для разгона благодаря разумному напряжению и при наличии хорошей воздушной или водяной системы охлаждения.

Появление Intel D 805 (129 долларов) ещё больше привлекло внимание бюджетных оверклокеров к горячему процессору Netburst. Снижение номинальной частоты системной шины с 200 до 133 МГц компенсировалось множителем 20x процессора D 805, благодаря чему разгон оставался интересным процессом. Для людей с ограниченным бюджетом D 805 в сочетании с платой на 945P и соответствующим ОЗУ обеспечивал производительность, доступную сборкам с процессорами за 500 долларов.

Intel Pentium Dual Core E2140 / E2160



Дата выпуска: 3 июня 2007 года

Стандартная тактовая частота: 1,6 ГГц (E2140) / 1,8 ГГц (E2160)

Разгон: 2,7 3,2 ГГц (~89%) / 2,9 3,5 ГГц (~92%)

Серия E2000 компании Intel стала одновременно сигналом о кончине последнего выжившего Pentium D с NetBurst и о доминировании AMD на бюджетном рынке. Intel вдвое уменьшила кэш L2 серии E4000, а также ослабила производительность системной шиной на 200 МГц (800 FSB). Однако при этом Intel не избавилась от способностей процессора Conroe к разгону.

При стандартных напряжениях и обычном кулере можно было достичь повышения тактовой частоты на 50%, просто подняв скорость шины 300 МГц или на недорогой плате с Intel P965/P35, или на плате с чипсетом Nvidia 650i SLI, который благодаря тому, что не полагался на делители частоты памяти, обеспечивал более широкие возможности настройки.

Купленный с рук воздушный кулер, регулировка напряжения и немного удачи в кремниевой лотерее этого было достаточно, чтобы разогнать процессоры почти на 100%, обеспечив производительность примерно на уровне E6700 при цене в разы меньше.

AMD Phenom II X2 550 Black Edition (Callisto) / X4 955 Black Edition (Deneb)



Дата выпуска: 1 июня 2009 года (X2 550 BE) / 23 апреля 2009 года (X4 955 BE)

Стандартная тактовая частота: 3,1 ГГц / 3,2 ГГц

Разгон: 3,7 3,9 ГГц (~22%)

Выпуск новой версии архитектуры AMD K10.5 в первые месяцы 2009 года стало символом силы компании в нише бюджетных продуктов. Появление процессоров Black Edition также добавило приятное дополнение в виде разлоченного множителя для упрощения разгона.

Хотя в конечном итоге повышение тактовых частот по историческим стандартам было не особо впечатляющим, оно шло рука об руку с действительным ростом производительности, выводившим процессор из тени Core 2 Quad. При цене 100 долларов 550 Black Edition представлял огромную ценность в случае возможности разблокировки двух отключенных ядер (разблокировка четвёртого ядра станет важнейшим выигрышным моментом для X3 720 BE), а чистая производительность 955 BE за 245 доллара гарантировала, что его потенциал может превзойти только более дорогая платформа X58.

Intel Core 2 Duo E6600 (Conroe)



Дата выпуска: 27 июля 2006 года

Стандартная тактовая частота: 2,4 ГГц

Разгон: 3,0 4,0 ГГц (~45%)

На момент выпуска в июле 2006 Intel Conroe основное внимание было привлечено к разблокированному множителю X6800, однако самую важную роль сыграл самый дешёвый полнофункциональный чип (4 МБ кэша L2). Чип при цене 316 долларов стоил на 200 долларов дешевле, чем следующий по производительности (E6700) и обеспечивал результаты, соперничавшие с самыми мощными AMD Athlon 64.

При стандартном охлаждении и напряжении можно было рассчитывать, что E6600 достигнет 2,7-3 ГГц. При покупке более мощного подержанного кулера ограничивающим фактором часто оказывалась стабильность материнской платы, потому что скорости системной шины превосходили 400 МГц и приближались к 450 МГц. Потенциал оверклокинга был настолько велик, что цены X6800 (999 долларов) и Athlon 64 FX-62 (799 долларов) казались очевидно смешными при сравнении с ценой и производительностью E6600.

Intel Core 2 Duo E8400 E0 Revision (Wolfdale-6M)



Дата выпуска: 7 января 2008 года (версия C0)/ 18 июля 2008 года (версия E0)

Стандартная тактовая частота: 3,0 ГГц

Разгон: 4,0 4,5 ГГц (~41%)

Сразу после появления в январе 2008 года версии C0 процессора Wolfdale E8400 он сразу же зарекомендовал себя как доступный процессор с возможностью повышения производительности. Пять месяцев спустя версия E0 обеспечила гораздо более усовершенствованные требования к напряжению. Некоторые E8400 в версии C0 были способны работать на уровне 4 ГГц, а в новой версии той же частоты можно было достичь при стандартном напряжении, параметрах и кулере.

Ко времени выпуска E0 цены на OEM-комплект упали до 149 долларов, а различные многофункциональные платы на P45 и X48 способны были поддерживать скорости шины в пределах 500 МГц (2000 МГц FSB). Сохранение стабильности эти систем с частотой от 4 ГГц и выше стало свидетельством качества как архитектуры, так и чипсетов.



На правах рекламы


Наша компания предлагает в аренду серверы с процессорами от Intel и AMD. В последнем случае это эпичные серверы! VDS с AMD EPYC, частота ядра CPU до 3.4 GHz. Максимальная конфигурация 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.

Подробнее..

Перевод Что общего в работе заводского конвейера и микропроцессора?

26.03.2021 12:06:50 | Автор: admin

Промышленный робот перемещает контейнеры в воображаемом складе. Перемещение соответствует инструкциям микропроцессора, а контейнеры можно трактовать как обрабатываемые данные.

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

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

Мы рассмотрим следующие понятия:

  • Тактовая частота. Как первые процессоры становились быстрее после увеличения тактовой частоты.
  • Параллельное выполнение. Если нельзя выполнить инструкции быстрее, то как насчет параллельного выполнения?
  • Конвейеризация. Предназначена для случаев, когда нельзя увеличить тактовую частоту и количество параллельно выполняющихся задач.

Увеличение тактовой частоты


Компьютер выполняет все через фиксированные промежутки времени, называемые тактами. За один такт процессор выполняет минимальную операцию. Это похоже на периодическое движение шестеренок в механических часах. Между тактами ничего не происходит.

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

Проще всего объяснить на примере склада и робота. Наш робот подбирает контейнеры с одной стороны склада и доставляет на противоположную.


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


Робот занят перемещением оранжевого контейнера до конца линии.

Робота нельзя ускорять до бесконечности, как и электроны. Если мы сделаем один такт слишком коротким, то робот не успеет доставить контейнер и вернуться за выделенное время.

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

Преимущества маленьких микропроцессоров


Если мы не можем сделать робота быстрее, как выполнить работу за меньшее количество времени? В терминах микропроцессоров вопрос звучит так: если мы не можем ускорить электроны, как нам заставить их оказаться в нужном месте быстрее?

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


Перемещение контейнеров на меньшее расстояние происходит быстрее.

Укорачивание длины такта это то же самое, что и увеличение тактовой частоты. Таким образом, уменьшение электроники один из способов увеличить тактовую частоту и добиться большего.

Параллельное выполнение


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

Векторная обработка


Первые суперкомпьютеры, такие как Cray-1, использовали векторные процессоры. В этом случае они пытаются обработать больше данных одновременно. То есть выполняется одна инструкция над несколькими элементами данных одновременно. В нашей аналогии про склад это робот, который может доставлять сразу несколько контейнеров одновременно.


Перемещение нескольких контейнеров одновременно соответствует выполнению одной операции над несколькими фрагментами данных. Именно это и называется векторным выполнением.

Для дополнительного изучения: RISC-V Vector Instructions vs ARM and x86 SIMD.

Несколько микропроцессорных ядер


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


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

Конвейеризация


Наконец, мы добрались до конвейеризации. Что если мы не можем сделать процессор меньше? В параллели со складом это значит, что мы не можем уменьшить расстояние до места, куда контейнер (данные) должен быть доставлен. Мы говорим о перемещении контейнера как об инструкции.

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

Таким образом, мы можем представить сложность инструкции как что-то, что удлиняет путь электронов. Что если мы не уменьшим размер процессора, а снизим сложность каждой инструкции? Если мы упростим каждую инструкцию, ток должен будет проходить через меньшее количество транзисторов. Один из способов сделать это разбить инструкцию на несколько маленьких.


Перемещение контейнера разделено на три шага. Каждый робот переносит контейнер только на треть пути.

Такт 1


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


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

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


Первый такт закончился. Второй робот не готов взять оранжевый контейнер и передвинуть его на вторую треть пути.

Такт 2


Во втором такте второй робот начинает перемещать оранжевый контейнер, а первый робот подбирает желтый контейнер. Обратите внимание, что сотрудники склада добавили зеленый контейнер.


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

Когда второй такт завершен, оранжевый контейнер лежит перед третьим роботом. Второй робот может подобрать желтый контейнер. А третий робот подберет новый зеленый контейнер.


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

Такт 3


На третьем такте все роботы двигаются синхронно, перемещая контейнеры на шаг вперед. Стоит немного поразмыслить о том, что здесь происходит. Время, необходимое для перемещения контейнера от начала до конца, практически не изменилось. Представьте, что одному роботу на перемещение от начала до конца требуется 30 секунд. Теперь перемещение контейнера занимает 10 секунд, но нужно три шага, а значит, общее время осталось неизменным.


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

Итак, что мы здесь получили? Преимущество заключается в том, что каждые 10 секунд мы доставляем один контейнер. Мы сокращаем время, которое контейнер проводит в ожидании робота.

Преимущества и проблемы конвейеризации


Мы можем описать это двумя важными концепциями.

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

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

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

RISC и CISC


Эта причина, по которой ранние процессоры RISC, такие как MIPS и SPARC, используемые на рабочих станциях Unix в 1990-х годах, были быстрее, чем их аналоги на x86. CISC-процессоры не учитывали конвейеризацию при проектировании, в отличие от RISC. Инструкции RISC разделены на четыре логических шага. Это позволяет построить конвейер на четыре шага. Получается, RISC-инструкция требует четыре такта на исполнение, но каждый такт завершается выполнением одной инструкции.

Дополнительное чтение: What Does RISC and CISC Mean in 2020?

Intel поняла, что нужно найти способ конвейеризации сложных инструкций переменной длины. Так были созданы микрооперации. Они разбивали сложные инструкции на несколько микроопераций, которые были достаточно простыми, чтобы работать в конвейере.

Дополнительное чтение: What the Heck is a Micro-Operation?

Дальнейшее развитие конвейеризации


Intel начала разделять свои инструкции на все меньшие части, что позволило компании резко увеличить тактовую частоту процессоров. Так, например, Pentium 4 имел зверскую частоту. Это сделало конвейеры Intel очень длинными.

И здесь мы сталкиваемся с вещью, о которой еще не упоминали, с ветвлением. Можно заметить, что инструкции не приходят в виде одного бесконечного предсказуемого линейного потока. Реальные программы принимают решения и выполняют повторения. Некоторые инструкции повторяются снова и снова. Различные типы данных обрабатываются разными инструкциями. Следовательно, в реальных программах есть условные переходы. Проверяется некоторое условие, а затем на его основе микропроцессор выполняет переход в коде.

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

Таким образом, нужно очистить конвейер и ждать еще сто тактов, прежде чем другие инструкции заполнят конвейер до конца. Это большой удар по производительности.

Вот почему у Apple были слайды со сравнением RISC-чипов PowerPC, которые они использовали до 2006 года, с процессорами Intel Pentium. Процессор Pentium имел более высокую тактовую частоту, но и гораздо более длинный конвейер. Тогда люди считали тактовую частоту эквивалентом производительности. Как вы видим, эти термины связаны, но это не совсем одно и то же.

Процессоры Pentium часто очищали очень длинные конвейеры, что сильно снижало производительность. Между тем, чипы PowerPC имели более низкую тактовую частоту, но гораздо более короткие конвейеры, что приводило к значительно меньшему падению производительности из-за условных переходов.

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

Но это, вероятно, будет темой следующей технической статьи.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru